Ansible: Utiliser with_dict et quand ne saute pas la tâche lorsqu'il n'est pas défini

Créé le 11 août 2014  ·  3Commentaires  ·  Source: ansible/ansible

Type de probleme:

Rapport d'erreur

Version Ansible :

ansible 1.7

Environnement:

Exécution du système d'exploitation à partir de : OSX 10.9
Gestion : Ubuntu 14.04

Sommaire:

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.

Étapes à reproduire :

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 attendus:

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
Résultats actuels:
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

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!

Tous les 3 commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes