Ricerca…


Osservazioni

I documenti ufficiali spiegano i condizionali del playbook.

Ansible (github)

Che tipo di condizionali usare?

Usa condizionali tramite (la sintassi è in [brackets] ):

  • quando [ quando: ]

    Task:
       - name: run if operating system is debian
         command: echo "I am a Debian Computer"
         when: ansible_os_family == "Debian"
    
  • loop [ with_items: ]

  • loop [ with_dicts: ]

  • Fatti personalizzati [ quando: my_custom_facts == '1234']

  • Importazioni condizionali

  • Seleziona file e modelli in base a variabili

[Quando] Condizione: Elenchi di `ansible_os_family`

Uso comune

  • quando: ansible_os_family == "CentOS"
  • quando: ansible_os_family == "Redhat"
  • quando: ansible_os_family == "Darwin"
  • quando: ansible_os_family == "Debian"
  • quando: ansible_os_family == "Windows"

Tutte le liste

basato sulla discussione qui 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'
        )

Quando condizione

Uso di base

Utilizzare la condizione when per controllare se un'attività o un ruolo viene eseguito o saltato. Questo è normalmente usato per cambiare il comportamento di gioco in base ai fatti del sistema di destinazione. Considera questo libro di esercizi:

- hosts: all
  tasks:
    - include: Ubuntu.yml
      when: ansible_os_family == "Ubuntu"
    
    - include: RHEL.yml
      when: ansible_os_family == "RedHat"

Dove Ubuntu.yml e RHEL.yml includono una logica specifica della distribuzione.

Un altro uso comune è limitare i risultati a quelli di determinati gruppi di inventario Ansible. Considera questo file di inventario:

[dbs]
mydb01

[webservers]
myweb01

E questo libro di esercizi:

- hosts: all
  tasks:
    - name: Restart Apache on webservers
      become: yes
      service:
        name: apache2
        state: restarted
      when: webservers in group_names

Questo sta usando la variabile magica group_names .

Sintassi e logica condizionale

Condizione singola

Sintassi

when: (condition)

Esempio

  • when: ansible_os_family == "Debian"
  • when: ansible_pkg_mgr == "apt"
  • when: myvariablename is defined

Filtro booleano

Esempio

when: result|failed

Condizioni multiple

Sintassi

When: condition1 and/or condition2

Esempio (semplice)

when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"

Esempio (complesso)

Usa le parentesi per chiarezza o per controllare la precedenza. "AND" ha una precedenza più alta di "OR".

Le clausole possono estendersi su righe:

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', '>=')

Notare l'uso delle parentesi per raggruppare "o" nel primo controllo di distribuzione.

Ottieni `ansible_os_family` e` ansible_pkg_mgr` con setup

Possiamo ottenere fatti ( ansible_os_family , ansible_pkg_mgr ) con il comando Ad-Hoc del modulo di configurazione e del 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
      }
    

Semplice "Quando" Esempio / i

Dato:

---
variable_name: True

Quindi, queste attività funzionano sempre.

- 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

Questa attività non verrà mai eseguita.

- name: This is a conditional task
  module: src=/example/ dest=/example
  when: False

Utilizzare fino a quando non si verifica un controllo di loop in loop

Questo è un esempio di utilizzo fino a / tentativi / ritardo per implementare un controllo vivo per una webapp che si sta avviando. Si presume che ci sarà un periodo di tempo (fino a 3 minuti) in cui la webapp rifiuta le connessioni socket. Successivamente, controlla la pagina / alive per la parola "OK". Delega anche il recupero dell'URL sul localhost in esecuzione ansible. Questo ha senso come compito finale in un playbook di implementazione.

---
- 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

Il modello fino a nuovo tentativo può essere utilizzato con qualsiasi azione; La documentazione di Ansible fornisce un esempio di attesa fino a quando un certo comando di shell restituisce il risultato desiderato: http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow