Назад | Перейти на главную страницу

Выполнить задачу Ansible по условию и завершиться ошибкой, если условие не выполнено

Я новичок в Ansible, и у меня возникла проблема. Я хочу запустить модуль, только если условие выполнено, но если условие не выполнено, он должен не выполнить задачу и сообщить пользователю. В настоящее время то, что я сделал, он просто пропустит, а не потерпит неудачу.

Ниже мой код, у меня есть условие when для проверки и запуск только в том случае, если result.stdout == 'valid', но я хочу завершить задачу, если она 'недействительна'. В настоящее время она просто пропускает ее, если условие не выполняется.

---
- name: Check Value
  become: yes
  shell: /usr/bin/python3 check.py
  args:
    chdir: "mydir/scripts/"
  register: result
  tags: data_merge

- name: Merge Data
  become: yes
  when: result.stdout == 'valid'
  local_action:
    module: some_module
    provider: "{{some_provider}}"
    role_path: "{{role_path}}"
  run_once: true
  tags: data_merge

У вас есть три варианта:

Использовать failed_when чтобы сценарий не проверял условие. Я бы предложил добавить код выхода в скрипт python (например: exit(255 if error else 0)), это чище, чем разбор stdout:

- name: Check Value
  shell: /usr/bin/python3 check.py
  args:
    chdir: "mydir/scripts/"
  register: result
  failed_when: result.rc != 0
  tags: data_merge

fail убьет приложение, выводящее сообщение об ошибке:

- name: Fail on not valid
  fail:
    msg: failed
  when: result.stdout != 'valid'

meta: end_play молча остановит приложение (но это может быть бесполезно, если вы хотите получить обратную связь)

- name: Stop on not valid
  meta: end_play
  when: result.stdout != 'valid'

В любом случае вам не нужен when: result.stdout == 'valid' в Объединить данные больше.

Вы должны явно потерпеть неудачу в этом сценарии.

- name: Fail when value is not valid
  fail:
    msg: "A custom message to tell the user what went wrong"
  when: result.stdout != 'valid'

Вы также можете просто проверить результат прямо в игре, которая запускает ваш сценарий проверки.

- name: Check Value
  become: yes
  shell: /usr/bin/python3 check.py
  args:
    chdir: "mydir/scripts/"
  register: result
  tags: data_merge
  failed_when: "'invalid' in result.stdout"

Вам следует подумать об использовании кодов выхода в вашем приложении для обозначения успеха или неудачи, как это уже делает большинство программ. Это делает проверку более надежной, чем проверка текста на стандартном выводе. Использовать sys.exit() в Python для этого. В этом случае проверка на отказ - это просто, когда result.rc != 0.

(И, конечно, вы должны использовать command вместо того shell как только возможно.)