Dans le développement informatique, contrôler l’exécution des tâches est essentiel.
Sans conditions, les playbooks peuvent exécuter des tâches inappropriées, entraînant des erreurs.
Les conditions Ansible offrent une solution flexible et sécurisée pour contrôler les tâches.
Devenez un expert d'Ansible et simplifiez vos tâches d'administration.
Conditions Ansible dans le playbook
Dans le domaine du développement informatique, les conditions sont omniprésentes et courantes, que ce soit dans un algorithme ou dans un programme. Observons ce concept à travers ce visuel maintenant.
Théorie des tâches conditionnelles
Les conditions dans les playbooks Ansible permettent de contrôler l’exécution des tâches en fonction de critères spécifiques. Ce principe est essentiel pour automatiser de manière flexible et sécurisée les configurations et les actions sur vos infrastructures
Il existe trois(03) types de conditions dans le playbook :
- Les conditions avec « when » :Utiliserwhenest la méthode la plus courante pour conditionner l’exécution d’une tâche en fonction d’une expression booléenne. Voici un exemple :
tasks:
- name: Configure SELinux to start mysql on any port ansible.posix.seboolean:
name: mysql_connect_any
state: true
persistent: yes
when: ansible_selinux.status == "enabled"
Cette tâche consiste à Configurer SELinux pour permettre à MySQL de démarrer sur n’importe quel port. Mais la tâche est conditionnée par l’état activé de SELinux ( ansible_selinux.status == « enabled « ).
- Conditions basées sur des variables enregistrées :L’objectif est de déterminer l’exécution ou l’ignorance d’une tâche en fonction du résultat d’une tâche précédente.
Ce processus s’effectue en deux étapes :
Premièrement, l’enregistrement du résultat de la tâche précédente en tant que variable : Utilisons register pour capturer le résultat d’une tâche dans une variable. Deuxièmement, la création d’un test conditionnel basé sur la variable enregistrée : Utilisons when pour conditionner une tâche en fonction de la valeur de la variable enregistrée.
Voici un exemple d’un playbook avec des conditions basées sur des variables enregistrées.
- name: Test play
hosts: all
tasks:
- name: Register a variable
ansible.builtin.shell: cat /etc/motd
register: motd_contents
- name: Use the variable in conditional statement
ansible.builtin.shell: echo "motd contains the word hi"
when: motd_contents.stdout.find('hi') != -1
Tâche 1 : Register a variable
tasks:
- name: Register a variable
ansible.builtin.shell: cat /etc/motd
register: motd_contents
Cette tâche utilise le module ansible.builtin.shell pour exécuter la commande cat /etc/motd sur tous les hôtes (hosts: all). Le contenu du fichier /etc/motd est capturé dans une variable nommée motd_contents à l’aide de register . motd_contents contiendra les résultats de la commande exécutée, y compris stdout, qui contient la sortie standard de la commande.
Tâche 2 : Use the variable in conditional statement
- name: Use the variable in conditional statement
ansible.builtin.shell: echo "motd contains the word hi"
when: motd_contents.stdout.find('hi') != -1
Cette tâche utilise motd_contents dans une déclaration conditionnelle ( when ) pour décider si elle doit être exécutée. La commande sera exécutée seulement si la chaîne ‘hi’ est trouvée dans la sortie (stdout) de motd_contents . Condition (when) : motd_contents.stdout.find(‘hi’) != -1 vérifie si la chaîne ‘hi’ est présente dans stdout . Si c’est le cas, la condition est vraie et la tâche sera exécutée ; sinon, elle sera ignorée.
- Conditions basées sur des variables
Dans les playbooks Ansible, les conditions basées sur des variables nécessitent souvent des entrées booléennes pour déterminer si une tâche doit être exécutée ou non.
Voici un exemple :
- name: Déploiement du logiciel
package:
name: mon_logiciel
state: present
when: deploy_software
Ce playbook déploie un logiciel si une variable booléenne deploy_software est vraie. Dans ce cas, la tâche de déploiement du logiciel ne sera effectuée que si deploy_software est true .
Exemples pratiques d'automatisation Ansible
- Pour la condition When :Pour mieux comprendre ce sujet, nous allons créer un playbook avec des conditions basées sur des facts. Pour ce faire, créons le fichiercondition-fact.ymlet copions-y le playbook suivant :
- hosts: servers
tasks:
- package:
name: "httpd"
state: present
when: ansible_os_family == "RedHat"
- package:
name: "apache2"
state: present
when: ansible_os_family == "Debian"
Ce playbook utilise des conditions ( when ) pour s’assurer que seule la tâche correspondant à la famille du système d’exploitation (RedHat ou Debian) de chaque serveur cible est exécutée. Cela permet d’adapter l’installation du package Apache en fonction des différentes distributions Linux gérées par Ansible.
Apes avoir exécuté le playbook avec la commande ansible-playbook -v condition-fact.yml –become , nous avons le résultat attendus comme ceci :
Super cool, le résultat attendu s’affiche correctement car la famille du système d’exploitation de notre nœud géré est Debian. C’est pourquoi la première tâche est ignorée et seule la seconde est exécutée.
- Conditions basées sur des variables enregistrées :Pour exécuter notre playbook, nous allons le tester dans le terminal de notre nœud de contrôle. Pour cela, commencez par créer un fichier nommécondition-register.ymlen utilisant la commande habituellenanoplaybook-register.yml, puis copiez-y le contenu de notre playbook.
- hosts: all
tasks:
- name: Read file content
shell: cat /tmp/testFile.txt
register: output
- name: Debug message if file contains 'world'
debug:
msg: "The file contains 'world'"
when: output.stdout.find('world') != -1
Tâche 1 : Lecture du contenu du fichier :
- name: Read file content
shell: cat /tmp/testFile.txt
register: output
on utilise le module shell pour exécuter la commande cat /tmp/testFile.txt sur tous les hôtes spécifiés (hosts: all). Le résultat de la commande est enregistré dans une variable appelée output à l’aide de register .
2. Tâche – Affichage d’un message de débogage si le fichier contient ‘world’
- name: Debug message if file contains 'world'
debug:
msg: "The file contains 'world'"
when: output.stdout.find('world') != -1
On utilise le module debug pour imprimer un message si le fichier /tmp/testFile.txt contient la chaîne ‘world’ .
Condition (when) : La tâche debug ne sera exécutée que si output.stdout.find(‘world’) != -1 . Cela signifie que la recherche de la sous-chaîne ‘world’ dans la sortie standard (stdout) de la commande cat est différente de -1, indiquant que la chaîne a été trouvée dans le contenu du fichier.
Pour que notre playbook s’exécute correctement, commençons par créer un fichier testFile.txt dans le répertoire tmp du nœud géré, et y insérons le texte » Hello world » pour tester notre playbook.
Exécutons maintenant notre playbook en utilisant la commande suivante : ansible-playbook -v condition-register.yml, puis examinons les résultats obtenus.
La condition était bien vérifiée donc le message affiche bien « The file contains ‘world’ »
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment fonctionnent les conditions dans un playbook Ansible?
Quels types de conditions peut-on utiliser dans Ansible?
Comment utiliser des variables enregistrées dans Ansible?
Comment automatiser l'installation de packages avec des conditions dans Ansible?
Quels sont les avantages d'utiliser des conditions dans les playbooks Ansible?
Conclusion
En utilisant les conditions Ansible, vous pouvez adapter vos playbooks à divers scénarios et besoins spécifiques. Comment envisagez-vous d’intégrer ces techniques dans vos projets d’automatisation?