Trois salles, une seule façon de les préparer
Un lycée prépare trois salles informatiques. Le premier playbook est un long fichier que tout le monde modifie, et en juin plus personne n’ose y toucher. Un rôle, c’est ce fichier découpé en dossiers fixes : une partie de la préparation peut être réutilisée, partagée et modifiée toute seule.
À la fin de cette leçon
Remarque
Je peux dire ce que contient un rôle et pourquoi un handler ne s’exécute qu’une fois.
Mots-clés
- Rôle : un playbook découpé en dossiers fixes, comme
tasksetdefaults. - Variable : un nom qui garde une valeur qu’une tâche peut utiliser.
- Priorité : l’ordre qui décide quelle variable gagne quand deux ont le même nom.
- Handler : une tâche qui ne s’exécute que si une autre lui en donne l’ordre.
- Vault : la façon dont Ansible garde un fichier chiffré.
Pour commencer : ce que tu sais déjà
Remarque
Réponds dans ta tête. 1. Qu’est-ce qu’un playbook ? 2. Que veut dire qu’un playbook est idempotent ? 3. Que dit le nom d’une tâche, comme ansible.builtin.file ? Tu as appris les trois dans le lab Les bases d’Ansible.
Avant de commencer
Remarque
Appuie sur Démarrer le lab dans la barre en haut de cette leçon. Ce lab est une machine Ubuntu entière, rien que pour toi, avec Ansible installé : elle met un peu plus de temps à démarrer qu’un conteneur. Chaque bouton Exécuter tape sa commande dans le terminal de la machine, l’une après l’autre, dans la même session. Si l’un d’eux dit que la machine démarre encore, attends quelques secondes et appuie de nouveau. Pour les regarder, ou pour taper les tiens, appuie sur Ouvrir le terminal dans la barre.
Un rôle est un dossier à la structure fixe
ansible-galaxy role init crée les dossiers d’un rôle vide, et il marche sans réseau. Ici il crée un rôle appelé hello dans /tmp, pas dans ton lab. La liste montre les dossiers. tasks contient ce que fait le rôle, defaults et vars ses variables. templates et files contiennent ce qu’il copie, handlers les tâches qui attendent un ordre, et meta dit qui l’a écrit. tests et README.md sont des extras.
ansible-galaxy role init --init-path /tmp/demo-roles helloAffiché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.
ls /tmp/demo-roles/helloAffiché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.
Vérifie
Astuce
Où un rôle range-t-il une valeur qu’un playbook doit pouvoir changer ? Réponse : dans defaults, l’endroit le plus faible pour une variable. Une valeur que personne ne doit changer va dans vars.
Même nom, deux valeurs : une gagne
Une variable peut être donnée à bien des endroits, et l’ordre décide. Les defaults d’un rôle perdent contre presque tout. Les vars d’un play les battent, les vars propres au rôle battent le play, et une valeur donnée avec -e sur la ligne de commande bat tout. Ce playbook, écrit dans /tmp, met colour à blue sur le play et a deux tâches qui créent un fichier et préviennent un handler. Lance-le, puis relance-le avec -e colour=red : le bilan dit changed=2 les deux fois, parce que les fichiers sont touchés à chaque fois, et la couleur affichée suit l’ordre.
printf -- '- hosts: web1\n gather_facts: false\n vars:\n colour: blue\n tasks:\n - ansible.builtin.debug:\n var: colour\n - ansible.builtin.file:\n path: /tmp/demo-a\n state: touch\n notify: Say hello\n - ansible.builtin.file:\n path: /tmp/demo-b\n state: touch\n notify: Say hello\n handlers:\n - name: Say hello\n ansible.builtin.debug:\n msg: hello\n' > /tmp/demo.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.
ansible-playbook -i ~/roles-lab/inventory.ini /tmp/demo.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.
ansible-playbook -i ~/roles-lab/inventory.ini /tmp/demo.yml -e colour=redAffiché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.
Vérifie
Astuce
Pourquoi la couleur est-elle devenue red ? Réponse : une valeur donnée avec -e a la priorité la plus haute, elle bat donc les vars du play.
Une erreur fréquente
Attention
Beaucoup de gens pensent qu’un handler s’exécute chaque fois qu’une tâche le demande. Un handler attend la fin du play puis s’exécute une seule fois, quel que soit le nombre de tâches qui l’ont demandé, et seulement si l’une d’elles a vraiment changé quelque chose. Si rien n’a changé, il ne s’exécute pas du tout.
Un handler s’exécute une fois, même si plusieurs tâches le demandent
Dans le playbook, les deux tâches disent notify: Say hello. La sortie montre deux tâches changed puis une seule ligne RUNNING HANDLER. Cette commande relance le playbook et ne garde que les lignes contenant RUNNING : il y en a une. Ansible peut aussi exécuter les handlers en attente au milieu d’un play, avec une tâche appelée flush_handlers, qu’un rôle utilise quand une tâche suivante a besoin du travail du handler.
ansible-playbook -i ~/roles-lab/inventory.ini /tmp/demo.yml | grep RUNNINGAffiché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.
Vérifie
Astuce
Trois tâches changent quelque chose et préviennent toutes le même handler. Combien de fois le handler s’exécute-t-il ? Réponse : une fois, à la fin du play, sauf s’il a été exécuté plus tôt avec flush_handlers.
Vault garde une valeur chiffrée
ansible-vault encrypt_string chiffre une valeur avec un mot de passe. Le mot de passe est dans un fichier : ce lab a vault-password.txt, un faux mot de passe pour s’entraîner. Ce qui s’affiche commence par demo_var: !vault | puis par l’en-tête $ANSIBLE_VAULT;1.1;AES256, et le reste est illisible. Tu peux mettre ce bloc dans un fichier de variables. Un fichier entier peut aussi être chiffré, avec ansible-vault create ou encrypt, et view le montre de nouveau.
ansible-vault encrypt_string --vault-password-file ~/roles-lab/vault-password.txt demo --name demo_varAffiché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.
Vérification finale
Astuce
Réponds sans regarder en arrière. 1. Quel dossier d’un rôle contient les tâches ? 2. Quelle variable gagne, celle de defaults ou celle donnée avec -e ? 3. Combien de fois un handler s’exécute-t-il quand deux tâches le préviennent ? 4. Que dit l’en-tête $ANSIBLE_VAULT d’un fichier ? Réponses : tasks ; celle donnée avec -e ; une fois ; qu’il est chiffré. Maintenant, fais le lab : lis README.md dans ton dossier personnel avec cat README.md dans le terminal.
Pour les enseignants
Astuce
Cette leçon est un petit exemple de leçon donnée dans un lab : les étapes et les boutons Exécuter sont la leçon, et le lab est la copie de chaque élève. Elle se déroule dans un lab VM : chaque élève a sa propre machine Ubuntu avec Ansible, et un bouton Exécuter tape dans son terminal et montre ce qui s’est affiché. Points clés : 1. Un rôle est un playbook rangé dans des dossiers fixes. 2. Quand deux variables ont le même nom, l’ordre de priorité décide, et -e est le plus fort. 3. Un handler s’exécute une fois à la fin, quel que soit le nombre de tâches qui le préviennent. 4. Vault chiffre une valeur ou un fichier, et le mot de passe est gardé à part. Erreur fréquente : croire qu’un handler s’exécute à chaque notification. Matériel : le lab et un navigateur. Conseil : avant le deuxième lancement, demandez à la classe quelle couleur va s’afficher et pourquoi. Le lab lui-même a une vérification qui exécute le rôle et note les fichiers qu’il crée. Copiez la leçon dans votre propre module pour la modifier, ou construisez-en une de zéro avec le menu Lab du générateur de leçons.