Diferències
Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
| info:cursos:udemy:ansible:playbooks [07/09/2018 03:53] – [2.14 Variables] mate | info:cursos:udemy:ansible:playbooks [19/09/2018 00:54] (actual) – [2.11 introducción Playbooks] mate | ||
|---|---|---|---|
| Línia 16: | Línia 16: | ||
| * cada guión es un playbook, puede haber varios en un fichero | * cada guión es un playbook, puede haber varios en un fichero | ||
| * **name** es opcional, pero recomendado | * **name** es opcional, pero recomendado | ||
| - | * '' | + | * '' |
| == 2.12 Esenciales | == 2.12 Esenciales | ||
| * hosts: lista de servidores a administrar (grupos o servidores) | * hosts: lista de servidores a administrar (grupos o servidores) | ||
| - | * si se quieren separar, usar **:** | + | * si se quieren separar, usar **%%:%%** |
| * se puede usar **&** para que estén en 2 grupos a la vez | * se puede usar **&** para que estén en 2 grupos a la vez | ||
| * se puede usar **!** | * se puede usar **!** | ||
| + | |||
| <code yaml> | <code yaml> | ||
| hosts: serweb # un grupo, afecta a todas las máquinas | hosts: serweb # un grupo, afecta a todas las máquinas | ||
| Línia 53: | Línia 54: | ||
| * '' | * '' | ||
| * '' | * '' | ||
| - | * '' | + | * '' |
| * '' | * '' | ||
| Línia 98: | Línia 99: | ||
| == 2.15 Sintaxis | == 2.15 Sintaxis | ||
| + | * formato YAML: | ||
| + | * simplifica definición playbooks | ||
| + | * diferentes opciones para mejorar la legbilidad | ||
| + | |||
| + | === ejemplos | ||
| + | * partir línea de configuración larga: | ||
| + | <code yaml; ejemplo línea larga> | ||
| + | - name: copiar fichero | ||
| + | copy: src=/ | ||
| + | <code yaml; ejemplo mejorado> | ||
| + | - name: copiar fichero | ||
| + | copy: | ||
| + | src: /etc/hosts | ||
| + | dest: /etc/hosts | ||
| + | owner: root | ||
| + | group: root | ||
| + | mode: 0644</ | ||
| + | * definir lista de variables: | ||
| + | <code yaml; lista de variables> | ||
| + | - instalar: | ||
| + | - apache | ||
| + | - php5 | ||
| + | - mariadb | ||
| + | - instalar: [" | ||
| + | </ | ||
| + | * definir diccionario: | ||
| + | <code yaml; diccionario> | ||
| + | - instalar: | ||
| + | web: apache2 | ||
| + | bd: mariadb | ||
| + | script: php5 | ||
| + | -instalar: {web:" | ||
| + | </ | ||
| + | para hacer referencia, se usará '' | ||
| + | * texto / líneas de texto largas | ||
| + | <code yaml; texto largo> | ||
| + | - texto_largo: | ||
| + | primera linea | ||
| + | segunda linea | ||
| + | - linea_larga: | ||
| + | primera parte | ||
| + | segunda parte | ||
| + | </ | ||
| + | * módulo **debug** : muestra un texto o un valor de una variable | ||
| + | <code yaml; debug> | ||
| + | - debug: var=miip | ||
| + | - debug: var=texto_largo | ||
| + | - debug: linea_larga | ||
| + | - debug: instalar.web | ||
| + | </ | ||
| + | |||
| + | |||
| == 2.16 Handlers | == 2.16 Handlers | ||
| + | es una tarea que se ejecuta solo cuando la llama otra tarea | ||
| + | <code yaml> | ||
| + | - tasks: | ||
| + | - name: configurar sshd.config | ||
| + | copy: src=sshd_config dest=/ | ||
| + | notify: reiniciar_sshd | ||
| + | - handlers: | ||
| + | - name: reinicar_sshd | ||
| + | service: name=sshd state=restarted | ||
| + | </ | ||
| + | los **handlers** se ejecutan al final de las tareas del **playbook** | ||
| == 2.17 Include y Roles | == 2.17 Include y Roles | ||
| + | === include | ||
| + | * dividir el distintas partes para facilitar edición y tratado | ||
| + | * **include** permite añadir otro fichero que contiene un playbook o una tarea | ||
| + | ==== ejemplos | ||
| + | * inclusión de una tarea:< | ||
| + | - name: primer playbook | ||
| + | hosts: servweb | ||
| + | tasks: | ||
| + | - name: tarea de este fichero | ||
| + | apt: name=apache2 state=latest | ||
| + | - include: otra_tarea.yml | ||
| + | </ | ||
| + | <code yaml; otra_tarea.yml> | ||
| + | - name: tarea en fichero anexo | ||
| + | service: name=nombre state=started | ||
| + | </ | ||
| + | * inclusión de otro playbook:< | ||
| + | - name: primer playbook | ||
| + | hosts: servweb | ||
| + | tasks: | ||
| + | - name: tarea de este fichero | ||
| + | apt: name=apache2 state=latest | ||
| + | - name: Segundo playbook | ||
| + | include: segundo_playbook.yml | ||
| + | </ | ||
| + | <code yaml; segundo_playbook.yml> | ||
| + | - hosts: servweb | ||
| + | tasks: | ||
| + | - name: tarea de este fichero | ||
| + | apt: name=vim state=latest | ||
| + | </ | ||
| + | |||
| + | === roles | ||
| + | * estructura de ficheros y directorios para separar los elementos | ||
| + | * permite ser reusados facilmente | ||
| + | * es posible descargar roles predefinidos : Ansible Galaxy | ||
| + | * roles/ | ||
| + | * < | ||
| + | * files/ | ||
| + | * templates/ | ||
| + | * tasks/ | ||
| + | * handlers/ | ||
| + | * vars/ | ||
| + | * defaults/ | ||
| + | * meta/ | ||
| + | * uso en el playbook:< | ||
| + | - roles: | ||
| + | - rol1 | ||
| + | - rol2 | ||
| + | </ | ||
| + | <code yaml; paso de variables> | ||
| + | - roles: | ||
| + | - {role: rol1, clave: valor} | ||
| + | - rol2 | ||
| + | </ | ||
| == 2.18 Templates | == 2.18 Templates | ||
| + | * instrucciones en tamplates: | ||
| + | * expresiones: | ||
| + | * control: {% ... %} | ||
| + | * condicional:< | ||
| + | si se cumple la condición | ||
| + | {% endif %}</ | ||
| + | * bucle:< | ||
| + | {{ usuario }} | ||
| + | {% endfor %}</ | ||
| + | lista_usuarios: | ||
| + | </ | ||
| + | roles: | ||
| + | - { role: apache2, lista_usuarios: | ||
| + | </ | ||
| + | * comentarios: | ||
| == 2.19 Prioridad variables | == 2.19 Prioridad variables | ||
| + | en orden de menos a mas | ||
| + | - **Defaults** dentro de un **rol** | ||
| + | - variables de grupo (inventario-> | ||
| + | - variables de servidor (inventario-> | ||
| + | - **facts** del servidor | ||
| + | - variables del **playbook** (-> | ||
| + | - variables del **rol** (definidas en / | ||
| + | - variables de bloque -> variables de tareas | ||
| + | - parámetros **rol** -> include_parvars -> include_vars | ||
| + | - set_facts / registered_vars | ||
| + | - extra vars -> '' | ||
| == 2.20 Condiciones | == 2.20 Condiciones | ||
| + | se puede condicionar: | ||
| + | * ejecución de una tarea | ||
| + | * inclusión de un fichero | ||
| + | * el uso de un rol | ||
| + | usando la expresión '' | ||
| + | |||
| + | <code yaml> | ||
| + | - name: instalar apache2 | ||
| + | apt: name=apache2 state=latest | ||
| + | when: ansible_distribution == " | ||
| + | </ | ||
| + | |||
| + | <code yaml> | ||
| + | - name: instalar apache2 | ||
| + | apt: name=apache2 state=latest | ||
| + | when: ansible_distribution == " | ||
| + | </ | ||
| + | |||
| + | <code yaml; | ||
| + | - name: Instalar apache2 | ||
| + | include: instalar-apache2.yml | ||
| + | when: ansible_distribution == " | ||
| + | | ||
| + | - name: Instalar httpd | ||
| + | include: instalar-httpd.yml | ||
| + | when: ansible_distribution == " | ||
| + | </ | ||
| + | |||
| + | <code yaml; filtrado a través de rol> | ||
| + | - { role: apache2, when: ansible_distribution == " | ||
| + | - { role: apache2, when: ansible_distribution == " | ||
| + | </ | ||
| == 2.21 Bucles | == 2.21 Bucles | ||
| + | ya vimos como usarlo en las plantillas () | ||
| + | ahora en tareas (palabra clave): '' | ||
| + | |||
| + | <code yaml; listas> | ||
| + | - name: Instalar soft necesario | ||
| + | apt: name={{ item }} state=latest | ||
| + | with_items: | ||
| + | - mariadb | ||
| + | - php5 | ||
| + | - phpmyadmin | ||
| + | </ | ||
| + | |||
| + | <code yaml; diccionarios> | ||
| + | - name: Crear usuarios | ||
| + | user: name={{ item.nombre }} state=present groups={{ item.grupo }} | ||
| + | with_items: | ||
| + | - {nombre: usuario1, grupo: www-data} | ||
| + | - {nombre: usuario2, grupo: www-data} | ||
| + | </ | ||
| + | |||
| + | <code yaml; con variables (en roles/< | ||
| + | - name: Instalar paquetes | ||
| + | apt: {{ item }} | ||
| + | with_items: "{{ lista_paquetes }}" | ||
| + | - name: Crar usuarios | ||
| + | user: {{ item }} | ||
| + | with_items: "{{ dic_usuarios }}" | ||
| + | </ | ||
| + | <code yaml; variables en main.yml> | ||
| + | lista_paquetes: | ||
| + | dic_usuarios: | ||
| + | - {nombre: " | ||
| + | - {nombre: " | ||
| + | </ | ||
| == 2.22 Register | == 2.22 Register | ||
| + | '' | ||
| + | |||
| + | <code yaml> | ||
| + | - name: ejecutar comando | ||
| + | command: uptime | ||
| + | register: salida_uptime | ||
| + | | ||
| + | - name: mostrar uptime | ||
| + | debug: var=salida[.stdout] | ||
| + | </ | ||
| + | |||
| + | los valores devueltos son: | ||
| + | * changed | ||
| + | * failed | ||
| + | * skipped | ||
| + | * rc | ||
| + | * == 0 -> OK | ||
| + | * != 0 -> KO | ||
| + | * stdout / stderr / stdout_lines / stderr_lines | ||
| + | * en lines se podría rehusar como bucle | ||
| + | y se pueden usar esos estados para filtrar la ejecución de otras tareas | ||
| + | |||
| + | <code yaml; solo ejecutará la segunda tarea si ha habído un changed en la primera> | ||
| + | - name: copiar fichero index.html | ||
| + | template: src=index.html.j2 dest=/ | ||
| + | register: out_copia | ||
| + | | ||
| + | - name: mostrar contenido | ||
| + | command: cat / | ||
| + | register: out_salida | ||
| + | when: out_copia|changed | ||
| + | | ||
| + | - debug: var=out_copia.stdout | ||
| + | when: out_copia|changed | ||
| + | | ||
| + | </ | ||
| == 2.23 Ignore Errors | == 2.23 Ignore Errors | ||
| + | las tareas erróneas paran el playbook, usando '' | ||
| + | |||
| + | <code yaml> | ||
| + | - name: comprobar si fichero existe | ||
| + | command: ls / | ||
| + | registar: existe | ||
| + | ignore_errors = true | ||
| + | | ||
| + | - name: mostrar errores | ||
| + | debug: var=existe.stderr_lines | ||
| + | | ||
| + | </ | ||
| + | |||
| + | se puede usar a nivel de tarea o de playbook <- CUIDADO! todos los errores serán ignorados | ||
| + | |||
| + | se pueden usar condicionales '' | ||
| + | <code yaml> | ||
| + | - name: mostrar salida | ||
| + | debug: var=existe.stdout_lines | ||
| + | when: not salida|failed | ||
| + | [ when: salida|failed != False ] # expresión equivalente | ||
| + | | ||
| + | - name: mostrar errores | ||
| + | debug: var=existe.stderr_lines | ||
| + | when: salida|failed | ||
| + | </ | ||
| == 2.24 Failed When | == 2.24 Failed When | ||
| + | '' | ||
| + | |||
| + | un comando es marcado como erróneo si su **rc** (return code) es != 0 -> '' | ||
| + | |||
| + | <code yaml; siempre retornará changed> | ||
| + | - name: ejecutar comando | ||
| + | command: ip a | ||
| + | </ | ||
| + | |||
| + | <code yaml; da error si no existe la interfaz eth2> | ||
| + | - name: ejecutar comando | ||
| + | command: ip a | ||
| + | register: salida | ||
| + | failed_when: | ||
| + | </ | ||
| + | |||
| + | <code yaml; no la marca como cambiada> | ||
| + | - name: no marcar nunca como cambiado | ||
| + | command: uptime | ||
| + | changed_when: | ||
| + | </ | ||
| + | se pueden combinar en la misma tarea juntas | ||