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"

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 .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow