Как создать Ansible «пре-обработчик», который запускается перед задачей, но только если задача должна быть запущена? - PullRequest
2 голосов
/ 28 сентября 2019

Как мне создать Ansible «пре-обработчик», который запускается перед задачей, но только если задача должна быть запущена?Другими словами, Ansible сначала проверит, нужно ли запускать задачу.Если это так, он запускает предварительный обработчик, а затем запускает задачу.Если задачу не нужно запускать, предварительный обработчик никогда не запускается.

Мой вариант использования - корневая файловая система, смонтированная только для чтения.У меня есть Ansible задача для создания .bashrc.Я бы хотел, чтобы Ansible перемонтировал файловую систему как чтение-запись, если и только если .bashrc необходимо обновить.Перемонтирование файловой системы до и после каждого запуска Ansible нецелесообразно, поскольку для повторного запуска требуется только перезагрузка.

1 Ответ

2 голосов
/ 28 сентября 2019

Обработчик уведомляется задачей, если эта задача что-то изменила.Таким образом, «предварительный обработчик» невозможен, так как задача должна быть запущена, чтобы увидеть, если она что-то меняет или нет.

Однако вы можете уведомить обработчик о задаче, работающей в режиме проверки .Если вы хотите сделать все по порядку, вам потребуется принудительно запустить обработчики с помощью модуля meta .

. Решит ли что-то подобное из приведенного ниже примера вашу проблему?

- name: Check if .bashrc has the correct content
  copy: &bashrc_copy_params
    src: bashrc_root
    dest: /root/.bashrc
    owner: root
    group: root
    mode: 0644
  check_mode: true
  notify: remount root fs rw

- meta: flush_handlers

- name: Really copy .bashrc
  copy: *bashrc_copy_params

Обратите внимание, что в этом конкретном случае вы можете получить точно такой же результат без обработчика.Ниже приведен другой пример с блоком, который будет запускаться только тогда, когда проверка сообщает об изменении.Это даже лучше, чем в предыдущем примере, поскольку реальная задача копирования будет полностью пропущена, если в ней нет необходимости.

- name: Check if .bashrc has the correct content
  copy: &bashrc_copy_params
    src: bashrc_root
    dest: /root/.bashrc
    owner: root
    group: root
    mode: 0644
  check_mode: true
  register: bashrc_state

- when: bashrc_state.changed | bool
  block:
    - name: remount root fs rw
      debug:
         msg: for example only, replace with your own task

    - name: Really copy .bashrc
      copy: *bashrc_copy_params

Примечание: обозначения &bashrc_copy_params и *bashrc_copy_params в моих приведенных выше примерах являются якорями yaml.См. Learn Yaml в Y минутах для объяснения, если это необходимо.Они разрешены в ansible, но должны быть объявлены и использованы в одном файле.

...