Sélectionner des Hôtes avec des Motifs de Base et des Jokers (Wildcards)
Dans cette étape, vous apprendrez les bases de la sélection d'hôtes spécifiques dans votre automatisation Ansible. Le cœur de cette opération réside dans le fichier d'inventaire Ansible, qui liste les serveurs que vous gérez, et dans la directive hosts d'un playbook, qui spécifie sur quels serveurs un ensemble de tâches doit s'exécuter. Nous commencerons par installer Ansible, créer un inventaire et un playbook de base, puis nous explorerons comment sélectionner des hôtes en utilisant des noms de groupes et des motifs de jokers (wildcards).
Tout d'abord, assurons-nous qu'Ansible est installé dans votre environnement. Ansible n'est pas installé par défaut, vous devez donc l'installer en utilisant le gestionnaire de paquets DNF. Le paquet ansible-core fournit les outils essentiels en ligne de commande d'Ansible, y compris ansible-playbook. Exécutez la commande suivante :
sudo dnf install -y ansible-core
Vous devriez voir une sortie similaire à celle-ci :
...
Installed:
ansible-core-2.16.x-x.el9.x86_64
...
Complete!
Ensuite, créons un répertoire dédié pour cet exercice afin de garder nos fichiers organisés. Toutes les actions ultérieures dans cette étape se dérouleront dans ce nouveau répertoire :
mkdir -p ~/project/ansible_patterns
cd ~/project/ansible_patterns
Maintenant, créez un fichier d'inventaire. Un inventaire est un fichier texte qui définit les hôtes et les groupes d'hôtes sur lesquels les commandes, modules et tâches Ansible opèrent. Nous utiliserons le format INI pour sa simplicité.
Utilisez l'éditeur nano pour créer un fichier nommé inventory :
nano inventory
Ajoutez le contenu suivant au fichier inventory. Cela définit deux groupes, webservers et dbservers, chacun contenant deux hôtes :
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.lab.net
db2.lab.net
Enregistrez le fichier et quittez nano en appuyant sur Ctrl+X, puis Y, et Entrée.
Avec notre inventaire prêt, créons un playbook simple. Ce playbook utilisera le module ansible.builtin.debug pour afficher un message, confirmant sur quel hôte la tâche s'exécute. C'est un excellent moyen de tester les motifs d'hôtes sans apporter de modifications réelles au système.
Créez un nouveau fichier nommé playbook.yml :
nano playbook.yml
Ajoutez le contenu YAML suivant. Initialement, il cible tous les hôtes du groupe webservers :
---
- name: Test Host Patterns
hosts: webservers
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Enregistrez et quittez l'éditeur. Maintenant, exécutez le playbook en utilisant ansible-playbook. Le drapeau -i spécifie notre fichier d'inventaire personnalisé :
ansible-playbook playbook.yml -i inventory
La sortie devrait ressembler à ceci :
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
PLAY RECAP *********************************************************************
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Comme vous pouvez le constater, seuls les hôtes du groupe webservers ont été ciblés. Maintenant, modifions le playbook pour utiliser un joker (*). Les jokers permettent une correspondance de motifs plus flexible.
Modifiez playbook.yml et changez la ligne hosts en hosts: "*.lab.net". N'oubliez pas d'encadrer les motifs contenant des jokers entre guillemets :
---
- name: Test Host Patterns
hosts: "*.lab.net"
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Exécutez à nouveau le playbook :
ansible-playbook playbook.yml -i inventory
Vous devriez voir une sortie similaire à celle-ci :
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Cette fois, le jeu s'est exécuté uniquement sur les hôtes dont le nom se termine par .lab.net. Enfin, utilisons le mot-clé spécial all pour cibler tous les hôtes définis dans l'inventaire.
Modifiez playbook.yml une dernière fois et changez la ligne hosts en hosts: all :
---
- name: Test Host Patterns
hosts: all
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Exécutez le playbook pour voir le résultat :
ansible-playbook playbook.yml -i inventory
La sortie montrera que tous les hôtes sont ciblés :
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Le playbook s'exécute maintenant sur les quatre hôtes de votre inventaire, démontrant la puissance du motif all.