हमेशा Ansible में हैंडलर निष्पादन को ट्रिगर करें


33

मैं अपने विकास सर्वर का प्रावधान करने के लिए Ansible का उपयोग कर रहा हूं।

मैं चाहता हूं कि यह हमेशा मेरे लिए कुछ सेवाएं शुरू करे। मेरे पास इस उद्देश्य के लिए हैंडलर हैं लेकिन बिना शर्त के हैंडलर निष्पादन को ट्रिगर करने का सबसे अच्छा तरीका क्या है, जैसे कि यह हमेशा काम करता है?

कुछ इस तरह:

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

6
अगर आप चाहते हैं कि कोई काम हमेशा चला जाए तो आपको इसे एक हैंडलर के बजाय एक कार्य बनाना चाहिए।
जॉर्डन

@ जोर्डन - कभी-कभी आप एक ऐसा हैंडलर रखना चाहते हैं जो सशर्त रूप से इस विशेष को छोड़कर अधिकांश परिदृश्यों में चालू हो।
रजत जूल

जवाबों:


61

यदि आपको हर बार हैंडलर को ट्रिगर करने की आवश्यकता है तो यहां दो विकल्प हैं:

1) एक नोप शेल कमांड चलाएं जो हमेशा बदले हुए रूप में रिपोर्ट करेगा

-  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: noAnsible संस्करण 2.2 या उच्चतर always_run: yesका उपयोग कर रहे हैं या उससे पहले के संस्करणों का उपयोग करना चाहते हैं ताकि चेक मोड में कार्य समाप्त न हो। मेरे मैनुअल परीक्षण से ऐसा लगता है कि हैंडलर चेक मोड में हैं, लेकिन कृपया सावधान रहें क्योंकि आपका मामला अलग हो सकता है।


7
आजकल, आप `--force-संचालकों संचालकों चला सकते हैं, भले ही किसी कार्य fails`
conny

5
हां, हालांकि यह सभी हैंडलर को चलने के लिए मजबूर करेगा
jarv

मुझे यह पोस्ट बदली हुई स्थिति के बारे में उपयोगी लगी, जो मुझे यहां ले गई। serverfault.com/a/799282/173002 । Ty।
सोनजज

धन्यवाद, मैंने विकल्प 2 का उपयोग किया और changed_whenइसमें एक गैर-बेरोजगार कार्य को लागू करने के लिए अधिक तर्क के साथ [जिसे कुछ मामलों में एक से अधिक बार लागू किया जा सकता है] एक कार्य के बजाय एक हैंडलर के रूप में।
सैममिच

17

हैंडबल मजबूर करने के लिए कई विकल्प प्रदान करता है:

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) हालांकि, ऐसा लगता है कि आप केवल यह सुनिश्चित करना चाहते हैं कि कोई सेवा चल रही है या फिर से शुरू हो रही है, भले ही किसी अन्य कार्य के परिणाम की परवाह किए बिना। उस स्थिति में, एक हैंडलर का उपयोग न करें, एक नया कार्य का उपयोग करें जो कॉल करता है Ansible के serviceमॉड्यूल: 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) के साथ समस्या यह है कि किसी के पास कई कार्य हो सकते हैं जो हैंडलर को सूचित करते हैं, और मैं नहीं चाहता कि हैंडलर कई बार (सेवा को फिर से शुरू) चलाए।
जोनाथन हार्टले

एकाधिक कार्य एक ही हैंडलर को सूचित कर सकते हैं, और हैंडलर केवल एक बार निष्पादित करेगा। वह है हैंडलर की पूरी बात।
जेफ विडमैन

हे जेफ। यह उत्तर हैंडलर का उपयोग नहीं करने के बारे में है, केवल कार्यों का उपयोग करके सभी कार्यों को निर्दिष्ट करना।
जोनाथन हार्टले

क्षमा करें, मुझे डर है कि मैं अभी भी उस उपयोग के मामले को नहीं समझ पा रहा हूँ जिसे आप हल करने का प्रयास कर रहे हैं ... हो सकता है कि जो आप पूरा करने का प्रयास कर रहे हैं उसके उदाहरण के साथ एक नया प्रश्न खोलें? यदि आप इसके साथ एक टिप्पणी जोड़ते हैं तो मैं इसका उत्तर देने का प्रयास करूंगा।
जेफ विडमैन

मुझे एक नए प्रश्न की आवश्यकता नहीं है। OQ ने पूछा "मैं कैसे सुनिश्चित कर सकता हूं कि एक हैंडलर हमेशा चलता है", और यह जवाब, भाग 3, ने सुझाव दिया कि "इसके बजाय कार्यों का उपयोग करें", और मेरी टिप्पणी बताती है "आपका कार्य फिर कुछ परिस्थितियों में कई बार चल सकता है।"
जोनाथन हार्टले

6

एक सेवा को फिर से शुरू करना एक बात है; यह सुनिश्चित करना कि यह चल रहा है एक और है। यदि आप ansibleयह सुनिश्चित करना चाहते हैं कि nginxआप चल रहे हैं, तो आप ऐसा करते हैं:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.