ansible
Ansible: Boucles et conditions
Recherche…
Remarques
Les documents officiels expliquent les conditions de jeu.
Ansible (github)
Quels types de conditionnels à utiliser?
Utilisez Conditionals via (la syntaxe est [brackets]
):
quand [ quand: ]
Task: - name: run if operating system is debian command: echo "I am a Debian Computer" when: ansible_os_family == "Debian"
boucles [ with_items: ]
boucles [ with_dicts: ]
Facts personnalisés [ lorsque: my_custom_facts == '1234']
Importations conditionnelles
Sélectionner des fichiers et des modèles en fonction de variables
[When] Condition: Listes 'ansible_os_family`
Usage commun
- quand: ansible_os_family == "CentOS"
- quand: ansible_os_family == "Redhat"
- quand: ansible_os_family == "Darwin"
- quand: ansible_os_family == "Debian"
- quand: ansible_os_family == "Windows"
Toutes les listes
sur la base de discuter ici 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'
)
Quand condition
Utilisation de base
Utilisez la condition when pour contrôler si une tâche ou un rôle s'exécute ou est ignoré. Ceci est normalement utilisé pour modifier le comportement de jeu en fonction des faits du système de destination. Considérez ce playbook:
- hosts: all
tasks:
- include: Ubuntu.yml
when: ansible_os_family == "Ubuntu"
- include: RHEL.yml
when: ansible_os_family == "RedHat"
Où Ubuntu.yml
et RHEL.yml
incluent une logique spécifique à la distribution.
Une autre utilisation courante consiste à limiter les résultats à ceux de certains groupes d'inventaire Ansible. Considérez ce fichier d'inventaire:
[dbs]
mydb01
[webservers]
myweb01
Et ce playbook:
- hosts: all
tasks:
- name: Restart Apache on webservers
become: yes
service:
name: apache2
state: restarted
when: webservers in group_names
Cela utilise la variable magique group_names
.
Syntaxe conditionnelle et logique
Seul état
Syntaxe
when: (condition)
Exemple
-
when: ansible_os_family == "Debian"
-
when: ansible_pkg_mgr == "apt"
-
when: myvariablename is defined
Filtre booléen
Exemple
when: result|failed
Conditions multiples
Syntaxe
When: condition1 and/or condition2
Exemple (simple)
when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"
Exemple (complexe)
Utilisez des parenthèses pour plus de clarté ou pour contrôler la priorité. "ET" a une priorité plus élevée que "OU".
Les clauses peuvent couvrir des lignes:
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', '>=')
Notez l'utilisation des parenthèses pour regrouper le "ou" dans la première vérification de distribution.
Obtenez `ansible_os_family` et` ansible_pkg_mgr` avec la configuration
Nous pouvons obtenir des faits ( ansible_os_family
, ansible_pkg_mgr
) avec la commande Ad-Hoc du module de configuration et du filtre.
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 }
Simple "When" Exemple (s)
Donné:
---
variable_name: True
Ensuite, ces tâches avec toujours exécuter.
- 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
Cette tâche ne fonctionnera jamais.
- name: This is a conditional task
module: src=/example/ dest=/example
when: False
Utilisation de jusqu'à une tentative de vérification en boucle
Ceci est un exemple d'utilisation jusqu'à / retries / delay pour implémenter une vérification active pour une application Web en cours de démarrage. Cela suppose qu'il y aura une période de temps (jusqu'à 3 minutes) où l'application Web refusera les connexions socket. Après cela, il vérifie la page / alive pour le mot "OK". Il délègue également la récupération de l'URL au localhost exécutant ansible. Cela est logique en tant que tâche finale dans un playbook de déploiement.
---
- 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
Le modèle de relance peut être utilisé avec n'importe quelle action; La documentation d'Ansible fournit un exemple de l'attente qu'une certaine commande shell renvoie un résultat souhaité: http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .