Rejouer une ligne, jamais un mot de passe
Un tag Ansible est une étiquette posée sur une tâche, qui permet de jouer une partie seulement d’un playbook. Ansible Vault, lui, chiffre un secret pour qu’il ne soit jamais écrit en clair dans le projet.
Les deux servent chaque semaine. On ne rejoue pas tout un parc pour corriger une ligne, et on ne publie jamais un mot de passe dans un dépôt.
À la fin de cette leçon
Remarque
Je peux jouer une partie d’un playbook avec des tags et garder un secret hors du texte en clair.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Tag | une étiquette sur une tâche, pour la choisir au lancement | tags: [cuisine] |
| --limit | réduit un jeu à quelques hôtes seulement | --limit table1 |
| always et never | deux tags spéciaux : toujours jouée, ou jamais sans demande | |
| Chiffrer | rendre un texte illisible sans le mot de passe | |
| Ansible Vault | l’outil d’Ansible qui chiffre des fichiers ou des valeurs | ansible-vault encrypt |
| Fichier de mot de passe | un fichier qui contient le mot de passe du coffre | --vault-password-file |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un tag choisit les tâches à jouer
Sans option, Ansible joue toutes les tâches. Avec --tags salle, il joue celles qui portent ce tag, plus celles de tag always. Avec --skip-tags, il en retire.
Une tâche de tag never ne part jamais d’elle-même. Elle part seulement si un de ses autres tags est demandé. L’option --list-tasks montre ce qui partirait, sans rien jouer.
Cinq tâches dans deux jeux
# service.yml : deux jeux, un hôte chacun
- hosts: four1
gather_facts: false
tasks:
- name: Allumer le four
ansible.builtin.debug: { msg: four allume }
tags: [cuisine]
- name: Compter les couverts
ansible.builtin.debug: { msg: couverts comptes }
tags: [salle, stock]
- name: Ouvrir la caisse
ansible.builtin.debug: { msg: caisse ouverte }
tags: [caisse, never]
- name: Noter la date
ansible.builtin.debug: { msg: date notee }
tags: always
- hosts: table1
gather_facts: false
tasks:
- name: Dresser les tables
ansible.builtin.debug: { msg: tables dressees }
tags: [salle]
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.
Écrire service.yml
printf -- '- hosts: four1\n gather_facts: false\n tasks:\n - name: Allumer le four\n ansible.builtin.debug: { msg: four allume }\n tags: [cuisine]\n - name: Compter les couverts\n ansible.builtin.debug: { msg: couverts comptes }\n tags: [salle, stock]\n - name: Ouvrir la caisse\n ansible.builtin.debug: { msg: caisse ouverte }\n tags: [caisse, never]\n - name: Noter la date\n ansible.builtin.debug: { msg: date notee }\n tags: always\n- hosts: table1\n gather_facts: false\n tasks:\n - name: Dresser les tables\n ansible.builtin.debug: { msg: tables dressees }\n tags: [salle]\n' > service.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.
Lister les tâches sans option
ansible-playbook -i four1,table1 -c local service.yml --list-tasks | grep "^ "Affiché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 les tâches du tag salle
ansible-playbook -i four1,table1 -c local service.yml --tags salle --list-tasks | grep "^ "Affiché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 les tâches du tag caisse
ansible-playbook -i four1,table1 -c local service.yml --tags caisse --list-tasks | grep "^ "Affiché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é : quelles tâches partent
| Option | Tâches de la cuisine | Pourquoi |
|---|---|---|
| aucune | four, couverts, date | caisse a le tag never |
| --tags salle | couverts, date | salle, plus always |
| --tags caisse | caisse, date | caisse est demandé, never ne bloque plus |
| --tags cuisine --skip-tags always | four | always est retiré |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
--limit réduit un jeu à quelques hôtes
Un tag choisit des tâches. --limit choisit des hôtes. Il ne peut qu’en retirer au jeu : il n’ajoute jamais un hôte que le jeu ne vise pas.
Ici, le premier jeu vise four1 et le second table1. Avec --limit table1, le premier n’a plus aucun hôte et ne joue rien.
Lister les hôtes avec une limite
ansible-playbook -i four1,table1 -c local service.yml --limit table1 --list-hosts | grep -E "^ +(four1|table1)$"Affiché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.
Vault chiffre un secret par mot de passe
ansible-vault encrypt remplace un fichier par sa version chiffrée. Sa première ligne devient $ANSIBLE_VAULT;1.1;AES256, et le reste est illisible.
Pour jouer un playbook qui lit ce fichier, on donne le mot de passe avec --vault-password-file. Ici, le mot de passe est un faux, écrit par la leçon.
Écrire un faux mot de passe
echo mot-de-passe-d-atelier > mdp.txtAffiché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 un secret de démonstration
printf 'cle_api: demo-cle-9042\n' > secret.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.
Chiffrer le fichier
ansible-vault encrypt --vault-password-file mdp.txt secret.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.
Lire la première ligne du fichier
head -n 1 secret.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.
Relire le secret avec le mot de passe
ansible-vault view --vault-password-file mdp.txt secret.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 un jeu qui lit le secret
printf -- '- hosts: localhost\n gather_facts: false\n vars_files:\n - secret.yml\n tasks:\n - name: Utiliser la cle\n ansible.builtin.debug:\n msg: "la cle a {{ cle_api | length }} caracteres"\n' > cle.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 avec le mot de passe
ansible-playbook -i localhost, -c local cle.yml --vault-password-file mdp.txt | 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.
Jouer sans le mot de passe
ansible-playbook -i localhost, -c local cle.yml 2>&1 | grep -m 1 -o "no vault secrets found"Affiché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 le mot de passe du coffre dans le même dépôt que le fichier chiffré. Le coffre est alors ouvert à quiconque lit le dépôt. Gardez le fichier de mot de passe hors du dépôt, et n’y mettez jamais une vraie valeur secrète en clair.
Pour aller plus loin
Ajoutez un tag cuisine à la tâche « Compter les couverts », puis lancez --tags cuisine --list-tasks. Quelles tâches partent maintenant ?
Retirez ensuite le tag always de « Noter la date ». Dites ce que --tags cuisine joue, et pourquoi une tâche de contrôle doit garder always.