В моем сборнике Ansible у меня есть следующее:
- 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, но возможно ли это также для оболочки / команды?
Использование 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
, потому что копия / шаблон попытается заменить файл, который кажется, и установка параметра ядра не будет работать так. И нет, этот параметр модуля ядра не предоставляется через sysctl в Linux.
У меня такая же потребность. Я хотел бы посмотреть, будет ли команда запущена, чтобы не было сюрпризов, если я не запустил ее в режиме проверки.
В качестве обходного пути я добавил задачу отладки, сообщающую, что будет изменение, и использовал условие when из задачи команды, чтобы установить 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