В моем Ansible playbook есть следующее:
- name: "A: Check to see if we need to run task B"
[... implementation omitted, not relevant ...]
register: task_a_result
check_mode: no # even run in check mode
changed_when: no # this only reads/checks stuff
- name: "B: Write x to file"
shell: "echo {{ my_var|quote }} > /path/to/file"
when: task_a_result.stdout_lines[0].startswith('ABCDEF')
changed_when: yes # when run, it always changes the state
Я делаюнетхочу запустить B в режиме проверки (следовательно, нет check_mode: no
), но я хочуотчетэто как изменилось, если бы это было запущено в режиме без проверки. Я хочу такое поведение, потому чтоЯ не хочу сюрпризов при работе в режиме без проверки. Однако, несмотря на то, что changed_when: yes
я установил условие, Ansible продолжает показывать задачу какпропущенои поэтомунеизмененныймне:
skipping: [myhost] => changed=false msg: skipped, running in check mode
(Вышеуказанное относится к режиму проверки, а в обычном режиме без проверки сообщается «изменено».)
Я нашел этот отчет об ошибке, который, по-видимому, был неверно истолкован и закрыт ненадлежащим образом:14950, но я больше не могу это комментировать.
Я упускаю что-то элементарное? Другие модули обычно прекрасно сообщают о статусе «были бы изменены» в Ansible, но возможно ли это также для shell/command?
Использование Ansible 2.7.12 и 2.8.2 дает одинаковые результаты.
Я надеюсь избежать неприятных ошибок в самой команде, таких как:
- name: "B: Write x to file"
shell: "echo {{ my_var|quote }} {{ '>' if task_a_result.stdout_lines[0].startswith('ABCDEF') else '' }} /path/to/file"
when: task_a_result.stdout_lines[0].startswith('ABCDEF')
changed_when: yes
И да, я знаю, что могу записать в файл с помощью модулей копирования/шаблона, но, похоже, не могуперезаписатьфайлы с ним, например echo 1234 > /sys/module/zfs/parameters/zfs_arc_max
, потому что copy/template попытается заменить файл, который, как кажется, и установка параметра ядра не будет работать таким образом. И нет, этот параметр модуля ядра не отображается через sysctl в Linux.
решение1
Я знаю, что это немного устарело, но я ищу решение этой проблемы. Я также устал от сюрпризов с командным модулем в качестве OP.
Что если мы изменим часть 'команда' так, чтобы она выполняла другую команду в режиме проверки. И мы всегда будем запускать задачу, даже в режиме проверки.
Примечание: Прежде чем вы начнете жаловаться, я знаю, что это плохой пример. Я знаю, что в модуле «command» есть опция «creates». Это просто пример.
Вот мое решение на данный момент:
- name: Get some info
stat: {path: /tmp/somefile}
register: file_info
- name: Run the command conditionally
command:
"{{ 'true' if (file_info['stat']['exists'] or ansible_check_mode)
else 'touch /tmp/somefile' }}"
changed_when: not file_info['stat']['exists']
check_mode: false
Работает, но раздут.
Пожалуйста, сообщите мне, есть ли лучшие решения.
решение2
У меня похожая потребность. Я хотел бы посмотреть, будет ли команда запущена так, чтобы я не получил сюрпризов, если не запустить ее в режиме проверки.
В качестве обходного пути я добавил задачу отладки, сообщающую о том, что произойдет изменение, и использовал условие when из задачи command, чтобы установить changed_when в задаче отладки, т. е.
- name: "Report pending change"
debug:
msg: "Change pending"
changed_when: task_a_result.stdout_lines[0].startswith('ABCDEF')
when: ansible_check_mode|bool