Всегда запускать выполнение обработчика в Ansible

33

Я использую Ansible для предоставления своего сервера разработки.

Я хочу, чтобы это всегда запускало некоторые услуги для меня. У меня есть обработчики для этой цели, но каков наилучший способ инициировать выполнение обработчика без условий, например, заставить его всегда работать?

Что-то вроде этого:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart
Слава Фомин II
источник
6
Если вы хотите, чтобы задача всегда выполнялась, вы должны сделать ее задачей, а не обработчиком.
Иордания
@Jordan - иногда вам может понадобиться обработчик, который условно срабатывает в большинстве сценариев, кроме этого конкретного.
silverdr

Ответы:

61

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

1) запустить команду оболочки noop, которая всегда будет сообщать об изменениях

-  name: trigger nginx-restart
   command: /bin/true
   notify: nginx-restart

2) использовать debug вместе с change_when: для запуска обработчика

-  debug: msg="trigger nginx-restart"
   notify: nginx-restart
   changed_when: true

Также обратите внимание на Вариант 1 и Режим проверки: вы можете использовать его, check_mode: noесли используете Ansible версии 2.2 или выше или always_run: yesболее ранние версии, чем те, чтобы задача не пропускалась в режиме проверки. Из моего ручного тестирования похоже, что обработчики остаются в режиме проверки, но, пожалуйста, будьте осторожны, поскольку ваш случай может отличаться.

jÄRV
источник
7
В настоящее время вы можете `--force-handlers запускать обработчики, даже если задача не выполняется`
handlers
5
Да, хотя это заставит работать все обработчики
jarv
Я нашел этот пост полезным в связи с измененным статусом, который привел меня сюда. serverfault.com/a/799282/173002 . ти.
sonjz
Спасибо, я использовал вариант 2 и a changed_whenс большей логикой для реализации неидемпотентной задачи [которая в некоторых случаях может вызываться более одного раза) в качестве обработчика, а не задачи.
Саммит
17

Ansible предоставляет несколько опций для принудительной обработки:

1) Чтобы всегда вызывать все обработчики, запустите ansible-playbook playbook.yml --force-handlers, как описано здесь: https://github.com/ansible/ansible/issues/4777

2) Для принудительной обработки обработчиков, которые были уведомлены в определенный момент в книге игр, вы можете использовать мета-задачу https://docs.ansible.com/playbooks_intro.html :

tasks: 
  - shell: some tasks go here
  - meta: flush_handlers
  - shell: some other tasks

3) Однако, похоже, что вы просто хотите убедиться, что служба запущена или перезапущена, независимо от результата другой задачи. В этом случае не используйте обработчик, используйте новую задачу, которая вызывает serviceмодуль Ansible : http://docs.ansible.com/service_module.html

tasks: 
  - name: ensure ntp is running
    service: name=ntp state=started enabled=yes

  - name: always reload nginx
    service: name=nginx state=reloaded

  - name: always restart MySQL
    service: name=mysql state=restarted
Джефф Видман
источник
1
Проблема с (3) состоит в том, что можно иметь несколько задач, которые уведомляют обработчик, и я не хочу, чтобы обработчик запускался (перезапускал службу) несколько раз.
Джонатан Хартли
Несколько задач могут уведомить один и тот же обработчик, и обработчик будет выполнен только один раз. В этом весь смысл обработчиков.
Джефф Видман
Привет, Джефф. Этот ответ о том, что не нужно использовать обработчики, указав все действия только с помощью задач.
Джонатан Хартли
Извините, боюсь, я до сих пор не понимаю сценарий использования, который вы пытаетесь решить ... Может, открыть новый вопрос с примером того, что вы пытаетесь выполнить? Если вы добавите комментарий со ссылкой на него, я постараюсь ответить на него.
Джефф Видман
Мне не нужен новый вопрос. OQ спросил: «Как я могу убедиться, что обработчик ВСЕГДА запускается», и в этом ответе, часть 3, предлагалось «Использовать задачи вместо», и мой комментарий указывает на то, что «ваша задача может запускаться несколько раз при некоторых обстоятельствах».
Джонатан Хартли
6

Перезапуск службы - это одно; обеспечение того, чтобы это работало, является другим. Если вы хотите ansibleубедиться, что nginxработает, вы делаете это:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Антонис Христофидес
источник