Ansible: Usando with_dict e when não pula tarefa quando indefinido

Criado em 11 ago. 2014  ·  3Comentários  ·  Fonte: ansible/ansible

Tipo de problema:

Relatório de erro

Versão Ansible:

ansible 1.7

Ambiente:

Executando o sistema operacional a partir de: OSX 10.9
Gerenciamento: Ubuntu 14.04

Resumo:

Quando uma tarefa é usada com "with_dict" e "when" e o valor de when é avaliado como falso, o ansible tenta verificar se há um valor dict e falha quando deveria pular a tarefa.

Passos para reproduzir:

hosts:

[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
Não defini users_deleted, portanto, esta tarefa deve ser ignorada.
Em playbook.yml, se você alterar "with_dict" para "with_items", a tarefa será ignorada corretamente.

Resultados esperados:

Resultados da execução da tarefa usando "with_items" em vez 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 reais:
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

Comentários muito úteis

Oi!

Isso é um pouco mal-entendido, mas a condicional aqui é avaliada para cada um dos itens, o que é um recurso necessário. Para avaliá-lo para cada item, ele deve começar com algo para o qual possa iterar.

Sendo assim, você pode desejar fazer algo como:

with_dict: "{{users_deleted | default ({})}}"

O que deve ajudar a resolver isso.

Também permitiria remover a cláusula when porque a lista teria comprimento zero em vez de indefinida.

Sinta-se à vontade para visitar ansible-project se tiver mais perguntas e ficaremos felizes em ajudar com esta.

Obrigado!

Todos 3 comentários

Oi!

Isso é um pouco mal-entendido, mas a condicional aqui é avaliada para cada um dos itens, o que é um recurso necessário. Para avaliá-lo para cada item, ele deve começar com algo para o qual possa iterar.

Sendo assim, você pode desejar fazer algo como:

with_dict: "{{users_deleted | default ({})}}"

O que deve ajudar a resolver isso.

Também permitiria remover a cláusula when porque a lista teria comprimento zero em vez de indefinida.

Sinta-se à vontade para visitar ansible-project se tiver mais perguntas e ficaremos felizes em ajudar com esta.

Obrigado!

Acabei usando:
with_dict: users_deleted | predefinição({})

Isso funciona conforme o esperado e pula a tarefa. Como usuário, isso foi um pouco confuso, pois eu esperaria poder usar "quando:" de forma consistente quando preciso de uma condicional para uma tarefa. Obrigado por esclarecer isso!

Ainda recebo este erro na versão 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"}

Tenho que usar ignore_errors para contornar isso.

Esta página foi útil?
0 / 5 - 0 avaliações