Подтвердить что ты не робот

Использование `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, если вам интересно.

4b9b3361

Ответ 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 для указания этого.