Comprendre la condition Ansible basée sur un booléen avec la syntaxe "is"
J'essaie de comprendre la logique de la syntaxe de la condition basée sur le booléen dans les tâches ansibles.
playbook.yml
- hosts: localhost
gather_facts: no
tasks:
- name: stat module
stat:
path: playbook.yml
register: output_stat
#DEBUG
- debug:
var: output_stat.changed
- debug:
var: output_stat.stat.exists
#CONDITION
- name: debug condition on output_stat is changed
debug:
msg: "output_stat is changed"
when: output_stat is changed
- name: debug condition on output_stat.stat is exists
debug:
msg: "file exists"
when: output_stat.stat is exists
Exécuter le playbook avec ansible-playbook playbook.yml
la sortie de console suivante :
PLAY [localhost] *********************************************************************************************************************************************
TASK [stat module] *******************************************************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.022) 0:00:00.022 ********
ok: [localhost]
TASK [debug] *************************************************************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.385) 0:00:00.408 ********
ok: [localhost] => {
"output_stat.changed": false
}
TASK [debug] *************************************************************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.037) 0:00:00.445 ********
ok: [localhost] => {
"output_stat.stat.exists": true
}
TASK [debug condition on output_stat is changed] *************************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.036) 0:00:00.482 ********
skipping: [localhost]
TASK [debug condition on output_stat.stat is exists] *********************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.037) 0:00:00.520 ********
fatal: [localhost]: FAILED! => {"msg": "The conditional check 'output_stat.stat is exists' failed. The error was: Unexpected templating type error occurred on ({% if output_stat.stat is exists %} True {% else %} False {% endif %}): coercing to Unicode: need string or buffer, dict found\n\nThe error appears to be in '/tmp/test/playbook.yml': line 23, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: debug condition on output_stat.stat is exists\n ^ here\n"}
PLAY RECAP ***************************************************************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=1 skipped=1 rescued=0 ignored=0
Pourquoi la première condition "output_stat est modifié" fonctionne-t-elle, mais pas la seconde "output_stat.stat existe". Je ne comprends pas car ils font tous deux référence à des valeurs booléennes.
Je comprends que je pourrais utiliser
- name: debug condition on output_stat is changed
debug:
msg: "output_stat is changed"
when: output_stat.changed
- name: debug condition on output_stat.stat is exists
debug:
msg: "file exists"
when: output_stat.stat.exists
au lieu de le faire fonctionner, donc je ne cherche pas de solution. Je me demande vraiment comment le "est échoué" ne donne aucune erreur et le "existe" le fait... Est-ce lié à un comportement ansible très spécifique?
Solution du problème
is changed
est un test Jinja2 fourni par Ansible: https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html#testing-task-results
Son implémentation est un peu plus avancée que le simple test de la valeur booléenne du champ changed
présent sur chaque résultat.
Ce test est un moyen plus pratique de vérifier si une tâche est dans l'état modifié.
D'autre part, exists
n'est qu'un simple champ du champ stat
dans le résultat d'une tâche stat
. Ce champ est un booléen comme documenté dans la doc du module.
Ce champ ne peut être testé directement qu'en tant que booléen.
Commentaires
Enregistrer un commentaire