Завжди запускайте виконання обробника в Ansible


33

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

Я хочу, щоб він завжди починав якісь послуги для мене. У мене є обробники для цієї мети, але який найкращий спосіб запустити виконання обробника без умови, наприклад, щоб це завжди працювало?

Щось на зразок цього:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart

6
Якщо ви хочете, щоб завдання завжди виконувались, вам слід зробити це завданням, а не обробником.
Йорданія

@Jordan - іноді ви можете мати обробник, який умовно спрацьовує у більшості сценаріїв, крім цього.
silverdr

Відповіді:


61

Якщо вам абсолютно потрібно щоразу запускати обробник, то ось два варіанти:

1) запустіть команду оболонки noop, яка завжди звітуватиме як змінена

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

2) використовувати налагодження разом із change_when: для запуску обробника

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

Також зверніть увагу на варіант 1 та режим перевірки: можливо, ви хочете використовувати, check_mode: noякщо ви користуєтесь Ansible версією 2.2 або вище або always_run: yesякщо використовуєте більш ранні версії, ніж те, щоб завдання не було пропущено в режимі перевірки. З мого тестування вручну, схоже, що обробники залишаються в режимі перевірки, але будьте обережні, оскільки ваш випадок може відрізнятися.


7
Сьогодні ви можете `
conny

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) полягає в тому, що може бути кілька завдань, які сповіщають обробника, і я не хочу, щоб обробник запускався (перезапускав службу) кілька разів.
Джонатан Хартлі

Кілька завдань можуть сповістити одного і того ж обробника, і обробник виконає лише один раз. У цьому вся суть обробників.
Джефф Відман

Гей, Джефф. Ця відповідь стосується не використання обробників, уточнення всіх дій, лише використання завдань.
Джонатан Хартлі

Вибачте, боюся, я все ще не розумію справи використання, яку ви намагаєтеся вирішити ... Можливо, відкрийте нове запитання із прикладом того, що ви намагаєтеся досягти? Якщо ви додасте коментар із посиланням на нього, я спробую відповісти на нього.
Джефф Відман

Нове запитання мені не потрібно. ОК запитав "Як я можу переконатися, що обробник ЗАВЖДИ працює", і ця відповідь, частина 3, запропонувала "Використовувати завдання замість цього", і мій коментар зазначає "Ваше завдання може запускатися кілька разів за певних обставин".
Джонатан Хартлі

6

Перезапуск послуги - одне; забезпечення іншого запуску - це ще одне. Якщо ви хочете ansibleпереконатися, що nginxпрацює, зробіть це:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.