Ansible: Usando with_dict y when no omite la tarea cuando no está definido

Creado en 11 ago. 2014  ·  3Comentarios  ·  Fuente: ansible/ansible

Tipo de problema:

Informe de error

Versión Ansible:

ansible 1.7

Medio ambiente:

Ejecutando SO desde: OSX 10.9
Administración: Ubuntu 14.04

Resumen:

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.

Pasos para reproducir:

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

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
Resultados actuales:
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

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!

Todos 3 comentarios

¡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.

¿Fue útil esta página
0 / 5 - 0 calificaciones