Relatório de erro
ansible 1.7
Executando o sistema operacional a partir de: OSX 10.9
Gerenciamento: Ubuntu 14.04
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.
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 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
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
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.
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!