Informe de error
ansible 1.7
Ejecutando SO desde: OSX 10.9
Administración: Ubuntu 14.04
Cuando una tarea se usa con "with_dict" y "when" y el valor de when se evalúa como falso, ansible intenta buscar un valor de dict y falla cuando debería omitir la tarea.
Hospedadores:
[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
comando: ansible-playbook -i hosts playbook.yml
No he definido users_deleted, por lo que esta tarea debería omitirse.
En playbook.yml, si cambia "with_dict" a "with_items", la tarea se omite correctamente.
Resultados de ejecutar la tarea usando "with_items" en lugar 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
¡Hola!
Esto es un poco malentendido, pero el condicional aquí se evalúa para todos y cada uno de los elementos, que es una característica necesaria. Para evaluarlo para cada elemento, debe comenzar con algo por lo que pueda iterar.
Como tal, es posible que desee hacer algo como:
with_dict: "{{users_deleted | default ({})}}"
Lo que debería ayudar a resolver esto.
También le permitiría eliminar la cláusula when porque la lista tendría una longitud cero en lugar de indefinida.
No dude en visitar ansible-project si tiene más preguntas y estaremos encantados de ayudarle con esta.
¡Gracias!
Terminé usando:
with_dict: users_deleted | defecto({})
Esto funciona como se esperaba y omite la tarea. Como usuario, esto fue un poco confuso, ya que esperaría poder usar "when:" consistentemente cuando necesito un condicional para una tarea. ¡Gracias por aclarar esto!
Sigo recibiendo este error en la versión 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"}
Tengo que usar ignore_errors
para omitirlo.
Comentario más útil
¡Hola!
Esto es un poco malentendido, pero el condicional aquí se evalúa para todos y cada uno de los elementos, que es una característica necesaria. Para evaluarlo para cada elemento, debe comenzar con algo por lo que pueda iterar.
Como tal, es posible que desee hacer algo como:
with_dict: "{{users_deleted | default ({})}}"
Lo que debería ayudar a resolver esto.
También le permitiría eliminar la cláusula when porque la lista tendría una longitud cero en lugar de indefinida.
No dude en visitar ansible-project si tiene más preguntas y estaremos encantados de ayudarle con esta.
¡Gracias!