Gestion de l'option changed_when dans Ansible
Petite astuce rapide. Sous Ansible, j'ai voulu supprimer le contenu d'un répertoire (suite à la décompression d'une archive) et je voulais faire le ménage dedans sauf une certaine liste de fichier.
Pour se faire, je passe pas une commande shell et un register pour pouvoir ensuite itérer sur ces fichiers.
Seul petit problème, la tache Récupération fichier à supprimer du répertoire m'indique tout le temps qu'il y a eu un changement alors qu'en réalité non.
Ci-dessous un exemple pour illustrer ça :
Si on l'applique à notre cas, notre main.yml ressemble maintenant à la chose suivante :
Dorénavant mes appels ne marquent plus cette tâche comme ayant changée quelque chose.
Pour se faire, je passe pas une commande shell et un register pour pouvoir ensuite itérer sur ces fichiers.
Le playbook
Ci-dessous mon playbook :- name: "Récupération fichier à supprimer du répertoire" shell: ls -1 /tmp/emplacement/*.xml | grep -v un-fichier.xml | cat register: files_to_remove - name: "Ménage dans le répertoire." file: name={{item}} state=absent with_items: files_to_remove.stdout_lines
Seul petit problème, la tache Récupération fichier à supprimer du répertoire m'indique tout le temps qu'il y a eu un changement alors qu'en réalité non.
Ci-dessous un exemple pour illustrer ça :
TASK: [task | Récupération fichier à supprimer du répertoire] ** changed: [localhost] TASK: [task | Ménage dans le répertoire.] ********************** ok: [localhost] PLAY RECAP ***************************************************** localhost : ok=1 changed=1 unreachable=0 failed=0
Bloquer ce faux changement
Dans ce cas, il est intéressant d'utiliser l'option changed_when avec une condition afin de dire à Ansible que ma commande n'a rien modifiée (ici, ça sera False systématiquement).Si on l'applique à notre cas, notre main.yml ressemble maintenant à la chose suivante :
- name: "Récupération fichier à supprimer du répertoire" shell: ls -1 /tmp/emplacement/*.xml | grep -v un-fichier.xml | cat register: files_to_remove changed_when: False - name: "Ménage dans le répertoire." file: name={{item}} state=absent with_items: files_to_remove.stdout_lines
Dorénavant mes appels ne marquent plus cette tâche comme ayant changée quelque chose.
TASK: [task | Récupération fichier à supprimer du répertoire] ** ok: [localhost] TASK: [task | Ménage dans le répertoire.] ********************** ok: [localhost] PLAY RECAP ************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0