Un rôle pour deux restaurants universitaires
Un rôle Ansible est un playbook découpé en dossiers fixes, pour être réutilisé et testé seul. Quand une variable est définie à plusieurs endroits, une règle de priorité décide laquelle l’emporte.
Un service informatique veut le même rôle pour le restaurant nord et le restaurant sud, avec des horaires différents. Il faut savoir où mettre chaque valeur pour que la bonne gagne.
À la fin de cette leçon
Remarque
Je peux ranger une tâche dans un rôle et dire quelle variable l’emporte quand un nom est défini à plusieurs endroits.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Rôle | un playbook rangé dans des dossiers fixes, réutilisable | roles/cantine |
| Playbook | un fichier qui dit quelles tâches jouer sur quels hôtes | |
| defaults | les valeurs du rôle que tout le monde peut changer | defaults/main.yml |
| vars | les valeurs du rôle que le jeu ne change pas facilement | vars/main.yml |
| Priorité | la règle qui dit quelle valeur gagne pour un même nom | |
| Variable supplémentaire | une valeur donnée sur la ligne de commande | -e service=emporter |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un rôle range un playbook en dossiers fixes
Un long playbook devient vite illisible. Un rôle le découpe : les tâches dans un dossier, les valeurs dans un autre, les fichiers à copier dans un troisième. Chaque dossier a un nom imposé, donc n’importe qui retrouve tout.
L’outil ansible-galaxy fabrique ce squelette sans réseau. Dans ce labo, Ansible gère la machine elle-même, avec une connexion locale.
Créer le dossier du projet
mkdir -p ~/atelier-ansibleAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Aller dans ce dossier
cd ~/atelier-ansibleAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Fabriquer le squelette d’un rôle
ansible-galaxy role init --init-path roles cantineAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lister ses dossiers
find roles/cantine -type d | sortAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : ce que contient chaque dossier
| Dossier | Ce qu’il contient |
|---|---|
| tasks | les tâches du rôle, dans main.yml |
| defaults | les valeurs faciles à changer |
| vars | les valeurs plus fortes, que le jeu ne remplace pas |
| templates et files | les fichiers à fabriquer ou à copier |
| handlers | les tâches qui attendent qu’on les appelle |
| meta | qui a écrit le rôle, et de quoi il dépend |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Pour un même nom, la plus forte gagne
Une variable peut être définie dans defaults, dans le jeu, dans vars du rôle, ou sur la ligne de commande avec -e. Ansible garde une seule valeur par nom.
Du plus faible au plus fort : defaults du rôle, variables du jeu, vars du rôle, puis -e. D’autres niveaux existent. Cette leçon étudie ces quatre-là.
Quatre endroits, un même nom défini plusieurs fois
# roles/cantine/defaults/main.yml : le plus faible
tarif: 4
lieu: Resto U
ouverture: 11h30
service: self
# roles/cantine/vars/main.yml : plus fort que le jeu
ouverture: 11h45
# jouer.yml : le jeu, qui appelle le rôle
- hosts: localhost
vars:
lieu: Resto Sud
ouverture: 12h
roles:
- cantine
Écrire les defaults
printf 'tarif: 4\nlieu: Resto U\nouverture: 11h30\nservice: self\n' > roles/cantine/defaults/main.ymlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire les vars
printf 'ouverture: 11h45\n' > roles/cantine/vars/main.ymlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire la tâche du rôle
printf -- '- name: Annoncer la cantine\n ansible.builtin.debug:\n msg: "{{ lieu }}, repas à {{ tarif }} euros, ouverture {{ ouverture }}, service {{ service }}"\n' > roles/cantine/tasks/main.ymlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le jeu qui appelle le rôle
printf -- '- hosts: localhost\n gather_facts: false\n vars:\n lieu: Resto Sud\n ouverture: 12h\n roles:\n - cantine\n' > jouer.ymlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Jouer le rôle et lire le message
ansible-playbook -i localhost, -c local jouer.yml | grep msgAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : qui gagne pour chaque nom
| Nom | Défini dans | Valeur retenue |
|---|---|---|
| tarif | defaults seulement | 4 |
| service | defaults seulement | self |
| lieu | defaults et jeu | Resto Sud, celle du jeu |
| ouverture | defaults, jeu et vars | 11h45, celle de vars |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Donner deux valeurs avec -e
ansible-playbook -i localhost, -c local jouer.yml -e ouverture=10h -e service=emporter | grep msgAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup de gens rangent toutes les valeurs dans vars, « pour être sûrs ». Résultat : le jeu ne peut plus rien changer, et seul -e passe. Mettez dans defaults ce que l’utilisateur du rôle doit pouvoir régler. Gardez dans vars ce qui ne doit pas bouger.
Pour aller plus loin
Ajoutez une variable dessert dans defaults, puis utilisez-la dans le message de la tâche. Jouez le rôle avec -e dessert=fruit.
Retirez ensuite dessert de defaults et jouez à nouveau. Dites pourquoi Ansible s’arrête, et quel niveau de priorité règle le problème.