Ansible - когда условие не работает с метазадачей

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

Задачи

- name: "This is my task"
  command: "{{ path to conda }} {{ script }}"
  register: check
  until: check is succeeded
  retries: 5
  no_log: false

- name: "End this play if the script ran successfully on 1 remote target"
  meta: end_play
  when: 
    - check is succeeded

ошибка

ОШИБКА! Условная проверка "проверка выполнена успешно" не удалась. Ошибка заключалась в следующем: в неудавшемся тесте ожидается словарь. Похоже, что ошибка была в '/path/to/roles/tasks/main.yml': строка 9, столбец 3, но может быть в другом месте файла в зависимости от точного синтаксиса проблема. Оскорбительная строка выглядит так: - name: "Завершите эту игру, если сценарий успешно выполнил на 1 удаленной цели" ^ здесь

Обновление (обмен для доработки)

Совместное использование предписанного обходного пути. В моем случае использования я, по сути, хотел "попробовать" задачу на всем инвентаре, пока не добился успеха.

Закончился использованием host vars. Это всегда будет пытаться выполнить задачу, если это 1-й хост в инвентаре, и будет "оглядываться" на попытку предыдущего хоста, прежде чем принять решение о повторном выполнении на следующем хосте inv.

# my task
- name: "Attempt this task on each host if unsuccessful"
  raw: "raw_command_here_as_remote_host_is_using_rbash"
  register: status
  when: >
    inventory_hostname == ansible_play_hosts_all[0] or
    hostvars [ ansible_play_hosts_all [ groups ['my_host_group'].index(inventory_hostname) | int - 1 ] ] ['stop_it'] == 'false'
  ignore_errors: yes
  until: status is succeeded
  retries: 1

- set_fact:
    stop_it: true
    cacheable: yes
  when: status is succeeded

- set_fact:
    stop_it: false
    cacheable: yes
  when: status is not succeeded

1 ответ

Решение

Обновление (поделиться ответом для завершения)

Совместное использование предписанного обходного пути. В моем случае использования я, по сути, хотел "попробовать" задачу на всем инвентаре, пока не добился успеха.

Закончился использованием host vars. Это всегда будет пытаться выполнить задачу, если это 1-й хост в инвентаре, и будет "оглядываться" на попытку предыдущего хоста, прежде чем принять решение о повторном выполнении на следующем хосте inv.

# my task
- name: "Attempt this task on each host if unsuccessful"
  raw: "raw_command_here_as_remote_host_is_using_rbash"
  register: status
  when: >
    inventory_hostname == ansible_play_hosts_all[0] or
    hostvars [ ansible_play_hosts_all [ groups ['my_host_group'].index(inventory_hostname) | int - 1 ] ] ['stop_it'] == 'false'
  ignore_errors: yes
  until: status is succeeded
  retries: 1

- set_fact:
    stop_it: true
    cacheable: yes
  when: status is succeeded

- set_fact:
    stop_it: false
    cacheable: yes
  when: status is not succeeded
Другие вопросы по тегам