Selalu memicu eksekusi handler di Ansible

33

Saya menggunakan Kemungkinan untuk menyediakan server pengembangan saya.

Saya ingin selalu memulai beberapa layanan untuk saya. Saya memiliki penangan untuk tujuan ini, tetapi apa cara terbaik untuk memicu eksekusi penangan tanpa syarat, misalnya membuatnya selalu berfungsi?

Sesuatu seperti ini:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart
Slava Fomin II
sumber
6
Jika Anda ingin tugas selalu dijalankan, Anda harus menjadikannya tugas daripada penangan.
Jordan
@Jordan - kadang-kadang Anda mungkin ingin memiliki penangan yang terpicu secara kondisional di sebagian besar skenario kecuali yang khusus ini.
silverdr

Jawaban:

61

Jika Anda benar-benar perlu memicu penangan setiap kali maka di sini ada dua opsi:

1) jalankan perintah noop shell yang akan selalu dilaporkan telah diubah

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

2) gunakan debug bersama dengan perubahan_ketika: untuk memicu penangan

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

Juga perhatikan untuk Opsi 1 dan Periksa Mode: Anda mungkin ingin menggunakan check_mode: nojika menggunakan Ansible versi 2.2 atau lebih tinggi atau always_run: yesjika menggunakan versi lebih awal dari itu sehingga tugas tidak dilewati dalam mode periksa. Dari pengujian manual saya sepertinya penangan tetap dalam mode periksa, tapi harap hati-hati karena kasus Anda mungkin berbeda.

jarv
sumber
7
Saat ini, Anda dapat `- memaksa-penangan menjalankan penangan bahkan jika tugas gagal`
conny
5
Ya, itu akan memaksa semua penangan untuk menjalankan
jarv
Saya menemukan posting ini berguna mengenai status yang diubah, yang membawa saya ke sini. serverfault.com/a/799282/173002 . ty.
sonjz
Terima kasih, saya menggunakan opsi 2 dan changed_whenlebih banyak logika di dalamnya untuk mengimplementasikan tugas yang tidak idempoten [yang mungkin dipanggil lebih dari sekali dalam beberapa kasus] sebagai penangan daripada tugas.
Sammitch
17

Ansible menyediakan beberapa opsi untuk memaksa penangan:

1) Untuk selalu memaksa semua penangan, jalankan ansible-playbook playbook.yml --force-handlers, seperti yang didokumentasikan di sini: https://github.com/ansible/ansible/issues/4777

2) Untuk memaksa penangan yang telah diberi tahu pada titik tertentu dalam buku pedoman, Anda dapat menggunakan tugas meta https://docs.ansible.com/playbooks_intro.html :

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

3) Namun, sepertinya Anda hanya ingin memastikan layanan berjalan atau dimulai kembali, terlepas dari hasil tugas lain. Dalam hal itu, jangan gunakan penangan, gunakan tugas baru yang memanggil servicemodul 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
Jeff Widman
sumber
1
Masalahnya dengan (3) adalah seseorang mungkin memiliki beberapa tugas yang memberi tahu handler, dan saya tidak ingin handler menjalankan (memulai kembali layanan) beberapa kali.
Jonathan Hartley
Beberapa tugas dapat memberi tahu penangan yang sama, dan penangan hanya akan mengeksekusi sekali. Itulah inti dari penangan.
Jeff Widman
Hei Jeff. Jawaban ini adalah tentang tidak menggunakan penangan, menetapkan semua tindakan hanya menggunakan tugas.
Jonathan Hartley
Maaf, saya khawatir saya masih tidak mengerti kasus penggunaan yang Anda coba selesaikan untuk ... Mungkin membuka pertanyaan baru dengan contoh apa yang ingin Anda capai? Jika Anda menambahkan komentar dengan tautan, saya akan mencoba menjawabnya.
Jeff Widman
Saya tidak butuh pertanyaan baru. OQ bertanya, "Bagaimana saya bisa memastikan pawang SELALU berjalan", dan jawaban ini, bagian 3, menyarankan "Gunakan tugas sebagai gantinya", dan komentar saya menunjukkan, "Tugas Anda mungkin akan berjalan beberapa kali dalam beberapa keadaan."
Jonathan Hartley
6

Memulai kembali layanan adalah satu hal; memastikan itu berjalan adalah hal lain. Jika Anda ingin ansiblememastikan nginxberjalan, Anda melakukan ini:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Antonis Christofides
sumber