Ansible: 'objeto dict' não tem atributo na cláusula when 2.3 RC1

Criado em 17 mar. 2017  ·  2Comentários  ·  Fonte: ansible/ansible

TIPO DE PROBLEMA
  • Relatório de erro
NOME DO COMPONENTE

testemunho

VERSÃO ANSÍVEL
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)]
CONFIGURAÇÃO

Padrão

OS / MEIO AMBIENTE

RHEL 6.7

RESUMO

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.

PASSOS PARA REPRODUZIR

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
RESULTADOS ESPERADOS

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
RESULTADOS REAIS
- O que realmente aconteceu? Se possível, execute com verbosidade extra (-vvvv)

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
affects_2.3 bug

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 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!

Todos 2 comentários

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 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!

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