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

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

В моем сборнике 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