Ansible'da her zaman işleyici yürütmesini tetikleyin


33

Geliştirme sunucumu sağlamak için Ansible kullanıyorum.

Her zaman benim için bazı hizmetler başlatmak istiyorum. Bu amaçla işleyicilere sahibim, ancak koşulsuz işleyiciyi çalıştırmanın en iyi yolu nedir, örneğin her zaman çalışsın mı?

Bunun gibi bir şey:

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

6
Bir görevin her zaman çalışmasını istiyorsanız, bunu işleyici yerine bir görev yapmalısınız.
Ürdün

@Jordan - bazen, bu senaryo hariç çoğu senaryoda koşullu olarak tetiklenen bir işleyiciye sahip olmak isteyebilirsiniz.
silverdr

Yanıtlar:


61

Her seferinde bir işleyiciyi kesinlikle tetiklemeniz gerekiyorsa, işte iki seçenek:

1) her zaman değişmiş olarak rapor edecek bir noop shell komutu çalıştırın

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

2) change_when ile birlikte hata ayıklamayı kullanın : bir işleyiciyi tetiklemek için

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

Ayrıca Seçenek 1 ve Kontrol Modu için not : check_mode: noAnsible sürüm 2.2 veya daha üstü always_run: yeskullanıyorsanız veya bundan önceki sürümleri kullanıyorsanız, görev kontrol modunda atlanmamak için kullanabilirsiniz. Manuel testlerimde, işleyiciler kontrol modunda kalıyor gibi görünüyor, ancak durumunuz farklı olabileceğinden lütfen dikkatli olun.


7
Bugünlerde,
conny

5
Evet, bu tüm işleyicileri çalışmaya
zorlayacaktır

Bu yazıyı, beni burada yönlendiren durumla ilgili faydalı buldum. serverfault.com/a/799282/173002 . Ty.
sonjz,

Teşekkürler, seçenek 2'yi ve changed_whendaha mantıklı olan ve iddiasız olmayan bir görevi [bazı durumlarda bir kereden fazla kullanılabiliyordu] bir görev yerine bir işleyici olarak uygulamak için kullandım.
Sammitch

17

Ansible, işleyicileri zorlamak için çeşitli seçenekler sunar:

1) Her zaman tüm işleyicileri zorlamak için ansible-playbook playbook.yml --force-handlers, burada belgelendiği şekilde çalıştırın : https://github.com/ansible/ansible/issues/4777

2) Bir oyun kitabında belirli bir noktada bildirilen işleyicileri zorlamak için https://docs.ansible.com/playbooks_intro.html bir meta görevi kullanabilirsiniz :

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

3) Ancak, başka bir görevin sonucuna bakmaksızın bir hizmetin çalıştığından veya yeniden başlatıldığından emin olmak istediğiniz gibi görünüyor. Bu durumda, işleyici kullanmayın, Ansible'ın servicemodülünü çağıran yeni bir görev kullanın : 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) ile ilgili sorun, birinin işleyiciyi uyaran birkaç görevi olabilir ve işleyicinin birkaç kez çalışmasını (hizmeti yeniden başlatmayı) istemiyorum.
Jonathan Hartley

Birden fazla görev aynı işleyiciye bildirebilir ve işleyici yalnızca bir kez yürütülür. İşleyicilerin hepsi bu kadar.
Jeff Widman,

Selam Jeff. Bu cevap, işleyicileri kullanmamak, yalnızca görevleri kullanan tüm eylemleri belirlemek ile ilgilidir.
Jonathan Hartley

Üzgünüm, korkarım çözmeye çalıştığınız kullanım durumunu hala anlamıyorum. Belki de başarmaya çalıştığınız bir örnekle yeni bir soru açabilirsiniz. Bağlantıya bir yorum eklerseniz yanıtlamaya çalışacağım.
Jeff Widman,

Yeni bir soruya ihtiyacım yok. OQ, “HERHANGİ bir işleyicinin nasıl çalıştığından nasıl emin olabilirim?” Diye sordu ve bu cevap, 3. bölüm, “Bunun yerine görevleri kullan” ı önerdi ve yorumum, “Göreviniz daha sonra bazı durumlarda birkaç kez çalışabilir” diyor.
Jonathan Hartley

6

Bir hizmeti yeniden başlatmak bir şeydir; Çalışmasını sağlamak başka bir şeydir. ansibleÇalıştığından emin olmak istiyorsanız nginx, bunu yapın:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.