Использование `fail_when` в задаче` with_items` в зависимости от кодов возврата
Я пытаюсь написать задачу, которая запускает список операторов ldapmodify и только хочет, чтобы она завершилась неудачей, если какой-либо из кодов возврата не равен 0 или 68 (объект уже существует):
- name: add needed LDAP infrastructure
action: command ldapmodify -x -D '{{ ADMINDN }}' -w '{{ LDAPPW }}' -H {{ LDAPURI }} -c -f {{ item }}
register: result
failed_when: "result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0"
# ignore_errors: true
with_items:
- a.ldif
- b.ldif
Не работает, создавая ошибку:
error while evaluating conditional: result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0
Однако, если я комментирую failed_when
и использую ignore_errors
, следующие задачи дают правильные результаты. Хотя я могу использовать это решение для решения моей проблемы, я хотел бы понять, почему версия failed_when
не работает, поскольку я бы нашел, что более элегантный.
- debug: var="result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0"
- fail: msg="failure during ldapmodify"
when: "result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0"
Sidenote sameas
может быть equalto
в других версиях jinja2, если вам интересно.
Ответы
Ответ 1
Ну, оказывается, я слишком много думал об этом. Проблема заключалась в следующем: Ansible запускает failed_when
после каждой итерации цикла. Поэтому мне просто нужно получить доступ к result.rc
:
- name: add needed LDAP infrastructure
action: command ldapmodify -x -D '{{ ADMINDN }}' -w '{{ LDAPPW }}' -H {{ LDAPURI }} -c -f {{ item }}
register: result
# As per comment from user "ypid"
failed_when: ( result.rc not in [ 0, 68 ] )
# failed_when: ( result.rc != 0 ) and ( result.rc != 68 )
with_items:
- a.ldif
- b.ldif
создает желаемый результат.
После цикла переменная result
заполняется сводным словарем, который содержит сведения о каждом элементе в results
.
Но так как я не смог найти примеры использования result.results
с цепочками фильтров, я просто оставлю этот вопрос, надеясь, что кто-то может найти его полезным. (Я уверен, что в конечном итоге я захочу снова посмотреть его еще раз;))
Благодаря sivel на #ansible для указания этого.