Я новичок в 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
как только возможно.)