Ansible: 'dict object' не имеет атрибута в разделе 2.3 RC1

Созданный на 17 мар. 2017  ·  2Комментарии  ·  Источник: ansible/ansible

ТИП ПРОБЛЕМЫ
  • Сообщение об ошибке
КОМПОНЕНТ НАЗВАНИЕ

ядро

ДОСТУПНАЯ ВЕРСИЯ
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)]
КОНФИГУРАЦИЯ

Стандарт

ОС / СРЕДА

RHEL 6.7

РЕЗЮМЕ

Возможно, это не ошибка, а просто то, что мне удалось в старых версиях, но с Ansible 2.3 RC1, если я проверяю, определена ли переменная, зарегистрированная модулем (с предложением when), а затем получаю значение sub dict, она будет не работает в 2.3, а в 2.2 и ниже работает нормально. В частности, это происходит, когда модуль, который регистрирует переменную, пропускается по какой-либо причине, а затем последующая задача проверяет, определена ли переменная, а затем получает подключа.

ДЕЙСТВИЯ ПО ВОСПРОИЗВЕДЕНИЮ

Пример сценария

---
- 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
ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ

При использовании 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
ФАКТИЧЕСКИЕ РЕЗУЛЬТАТЫ
- Что на самом деле произошло? Если возможно, запустите с дополнительной детализацией (-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

Самый полезный комментарий

Возможное недоразумение

Привет!

Большое спасибо за отправку в Ansible. Это очень много значит для нас.

Мы считаем, что поданный вами билет неправильно поняли, поскольку одно работает немного иначе, чем указано.

В будущем эта тема может быть более подходящей для списка пользователей, который вы также можете опубликовать здесь, если вам нужна дополнительная помощь с указанным выше.

Поскольку вы пропускаете задачу 'stat', вы все равно получаете test в качестве определенного словаря, но в нем нет ключа stat , поэтому вы получаете сообщение об ошибке CORRECT. Чтобы избежать подобных проблем, вам необходимо:

  when: test is defined and 'stat' in test and test.stat.exists

Еще раз спасибо за это и за проявленный интерес к Ansible!

Все 2 Комментарий

Возможное недоразумение

Привет!

Большое спасибо за отправку в Ansible. Это очень много значит для нас.

Мы считаем, что поданный вами билет неправильно поняли, поскольку одно работает немного иначе, чем указано.

В будущем эта тема может быть более подходящей для списка пользователей, который вы также можете опубликовать здесь, если вам нужна дополнительная помощь с указанным выше.

Поскольку вы пропускаете задачу 'stat', вы все равно получаете test в качестве определенного словаря, но в нем нет ключа stat , поэтому вы получаете сообщение об ошибке CORRECT. Чтобы избежать подобных проблем, вам необходимо:

  when: test is defined and 'stat' in test and test.stat.exists

Еще раз спасибо за это и за проявленный интерес к Ansible!

Разделенная на две части фиксация, изменившая это поведение https://github.com/ansible/ansible/commit/81aa12eb1b5a2b50ac9234ca0b05c015af88a845
Связанная проблема https://github.com/ansible/ansible/issues/18514

Была ли эта страница полезной?
0 / 5 - 0 рейтинги