Comment travailler avec Ansible When et autres conditionnels

Si vous devez exécuter des tâches Ansible en fonction de différentes conditions, alors vous êtes au bon endroit. Ansible when et autres conditionnels vous permet d’évaluer des conditions, telles que basées sur le système d’exploitation, ou si une tâche dépend de la tâche précédente.

Dans ce tutoriel, vous apprendrez comment travailler avec Ansible when et autres conditionnels afin d’exécuter des tâches sans perturber les choses.

Plongeons-y !

Prérequis

Ce tutoriel comprend des exemples pratiques. Si vous souhaitez suivre, assurez-vous d’avoir ce qui suit en place :

  • Un hôte contrôleur Ansible – Ce tutoriel utilise Ansible v2.9.24 hébergé sur une machine Ubuntu 18.04.5 LTS.
  • A remote computer to run commands.
  • Vous aurez besoin d’un fichier d’inventaire configuré et un ou plusieurs hôtes déjà configurés pour exécuter la commande et les playbooks Ansible. Le tutoriel utilisera un groupe d’inventaire appelé web.

Travailler avec Ansible when avec plusieurs tâches dans le playbook

Avoir plusieurs tâches dans un playbook peut être fastidieux si elles s’exécutent toutes sans conditions spécifiques. Commençons ce tutoriel en définissant les conditions Ansible when dans le playbook Ansible avec plusieurs tâches.

1. Ouvrez un terminal sur l’hôte du contrôleur Ansible.

2. Exécutez les commandes ci-dessous pour créer un répertoire et lui donner le nom de votre choix dans votre répertoire personnel, puis accédez à ce répertoire.

Pour cet exemple, le répertoire est nommé ansible_when_condition_demo. Ce répertoire contiendra le playbook que vous utiliserez pour invoquer la condition when dans la tâche Ansible.

# Créez un répertoire nommé ~/ansible_when_condition_demo
mkdir ~/ansible_when_condition_demo
# Changez le répertoire de travail vers ~/ansible_when_condition_demo
cd ~/ansible_when_condition_demo

3. Dans votre éditeur de code préféré, créez un fichier YAML dans le répertoire ~/ansible_when_condition_demo. Dans cet exemple, le fichier s’appelle my_playbook.yml. Copiez et collez le contenu du playbook YAML ci-dessous dans le fichier my_playbook.yml.

Dans les deux tâches ci-dessous (Task-1 et Task-2), les conditions when vérifient sur quel système d’exploitation chaque hôte distant se trouve. Le résultat est ensuite transmis à la variable de substitution ansible_os_family sur chaque tâche.

Si la valeur des espaces réservés ansible_os_family est égale à RedHat ou à Debian, alors Ansible exécute l’une des tâches pour installer Apache.

---
- name: Ansible tasks to work on Ansible When
# Définition du serveur distant où Ansible s'exécutera
  hosts: web
  remote_user: ubuntu # Utilisation de l'hôte distant comme ubuntu
  become: true # Exécution des tâches en tant qu'utilisateur élevé (sudo)
  tasks:

# (Tâche-1) Vérifie si ansible_os_family == "RedHat" puis installe Apache sur le nœud distant
    - name: Install Apache on CentOS  Server
      yum: name=httpd  state=present
      become: yes
      when: ansible_os_family == "RedHat"

# (Tâche-2) Vérifie si ansible_os_family == "Debian" puis installe Apache sur le nœud distant
    - name: Install Apache on Ubuntu Server
      apt:name=apache2 state=present
      become: yes
      when: ansible_os_family == "Debian"

4. Exécutez maintenant la commande ansible-playbook ci-dessous pour exécuter les tâches définies dans le playbook (my_playbook.yml) sur l’hôte distant, défini dans votre fichier d’inventaire existant.

ansible-playbook my_playbook.yml 

Sur la capture d’écran ci-dessous, vous pouvez voir que:

  • La première TÂCHE a renvoyé un statut OK, ce qui montre que la tâche ne nécessite aucun changement.
  • La deuxième TÂCHE a renvoyé le statut skipping. Lorsque la condition n’est pas remplie, la tâche sera ignorée.
  • La troisième TÂCHE a renvoyé un statut changed, ce qui indique que l’hôte distant n’était pas dans l’état approprié (c’est-à-dire, Apache n’est pas présent) et a été modifié pour installer Apache.
Invoking the ansible-playbook using ansible-playbook command

5. Ouvrez une session SSH sur l’hôte distant, qui était la cible du playbook Ansible, à l’aide de votre client SSH préféré pour vérifier si Apache est installé et en cours d’exécution.

6. Enfin, exécutez la commande service ci-dessous pour vérifier si Apache est installé (status apache2) sur l’hôte distant.

service status apache2

Comme vous pouvez le voir ci-dessous, vous avez installé le service Apache sur la machine distante.

Verifying the Apache service on the remote node

Travailler avec when et des boucles dans Ansible

Vous avez précédemment exécuté des tâches Ansible en fonction d’une condition Ansible when pour un paramètre particulier tel que ansible_os_family. Mais peut-être avez-vous besoin de vérifier une condition avec plusieurs paramètres définis dans une liste. Si c’est le cas, essayez d’ajouter une boucle loop dans une tâche.

Ouvrez le fichier my_playbook.yml que vous avez précédemment créé (étape trois sous « Travailler avec Ansible when avec plusieurs tâches dans le playbook »). Remplacez le contenu du fichier my_playbook.yml par le code ci-dessous.

La tâche dans le code ci-dessous (Tâche-1) exécute une boucle où la condition when vérifie si la valeur de l’élément est supérieure à cinq et renvoie le résultat.

---
- name: Ansible tasks to work on Ansible When
# Définition du serveur distant où Ansible s'exécutera
  hosts: web
  remote_user: ubuntu   # Utilisation de l'hôte distant comme ubuntu
  become: true
  tasks:
  # (Tâche -1) Vérification si la valeur de l'élément est supérieure à 5
    - name: Run with items greater than 5
      ansible.builtin.command: echo {{ item }}
      loop: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 5*

Exécutez maintenant la commande ci-dessous pour exécuter le playbook comme vous l’avez fait précédemment.

 ansible-playbook my_playbook.yml

Ci-dessous, vous pouvez voir l’état skip renvoyé lorsque la condition est fausse et l’état changed lorsque la condition est vraie.

Checking the when condition for multiple parameters

Travailler avec Ansible when et les facts Ansible

Vous souhaitez peut-être ajouter plusieurs conditions pour exécuter une tâche. Si tel est le cas, apprenez à utiliser les facts Ansible dans la condition when. Les facts Ansible vous permettent d’ajouter une déclaration conditionnelle pour exécuter des tâches basées sur des faits collectés, tels que votre système d’exploitation, les adresses IP, les systèmes de fichiers attachés, et plus encore.

Remplacez le contenu du fichier my_playbook.yml par le code ci-dessous.

Dans le code ci-dessous, les deux tâches (Task-1 et Task-2) ne s’exécutent que (arrêt du système) lorsque l’une des conditions suivantes est vraie:

  • Les valeurs distribution et distribution_major_version renvoient toutes deux une valeur vraie.
  • La valeur os_family est égale à CentOS.
---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (Task-1): Pour arrêter le nœud distant si la distribution est CentOS avec une version majeure 6
    - name: Shut down CentOS 6 systems
      ansible.builtin.command: /sbin/shutdown -t now
      when:
        - ansible_facts['distribution'] == "CentOS"
        - ansible_facts['distribution_major_version'] == "6"
# (Task-2): Pour arrêter le nœud distant si os_family est CentOS.
    - name: Shut down CentOS flavored systems
      ansible.builtin.command: /sbin/shutdown -t now
      when: ansible_facts['os_family'] == "CentOS"

Exécutez le playbook comme vous l’avez fait précédemment avec la commande ci-dessous.

ansible-playbook my_playbook.yml

Remarquez ci-dessous que les deux tâches affichent l’état skip puisque vous êtes sur Ubuntu. La tâche s’exécute uniquement si vous êtes sur CentOS.

Executing the ansible-playbook with Ansible facts in Ansible when

Travailler avec Ansible when basé sur les valeurs enregistrées

Parfois, vous souhaitez exécuter ou sauter une tâche en fonction du résultat d’une tâche antérieure dans un playbook. Par exemple, vous pourriez vouloir configurer un service après une mise à niveau de tâche précédente. Dans ce cas, utilisez une variable enregistrée. Une variable enregistrée vous permet d’enregistrer le résultat de la tâche précédente en tant que variable et de l’utiliser pour la tâche suivante en tant qu’entrée.

1. Créez un répertoire vide nommé /home/ubuntu/hello.

2. Remplacez le contenu du fichier my_playbook.yml par le code ci-dessous, qui effectue les opérations suivantes :

La première tâche (Tâche-1) répertorie le contenu (fichiers et sous-répertoires) du répertoire /etc/hosts en mémoire et enregistre ce résultat dans la variable contents1 via la commande register.

La deuxième tâche (Tâche-2) répertorie le contenu (actuellement vide) du répertoire /home/ubuntu/hello en mémoire et enregistre cette liste dans la variable contents2.

La troisième tâche (Tâche-3) vérifie et affiche un message « Le répertoire est vide » si le résultat enregistré pour la variable contents1 ou contents2 est vide.

La propriété stdout de la variable contents1 et contents2 est la sortie shell enregistrée à partir du résultat de l’exécution des commandes de la tâche.

---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (Tâche-1) : Pour répertorier le contenu du répertoire dans le répertoire /etc/hosts
      - name: List contents of directory and Store in content1
        ansible.builtin.command: ls /etc/hosts
        register: contents1
# (Tâche-2) : Pour répertorier le contenu du répertoire /home/ubuntu/hello
      - name: List contents of directory and Store in content2
        ansible.builtin.command: ls /home/ubuntu/hello
        register: contents2
# (Tâche-3) : Afficher le répertoire est vide si l'un des répertoires 
# /etc/hosts ou /home/ubuntu/hello est un répertoire vide
      - name: Check contents for emptiness for content1 or content2
        ansible.builtin.debug:
          msg: "Directory is empty"
        when: contents1.stdout == "" or contents2.stdout == ""

3. Enfin, exécutez le playbook avec la commande ansible-playbook ci-dessous.

ansible-playbook my_playbook.yml

Comme indiqué ci-dessous, étant donné que le résultat enregistré pour la variable contents2 est vide, la troisième tâche renvoie le message Le répertoire est vide.

Running the Ansible playbook for Ansible when based on registered values

Travailler avec le when Ansible dans les rôles Ansible

Dans cet exemple final, vous apprendrez comment fonctionne le when Ansible au sein des rôles Ansible. Les rôles Ansible vous permettent de réutiliser des configurations standard et de déployer plus rapidement. Lisez la suite pour découvrir comment une tâche invoque les rôles Ansible uniquement si la condition when Ansible est vraie.

1. Exécutez les commandes ci-dessous pour créer un répertoire nommé ~/ansible_role_when_demo dans votre répertoire personnel et changez vers ce dossier en tant que répertoire de travail. Le répertoire ~/ansible_role_when_demo contiendra les fichiers de démonstration de cet exemple.

# Créez un répertoire nommé ~/ansible_role_when_demo dans votre répertoire personnel
mkdir ~/ansible_role_when_demo
# Changez vers le répertoire ~/ansible_role_when_demo
cd ~/ansible_role_when_demo

2. Ensuite, exécutez les commandes ci-dessous pour créer un répertoire ~/ansible_role_when_demo/roles et ~/ansible_role_when_demo/roles/java/tasks.

Voici ce que contiendra chaque répertoire :

  • Le répertoire ~/ansible_role_when_demo/roles contiendra le rôle que vous devez déployer.

Par défaut, Ansible recherche les rôles dans deux emplacements : dans un répertoire appelé roles/ situé dans le répertoire où réside le playbook, ou dans /etc/ansible/roles. Si vous souhaitez stocker les rôles dans des emplacements différents, déclarez les chemins en utilisant le paramètre - role: dans le playbook.

  • Le dossier ~/ansible_role_when_demo/roles/java/tasks contiendra un fichier main.yml dont vous aurez besoin pour déployer un rôle.
# Créez un répertoire nommé roles à l'intérieur du répertoire ~/ansible_role_when_demo
mkdir -p roles
# Changez le répertoire de travail vers le répertoire ~/ansible_role_when_demo/roles
cd roles 
# Créez le répertoire parent (-p) nommé java et un sous-répertoire nommé tasks
mkdir -p java/tasks

Maintenant, créez un fichier nommé main.yml dans le répertoire ~/ansible_role_when_demo/roles/java/tasks, puis copiez et collez le code du playbook ci-dessous dans le fichier main.yml.

Le playbook ci-dessous installe Java sur le nœud distant sur lequel il est exécuté avec le module apt.

---
# Installation de Java (Open Jdk)
- name: Install Java 1.8
  apt: name=openjdk-8-jdk

4. Créez un autre fichier YAML avec un nom de votre choix, et copiez/collez le code ci-dessous. Pour cet exemple, le fichier est nommé ~/ansible_role_when_demo/java-setup.yml.

Le code ci-dessous déploie le rôle Ansible (java) sur l’utilisateur distant (ubuntu) qui a un accès administratif uniquement lorsque l’utilisateur distant est sur un OS Debian.

- name: Java Installation playbook
# Définition du serveur distant où le package sera déployé
  hosts: myserver
  remote_user: ubuntu   # Utilisation de l'utilisateur distant comme ubuntu
  become: true
  tasks:  
  roles:
     - role: java
       # Exécuter la tâche uniquement si l'utilisateur distant est sur un OS Debian.
       when: ansible_facts['os_family'] == 'Debian'

5. Exécutez la commande tree pour vérifier que tous les dossiers et fichiers requis existent dans le répertoire ~/ansible_role_when_demo.

Verifying all of the required folders in the ~/ansible_role_when_demo directory

6. Enfin, exécutez le playbook avec la commande ansible-playbook ci-dessous. ansible-playbook java-setup.yml

ansible-playbook java-setup.yml

Ci-dessous, la tâche a renvoyé un statut changed, indiquant que Java a été installé avec succès car le nœud distant utilise un système d’exploitation Debian. Exécution du playbook Ansible en utilisant Ansible when avec les rôles Ansible

Running the Ansible playbook using Ansible when with Ansible roles

Conclusion

Dans ce tutoriel, vous avez appris différentes façons d’utiliser when avec Ansible et d’autres conditionnels. Vous avez également appris comment appliquer des conditions when avec des tâches de base en tirant parti des facts d’Ansible et en déployant des roles Ansible.

Maintenant, comment exploiter ces nouvelles connaissances? Peut-être économiser du temps en configurant plusieurs serveurs avec des modèles Ansible tout en appliquant des conditions when Ansible?

Source:
https://adamtheautomator.com/ansible-when/