ansible
Ansible: Bucles y Condicionales
Buscar..
Observaciones
Los documentos oficiales explican los condicionales del playbook.
Ansible (github)
¿Qué tipo de condicionales usar?
Use Conditionals via (la sintaxis está entre [brackets]
):
cuando [ cuando: ]
Task: - name: run if operating system is debian command: echo "I am a Debian Computer" when: ansible_os_family == "Debian"
bucles [ with_items: ]
bucles [ with_dicts: ]
Datos personalizados [ cuando: my_custom_facts == '1234']
Importaciones condicionales
Seleccionar archivos y plantillas basados en variables
[Cuando] Condición: `ansible_os_family` Listas
Uso común
- cuando: ansible_os_family == "CentOS"
- cuando: ansible_os_family == "Redhat"
- cuando: ansible_os_family == "Darwin"
- cuando: ansible_os_family == "Debian"
- cuando: ansible_os_family == "Windows"
Todas las listas
basado en discutir aquí http://comments.gmane.org/gmane.comp.sysutils.ansible/4685
OS_FAMILY = dict(
RedHat = 'RedHat',
Fedora = 'RedHat',
CentOS = 'RedHat',
Scientific = 'RedHat',
SLC = 'RedHat',
Ascendos = 'RedHat',
CloudLinux = 'RedHat',
PSBM = 'RedHat',
OracleLinux = 'RedHat',
OVS = 'RedHat',
OEL = 'RedHat',
Amazon = 'RedHat',
XenServer = 'RedHat',
Ubuntu = 'Debian',
Debian = 'Debian',
SLES = 'Suse',
SLED = 'Suse',
OpenSuSE = 'Suse',
SuSE = 'Suse',
Gentoo = 'Gentoo',
Archlinux = 'Archlinux',
Mandriva = 'Mandrake',
Mandrake = 'Mandrake',
Solaris = 'Solaris',
Nexenta = 'Solaris',
OmniOS = 'Solaris',
OpenIndiana = 'Solaris',
SmartOS = 'Solaris',
AIX = 'AIX',
Alpine = 'Alpine',
MacOSX = 'Darwin',
FreeBSD = 'FreeBSD',
HPUX = 'HP-UX'
)
Cuando la condicion
Uso básico
Utilice la condición when para controlar si una tarea o rol se ejecuta o se omite. Esto normalmente se usa para cambiar el comportamiento de juego basado en hechos del sistema de destino. Considera este libro de jugadas:
- hosts: all
tasks:
- include: Ubuntu.yml
when: ansible_os_family == "Ubuntu"
- include: RHEL.yml
when: ansible_os_family == "RedHat"
Donde Ubuntu.yml
y RHEL.yml
incluyen alguna lógica de distribución específica.
Otro uso común es limitar los resultados a aquellos en ciertos grupos de inventario de Ansible. Considere este archivo de inventario:
[dbs]
mydb01
[webservers]
myweb01
Y este libro de jugadas:
- hosts: all
tasks:
- name: Restart Apache on webservers
become: yes
service:
name: apache2
state: restarted
when: webservers in group_names
Esto está usando la variable mágica group_names
.
Sintaxis condicional y lógica
Condicion individual
Sintaxis
when: (condition)
Ejemplo
-
when: ansible_os_family == "Debian"
-
when: ansible_pkg_mgr == "apt"
-
when: myvariablename is defined
Filtro booleano
Ejemplo
when: result|failed
Múltiples condiciones
Sintaxis
When: condition1 and/or condition2
Ejemplo (simple)
when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"
Ejemplo (complejo)
Use paréntesis para mayor claridad o para controlar la precedencia. "Y" tiene una prioridad más alta que "O".
Las cláusulas pueden abarcar líneas:
when:
ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux'] and
(ansible_distribution_version|version_compare('7', '<') or
ansible_distribution_version|version_compare('8', '>='))
or
ansible_distribution == 'Fedora'
or
ansible_distribution == 'Ubuntu' and
ansible_distribution_version|version_compare('15.04', '>=')
Tenga en cuenta el uso de paréntesis para agrupar "o" en la primera comprobación de distribución.
Obtenga `ansible_os_family` y` ansible_pkg_mgr` con la configuración
Podemos obtener datos ( ansible_os_family
, ansible_pkg_mgr
) con el comando Ad-Hoc del módulo de configuración y el filtro.
ansible_os_family:
$ ansible all -m setup -a 'filter=ansible_os_family' ra.local | SUCCESS => { "ansible_facts": { "ansible_os_family": "Debian" }, "changed": false }
ansible_pkg_mgr:
$ ansible all -m setup -a 'filter=ansible_pkg_mgr' debian.local | SUCCESS => { "ansible_facts": { "ansible_pkg_mgr": "apt" }, "changed": false }
Ejemplo (s) simple de "cuándo"
Dado:
---
variable_name: True
Entonces, estas tareas siempre se ejecutan.
- name: This is a conditional task
module: src=/example/ dest=/example
when: variable_name
- name: This is a conditional task
module: src=/example/ dest=/example
when: True
Esta tarea nunca se ejecutará.
- name: This is a conditional task
module: src=/example/ dest=/example
when: False
Usando hasta para un reintento.
Este es un ejemplo del uso de hasta / reintentos / retraso para implementar una comprobación activa de una aplicación web que se está iniciando. Se supone que habrá algún período de tiempo (hasta 3 minutos) en el que la aplicación web rechace las conexiones de socket. Después de eso, comprueba la página / viva de la palabra "Aceptar". También delega la recuperación de la URL al localhost que se ejecuta ansible. Esto tiene sentido como la tarea final en un libro de jugadas de implementación.
---
- hosts: my-hosts
tasks:
- action: uri url=http://{{ ansible_all_ipv4_addresses }}:8080/alive return_content=yes
delegate_to: localhost
register: result
until: "'failed' not in result and result.content.find('OK') != -1"
retries: 18
delay: 10
El patrón hasta reintentar se puede usar con cualquier acción; La documentación ansible proporciona un ejemplo de espera hasta que un determinado comando de shell devuelve un resultado deseado: http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .