Как сообщить об изменении команды/задачи оболочки Ansible в режиме проверки?

Как сообщить об изменении команды/задачи оболочки Ansible в режиме проверки?

В моем 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

Связанный контент