ansible
Ansible: Loops e Conditionals
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 .