Ansible: Использование with_dict и когда не пропускает задачу, когда не определено

Созданный на 11 авг. 2014  ·  3Комментарии  ·  Источник: ansible/ansible

Тип проблемы:

Сообщение об ошибке

Версия Ansible:

анзибль 1.7

Среда:

Запуск ОС от: OSX 10.9
Управление: Ubuntu 14.04

Резюме:

Когда задача используется с with_dict и when и значение when имеет значение false, ansible пытается проверить значение dict и терпит неудачу, когда следует пропустить задачу.

Действия по воспроизведению:

хосты:

[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

команда: ansible-playbook -i hosts playbook.yml
Я не определил users_deleted, поэтому эту задачу следует пропустить.
В playbook.yml, если вы измените «with_dict» на «with_items», задача будет пропущена правильно.

Ожидаемые результаты:

Результаты выполнения задачи с использованием with_items вместо 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

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

Привет!

Это немного недоразумение, но здесь условное выражение оценивается для каждого элемента, что является необходимой функцией. Чтобы оценить его для каждого элемента, он должен начинаться с чего-то, для чего он может повторяться.

Таким образом, вы можете сделать что-то вроде:

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

Что должно помочь решить эту проблему.

Это также позволит вам удалить предложение when, потому что список будет иметь нулевую длину, а не неопределенный.

Не стесняйтесь заходить в ansible-project, если у вас есть дополнительные вопросы, и мы будем рады помочь с этим.

Спасибо!

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

Привет!

Это немного недоразумение, но здесь условное выражение оценивается для каждого элемента, что является необходимой функцией. Чтобы оценить его для каждого элемента, он должен начинаться с чего-то, для чего он может повторяться.

Таким образом, вы можете сделать что-то вроде:

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

Что должно помочь решить эту проблему.

Это также позволит вам удалить предложение when, потому что список будет иметь нулевую длину, а не неопределенный.

Не стесняйтесь заходить в ansible-project, если у вас есть дополнительные вопросы, и мы будем рады помочь с этим.

Спасибо!

В итоге я использовал:
with_dict: users_deleted | дефолт({})

Это работает, как ожидалось, и пропускает задачу. Как пользователя это немного сбивало с толку, так как я ожидал, что смогу постоянно использовать «когда:», когда мне нужно условное выражение для задачи. Спасибо, что разъяснили это!

Я все еще получаю эту ошибку в версии 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"}

Мне нужно использовать ignore_errors чтобы обойти это.

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