Ansible - Когда условие не работает с мета-задачей - PullRequest
0 голосов
/ 12 февраля 2020

У меня возникли проблемы с использованием условия 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 удаленной цели» ^ здесь

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

Обмен предписанным обходным путем. В моем сценарии использования я, по сути, хотел «попробовать» задачу по всему инвентару до тех пор, пока успешно

не закончится использованием хостов. Это всегда будет пытаться выполнить задачу, если она является первым хостом в инвентаре, и будет «оглядываться назад» на предыдущую попытку хоста, прежде чем принять решение выполнить ее снова на следующем инв хосте.

# 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 Ответ

0 голосов
/ 28 апреля 2020

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

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

не закончится использованием хостов. Это всегда будет пытаться выполнить задачу, если она является первым хостом в инвентаре, и будет «оглядываться назад» на предыдущую попытку хоста, прежде чем принять решение выполнить ее снова на следующем инв хосте.

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...