เรียกใช้ตัวจัดการการเรียกใช้งานใน Ansible เสมอ


33

ฉันใช้ Ansible เพื่อจัดเตรียมเซิร์ฟเวอร์การพัฒนาของฉัน

ฉันต้องการให้บริการบางอย่างสำหรับฉัน ฉันมีตัวจัดการสำหรับจุดประสงค์นี้ แต่วิธีที่ดีที่สุดในการเรียกใช้ตัวจัดการโดยไม่มีเงื่อนไขเช่นทำให้ทำงานได้อย่างไร

บางสิ่งเช่นนี้

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

6
ถ้าคุณต้องการให้งานรันอยู่เสมอคุณควรทำให้มันเป็นภารกิจแทนที่จะเป็นตัวจัดการ
Jordan

@Jordan - บางครั้งคุณอาจต้องการตัวจัดการที่ถูกทริกเกอร์แบบมีเงื่อนไขในสถานการณ์ส่วนใหญ่ยกเว้นอันนี้โดยเฉพาะ
silverdr

คำตอบ:


61

หากคุณจำเป็นต้องเรียกใช้ตัวจัดการทุกครั้งที่นี่มีสองตัวเลือก:

1) เรียกใช้คำสั่งเชลล์ noop ซึ่งจะรายงานการเปลี่ยนแปลงเสมอ

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

2) ใช้ดีบักพร้อมกับเปลี่ยนแปลง _ เมื่อ:เพื่อทริกเกอร์ตัวจัดการ

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

นอกจากนี้ยังมีบันทึกสำหรับตัวเลือกที่ 1 และตรวจสอบโหมด: คุณอาจต้องการที่จะใช้check_mode: noถ้าใช้รุ่นเบิ้ล 2.2 หรือสูงกว่าหรือalways_run: yesถ้าใช้รุ่นก่อนหน้านี้กว่านั้นเพื่อให้งานที่ไม่ได้รับการข้ามไปในโหมดการตรวจสอบ จากการทดสอบด้วยตนเองดูเหมือนว่าตัวจัดการจะยังคงอยู่ในโหมดตรวจสอบ แต่โปรดระวังเพราะกรณีของคุณอาจแตกต่างกัน


7
ปัจจุบันคุณ `--force-ไสสามารถเรียกใช้รถขนแม้ว่างาน fails`
Conny

5
ใช่ว่าจะบังคับให้ตัวจัดการทั้งหมดทำงาน
jarv

ฉันพบว่าโพสต์นี้มีประโยชน์เกี่ยวกับสถานะที่เปลี่ยนแปลงซึ่งนำฉันมาที่นี่ serverfault.com/a/799282/173002 TY
sonjz

ขอบคุณฉันใช้ตัวเลือก 2 และ a ที่changed_whenมีตรรกะมากกว่าในการใช้งานที่ไม่ใช่ idempotent [ซึ่งอาจถูกเรียกใช้มากกว่าหนึ่งครั้งในบางกรณี] เป็นตัวจัดการแทนที่จะเป็นงาน
Sammitch

17

Ansible มีหลายตัวเลือกสำหรับการบังคับให้จัดการ:

1) หากต้องการบังคับให้ตัวจัดการทั้งหมดทำงานansible-playbook playbook.yml --force-handlersตามเอกสารที่นี่: https://github.com/ansible/ansible/issues/4777

2) ในการบังคับรถขนที่ได้รับการแจ้งเตือนที่จุดที่เฉพาะเจาะจงภายใน playbook ของคุณสามารถใช้งานเมตา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) คืออาจมีหลายงานที่แจ้งผู้จัดการและฉันไม่ต้องการให้ตัวจัดการทำงาน (เริ่มบริการใหม่) หลายครั้ง
Jonathan Hartley

มีหลายงานที่สามารถแจ้งผู้จัดการรายเดียวกันได้และผู้ดำเนินการจะดำเนินการเพียงครั้งเดียว นั่นคือจุดรวมของตัวจัดการ
Jeff Widman

เฮ้เจฟ คำตอบนี้เกี่ยวกับการไม่ใช้ตัวจัดการระบุการกระทำทั้งหมดเพียงแค่ใช้งาน
Jonathan Hartley

ขออภัยฉันเกรงว่าฉันยังไม่เข้าใจกรณีการใช้งานที่คุณกำลังพยายามแก้ไข ... อาจเปิดคำถามใหม่พร้อมตัวอย่างของสิ่งที่คุณพยายามจะทำ หากคุณเพิ่มความคิดเห็นพร้อมลิงค์ไปยังมันฉันจะพยายามตอบ
Jeff Widman

ฉันไม่ต้องการคำถามใหม่ OQ ถามว่า "ฉันจะแน่ใจได้อย่างไรว่าตัวจัดการ ALWAYS ทำงานอยู่" และคำตอบส่วนที่ 3 แนะนำ "ใช้งานแทน" และความคิดเห็นของฉันชี้ให้เห็น "งานของคุณอาจทำงานหลายครั้งในบางสถานการณ์"
Jonathan Hartley

6

การรีสตาร์ทบริการเป็นสิ่งหนึ่ง มั่นใจว่ามันกำลังทำงานอยู่เป็นอีก ถ้าคุณต้องการansibleให้แน่ใจว่าnginxกำลังทำงานอยู่คุณทำสิ่งนี้:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.