Сообщение об ошибке
анзибль 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, если у вас есть дополнительные вопросы, и мы будем рады помочь с этим.
Спасибо!
В итоге я использовал:
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
чтобы обойти это.
Самый полезный комментарий
Привет!
Это немного недоразумение, но здесь условное выражение оценивается для каждого элемента, что является необходимой функцией. Чтобы оценить его для каждого элемента, он должен начинаться с чего-то, для чего он может повторяться.
Таким образом, вы можете сделать что-то вроде:
with_dict: "{{users_deleted | default ({})}}"
Что должно помочь решить эту проблему.
Это также позволит вам удалить предложение when, потому что список будет иметь нулевую длину, а не неопределенный.
Не стесняйтесь заходить в ansible-project, если у вас есть дополнительные вопросы, и мы будем рады помочь с этим.
Спасибо!