मैं कई कार्यों के साथ एक Ansible हैंडलर कैसे लिख सकता हूं?


81

एक बदलाव के जवाब में, मेरे पास कई संबंधित कार्य हैं जिन्हें चलाना चाहिए। मैं कई कार्यों के साथ एक Ansible हैंडलर कैसे लिख सकता हूं?

उदाहरण के लिए, मैं एक हैंडलर चाहूंगा जो किसी सेवा को केवल तभी शुरू करे जब वह पहले से ही शुरू हो:

- name: Restart conditionally
  shell: check_is_started.sh
  register: result

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result

जवाबों:


95

इस समस्या का उचित समाधान है, जैसा कि अंसिबल 2.2 है।

हैंडलर जेनेरिक विषयों को "सुन" भी सकते हैं, और कार्य उन विषयों को इस प्रकार सूचित कर सकते हैं:

handlers:
    - name: restart memcached
      service: name=memcached state=restarted
      listen: "restart web services"
    - name: restart apache
      service: name=apache state=restarted
      listen: "restart web services"

tasks:
    - name: restart everything
      command: echo "this task will restart the web services"
      notify: "restart web services"

यह उपयोग कई हैंडलर को ट्रिगर करना बहुत आसान बनाता है। यह हैंडलर को उनके नाम से भी हटाता है, जिससे प्लेबुक और भूमिकाओं के बीच हैंडलर साझा करना आसान हो जाता है

प्रश्न के लिए विशेष रूप से, यह काम करना चाहिए:

- name: Check if restarted
  shell: check_is_started.sh
  register: result
  listen: Restart processes

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result
  listen: Restart processes

और कार्य में, 'रिस्टार्ट प्रोसेस' के माध्यम से हैंडलर को सूचित करें।

http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change


1
क्या यह समाधान ब्लॉक: और बचाव का उपयोग करने की अनुमति देगा: कमांड लॉन्च करके त्रुटियों को संभालने के लिए?
user1767316

3
सूचीबद्ध क्रम में कई कार्य निष्पादित किए गए हैं? यदि एक कार्य दूसरे कार्य पर निर्भर करता है, तो क्या मुझे हैंडलर के अंदर नोटिफ़िकेशन-लिसन का उपयोग करना चाहिए?
user26767

लिंक किए गए दस्तावेज़ से @ user26767:Notify handlers are always run in the same order they are defined, not in the order listed in the notify-statement. This is also the case for handlers using listen.
swenzel

55

अपने हैंडलर फ़ाइल में, सूचनाओं का उपयोग करते हुए विभिन्न चरणों को एक साथ श्रृंखलाबद्ध करें।

- name: Restart conditionally
  debug: msg=Step1
  changed_when: True
  notify: Restart conditionally step 2

- name: Restart conditionally step 2
  debug: msg=Step2
  changed_when: True
  notify: Restart conditionally step 3

- name: Restart conditionally step 3
  debug: msg=Step3

फिर एक कार्य से इसे देखें notify: Restart conditionally

ध्यान दें कि आप केवल वर्तमान एक से नीचे हैंडलर को सूचित कर सकते हैं। उदाहरण के लिए, Restart conditionally step 2सूचित नहीं कर सकते Restart conditionally

स्रोत: # irc.freenode.net पर मैं अनिश्चित हूं कि क्या यह भविष्य में काम करना जारी रखेगा क्योंकि यह आधिकारिक दस्तावेज में एक विशेषता के रूप में उल्लिखित नहीं है।


यह विधि एक ऐसे तथ्य के साथ मदद करती है जिसके लिए थोड़ा साहित्य लगता है: हैंडलर, जिन्हें एक बार अधिसूचित किया जाता है, भले ही उन हैंडलर में से एक विफल हो जाए। अलग का उपयोग करnotifyयदि आप पिछले हैंडलर को विफल करना चाहते हैं, तो इसके लिए लेबल चाहें, तो यह इसे "ठीक" करने का एक अच्छा तरीका है यदि आप ऐसा नहीं चाहते हैं।
fbicknel

27

संपादित करें: यदि आपके पास 2.2 या इसके बाद का संस्करण है, तो mkadan के उत्तर का उपयोग करें। नीचे दिए गए उत्तर, Ansible के नए संस्करणों के साथ काम नहीं करते हैं। यह भी ध्यान दें कि Enis Afgan की टिप्पणी के अनुसार, बग के कारण, यह उत्तर 2.0.2 और 2.1.2 के बीच Ansible संस्करणों के साथ काम नहीं करता है।


Ansible 2.0 के रूप में, आप कई कार्यों को चलाने के लिए अपने हैंडलर में शामिल कार्रवाई का उपयोग कर सकते हैं।

उदाहरण के लिए, अपने कार्यों को एक अलग फ़ाइल में डालें restart_tasks.yml(यदि आप भूमिकाओं का उपयोग करते हैं, तो यह कार्य उपनिर्देशिका में जाएगा, हैंडलर अप्रत्यक्ष में नहीं ):

- name: Restart conditionally step 1
  shell: check_is_started.sh
  register: result

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result

आपका हैंडलर तो बस होगा:

- name: Restart conditionally
  include: restart_tasks.yml

स्रोत: github पर थ्रेड जारी करें : https://github.com/ansible/ansible/issues/14270


5
बस ध्यान दें कि २.०.२ और २.१.२ के बीच के संस्करणों में एक बग है, जहां यह काम नहीं करता है: github.com/ansible/ansible/issues/15915
Enis Afgan

1
भविष्य के पाठकों के लिए - यह मेरे लिए Ansible 2.9.2 पर काम नहीं किया। फिक्स के includeसाथ बदल रहा था include_tasks
मार्टिन मेलका

@MartinMelka धन्यवाद, मैंने अपने उत्तर के शीर्ष पर एक चेतावनी जोड़ी है कि यह Ansible संस्करणों> = 2.2 के लिए नहीं है।
अलेक्जेंडर क्लाउर

महान, धन्यवाद :) नए हैंडलर्स को डिजाइन करते समय, अन्य उत्तर बेहतर होता है। लेकिन जब Ansible इन्वेंट्री कोड पुराना होता है और किसी को केवल छोटे परिवर्तन करने की आवश्यकता होती है (जैसे मैंने किया), तो आपका अभी भी इस छोटे से जोड़ के साथ उपयोगी हो सकता है।
मार्टिन मेलका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.