testemunho
ansible 2.3.0.0 (stable-2.3 923c9ef17c) last updated 2017/03/17 09:12:40 (GMT +1000)
config file = /apps/dev/playbook/jordan/mr-ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.12 (default, Sep 23 2016, 14:23:49) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]
Padrão
RHEL 6.7
Isso pode não ser um bug, mas apenas algo que consegui em versões mais antigas, mas com Ansible 2.3 RC1 se estou verificando se uma variável registrada por um módulo (com uma cláusula when) está definida e, em seguida, obter um valor de subdict que irá falhar em 2.3 enquanto em 2.2 e abaixo funciona bem. Isso acontece especificamente quando o módulo que registra a variável é ignorado por qualquer motivo e, em seguida, uma tarefa subsequente verifica se a variável está definida e, em seguida, obtém a subchave.
Manual de exemplo
---
- name: test
hosts: localhost
connection: local
tasks:
- name: module that won't run
stat:
path: /apps/tmp
register: test
when: False
- name: debug of var
debug:
var: test
- name: test with conditional
debug:
msg: A
when: test is defined and test.stat.exists
Ao usar o Ansible 2.2.1.0
ansible 2.2.1.0
config file = /cygdrive/d/dev/jordan/ansible.cfg
configured module search path = Default w/o overrides
PLAY [test] ********************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [module that won't run] ***************************************************
task path: /cygdrive/d/dev/jordan/2.3tests.yml:7
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}
TASK [debug of var] ************************************************************
task path: /cygdrive/d/dev/jordan/2.3tests.yml:13
ok: [localhost] => {
"test": {
"changed": false,
"skip_reason": "Conditional check failed",
"skipped": true
}
}
TASK [test with conditional] ***************************************************
task path: /cygdrive/d/dev/jordan/2.3tests.yml:17
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
PLAY [test] ************************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
Friday 17 March 2017 15:20:42 +1000 (0:00:00.039) 0:00:00.039 **********
ok: [localhost]
META: ran handlers
TASK [module that won't run] *******************************************************************************************************************************************************
task path: /apps/dev/playbook/jordan/mr-ansible/test.yml:7
Friday 17 March 2017 15:20:44 +1000 (0:00:01.093) 0:00:01.133 **********
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False", "skipped": true}
TASK [debug of var] ****************************************************************************************************************************************************************
task path: /apps/dev/playbook/jordan/mr-ansible/test.yml:13
Friday 17 March 2017 15:20:44 +1000 (0:00:00.012) 0:00:01.145 **********
ok: [localhost] => {
"changed": false,
"test": {
"changed": false,
"skip_reason": "Conditional result was False",
"skipped": true
}
}
TASK [test with conditional] *******************************************************************************************************************************************************
task path: /apps/dev/playbook/jordan/mr-ansible/test.yml:17
Friday 17 March 2017 15:20:44 +1000 (0:00:00.034) 0:00:01.180 **********
fatal: [localhost]: FAILED! => {"failed": true, "msg": "The conditional check 'test is defined and test.stat.exists' failed. The error was: error while evaluating conditional (test is defined and test.stat.exists): 'dict object' has no attribute 'stat'\n\nThe error appears to have been in '/apps/dev/playbook/jordan/mr-ansible/test.yml': line 17, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: test with conditional\n ^ here\n"}
PLAY RECAP *************************************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=1
Oi!
Muito obrigado por seu envio para a Ansible. Sinceramente, significa muito para nós.
Acreditamos que o tíquete que você solicitou está sendo mal interpretado, pois uma coisa funciona de maneira um pouco diferente do que foi declarado.
No futuro, este pode ser um tópico mais adequado para a lista de usuários, que você também pode postar aqui se desejar mais ajuda com o acima.
Já que você está pulando a tarefa 'stat', você ainda obtém test
como um dicionário definido, mas ele não possui uma chave stat
razão pela qual você obtém a mensagem de erro CORRETA. Para evitar problemas como este, você precisa:
when: test is defined and 'stat' in test and test.stat.exists
Obrigado mais uma vez por isso e pelo seu interesse na Ansible!
Confirmação dividida que alterou este comportamento https://github.com/ansible/ansible/commit/81aa12eb1b5a2b50ac9234ca0b05c015af88a845
Problema relacionado https://github.com/ansible/ansible/issues/18514
Comentários muito úteis
Possível mal-entendido
Oi!
Muito obrigado por seu envio para a Ansible. Sinceramente, significa muito para nós.
Acreditamos que o tíquete que você solicitou está sendo mal interpretado, pois uma coisa funciona de maneira um pouco diferente do que foi declarado.
No futuro, este pode ser um tópico mais adequado para a lista de usuários, que você também pode postar aqui se desejar mais ajuda com o acima.
Já que você está pulando a tarefa 'stat', você ainda obtém
test
como um dicionário definido, mas ele não possui uma chavestat
razão pela qual você obtém a mensagem de erro CORRETA. Para evitar problemas como este, você precisa:Obrigado mais uma vez por isso e pelo seu interesse na Ansible!