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 .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow