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 02:54] – [2.12 Esenciales] 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 44: | Línia 45: | ||
* check_mode: [True|False] -> simulación | * check_mode: [True|False] -> simulación | ||
- | == 2.13 Ansible Playbook | + | == 2.13 ansible-playbook |
+ | '' | ||
+ | * opciones: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
== 2.14 Variables | == 2.14 Variables | ||
+ | * dinamización de tareas | ||
+ | * pueden ser definidas en: | ||
+ | * **facts** : obtenidos del servidor (sobre el que aplicamos la configuración) | ||
+ | * **playbook** | ||
+ | * **línea de comandos** : '' | ||
+ | * se pueden usar en: | ||
+ | * tareas | ||
+ | * plantillas (lógica) | ||
+ | * otros (condiciones, | ||
+ | * uso: | ||
+ | |||
+ | === ejemplo | ||
+ | template sencillo, definimos una variable propia y las otras dos las da el propio servidor | ||
+ | <code yaml; hosts.j2> | ||
+ | {{ miip }} {{ ansible_hostname}} {{ ansible_fqdn }} | ||
+ | </ | ||
+ | <code yaml; playbook.yml> | ||
+ | - name: crear ficher usando variables | ||
+ | hosts: localhost | ||
+ | connection: local | ||
+ | vars: | ||
+ | - miip: " | ||
+ | tasks: | ||
+ | - name: Crear fichero hosts | ||
+ | template: src=hosts.j2 dest=/ | ||
+ | </ | ||
+ | <code bash; ejecución> | ||
+ | ansible-playbook playbook.yml | ||
+ | # el módulo template se encarga de buscar el fichero que necesita y hacer las sustituciones | ||
+ | </ | ||
+ | <code bash; lista de variables disponibles en el server> | ||
+ | ansible localhost -m setup | grep -e ansible_hostname -e ansible_fqdn | ||
+ | </ | ||
+ | <code bash; sobreescribiendo las variables del playbook> | ||
+ | ansible-playbook -e miip=" | ||
+ | </ | ||
+ | |||
== 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 | ||