Rapport d'erreur
ansible 1.7
Exécution du système d'exploitation à partir de : OSX 10.9
Gestion : Ubuntu 14.04
Lorsqu'une tâche est utilisée avec "with_dict" et "when" et que la valeur de when est évaluée à false, ansible essaie de rechercher une valeur dict et échoue lorsqu'il doit ignorer la tâche.
hôtes :
[test]
testhost
playbook.yml :
- hosts: all
tasks:
- name: Delete a user
user: name="{{item}}" state=absent
when: users_deleted is defined
with_dict: users_deleted
commande : ansible-playbook -i hosts playbook.yml
Je n'ai pas défini users_deleted donc cette tâche doit être ignorée.
Dans playbook.yml, si vous remplacez "with_dict" par "with_items", la tâche est ignorée correctement.
Résultats de l'exécution de la tâche en utilisant "with_items" au lieu de "with_dict":
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [testhost]
TASK: [Delete a user] *********************************************************
skipping: [testhost] => (item=users_deleted)
PLAY RECAP ********************************************************************
testhost : ok=2 changed=0 unreachable=0 failed=0
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [testhost]
TASK: [Delete a user] *********************************************************
fatal: [testhost] => with_dict expects a dict
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
testhost : ok=1 changed=0 unreachable=1 failed=0
Salut!
C'est un peu un malentendu, mais le conditionnel ici est évalué pour chaque élément, ce qui est une fonctionnalité nécessaire. Afin de l'évaluer pour chaque élément, il doit commencer par quelque chose pour lequel il peut itérer.
En tant que tel, vous voudrez peut-être faire quelque chose comme :
with_dict : "{{ users_deleted | default({}) }}"
Ce qui devrait aider à résoudre ce problème.
Cela vous permettrait également de supprimer la clause when car la liste serait de longueur nulle au lieu d'être indéfinie.
N'hésitez pas à passer par ansible-project si vous avez d'autres questions et nous serions heureux de vous aider avec celle-ci.
Merci!
J'ai fini par utiliser :
with_dict : users_deleted | défaut({})
Cela fonctionne comme prévu et ignore la tâche. En tant qu'utilisateur, c'était un peu déroutant car je m'attendrais à pouvoir utiliser "quand:" de manière cohérente lorsque j'ai besoin d'un conditionnel pour une tâche. Merci d'avoir clarifié ça !
J'ai toujours cette erreur dans la version 2.0.1.0
[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future
release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {"failed": true, "msg": "with_dict expects a dict"}
Je dois utiliser ignore_errors
pour le contourner.
Commentaire le plus utile
Salut!
C'est un peu un malentendu, mais le conditionnel ici est évalué pour chaque élément, ce qui est une fonctionnalité nécessaire. Afin de l'évaluer pour chaque élément, il doit commencer par quelque chose pour lequel il peut itérer.
En tant que tel, vous voudrez peut-être faire quelque chose comme :
with_dict : "{{ users_deleted | default({}) }}"
Ce qui devrait aider à résoudre ce problème.
Cela vous permettrait également de supprimer la clause when car la liste serait de longueur nulle au lieu d'être indéfinie.
N'hésitez pas à passer par ansible-project si vous avez d'autres questions et nous serions heureux de vous aider avec celle-ci.
Merci!