क्या पूरे हैंडबुक या भूमिका के बाद चलने योग्य भूमिकाओं में परिभाषित हैंडलर हैं?


13

मैं अंसिबल 2.0 चला रहा हूं, और मैं बस इसे चला सकता हूं, लेकिन मुझे विश्वास दिलाया जा सकता है कि कुछ ऐसा है जो मेरे अनुभवजन्य परीक्षणों द्वारा सच नहीं है और मुझे यह बताने के लिए कोई दस्तावेज नहीं मिल सकता है कि हैंडलर कब चलना चाहिए।

यदि हैंडलर अपने कार्यों के अंत में भाग नहीं रहे हैं, तो यह मेरा अनुमान है। मुझे इसमें 5 भूमिकाओं के साथ एक प्लेबुक मिली है, मैं अंत में एक 6 भूमिका जोड़ना चाहता हूं, जिसे शुरू होने से पहले 4 वीं भूमिका पूरी करने के लिए हैंडलर की आवश्यकता है।

क्या किसी और को पूरा करने से पहले एक हैंडलर पर भरोसा करने के लिए एंज़िबल को चलाने का कोई तरीका है (यानी एक भूमिका पूरी तरह से पूरी हो रही है) या क्या मैं हैंडलर का गलत इस्तेमाल कर रहा हूं?

जवाबों:


17

हैंडलर निष्पादित किए जाते हैं:

  • एक नाटक के अंत में (प्लेबुक नहीं)
  • meta: flush_handlersकार्य निष्पादित करने पर

इसलिए " अंत में एक 6 भूमिका जोड़ने के लिए जो 4 वीं भूमिका के संचालकों की आवश्यकता है" आपको चाहिए:

  • या तो भूमिका असाइनमेंट को अलग-अलग नाटकों में विभाजित करना;
  • या मेटा कार्य जोड़ें और include_roleमॉड्यूल के साथ 6 वीं भूमिका शामिल करें :

    roles:
      - role4
    tasks:
      - meta: flush_handlers
      - include_role:
          name: role6
    

आपके उपयोग के मामले के लिए, मैं पहले तरीके का सुझाव दूंगा क्योंकि include_roleमॉड्यूल अभी भी बहुत ताज़ा है और इसका उपयोग करते समय quirks हैं ( SO पर यह प्रश्न देखें )।


इसके अलावा, कृपया ध्यान दें कि हैंडलर के नाम और सुनने की कॉल वैश्विक हैं, इसलिए अलग-अलग भूमिकाओं में दो हैंडलर संघर्ष में होंगे यदि उनका समान नाम था और दोनों भूमिकाएं एक ही नाटक में सौंपी गई थीं। (रेफरी हैंडलर: चेंजिंग ऑपरेशंस ऑन चेंज )

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

हैंडलर नाम और सुनने के विषय एक वैश्विक नाम स्थान में रहते हैं।


  • अनुभवजन्य प्रमाण (हैंडलर की पुष्टि करने के लिए इस शेल स्क्रिप्ट को चलाएं - नाटक के अंत में निष्पादित किया जाता है - यहां टिप्पणियों और उत्तरों का विरोधाभासी वर्णन किया गया है):

    #!/bin/bash
    
    mkdir -p ./sf831880/roles/role1
    mkdir -p ./sf831880/roles/role1/handlers
    mkdir -p ./sf831880/roles/role1/tasks
    mkdir -p ./sf831880/roles/role2
    mkdir -p ./sf831880/roles/role2/handlers
    mkdir -p ./sf831880/roles/role2/tasks
    
    cat >./sf831880/roles/role1/tasks/main.yml <<TASKS1_END
    ---
    - name: Always true in role1
      command: echo role1
      notify: handler1
    TASKS1_END
    
    cat >./sf831880/roles/role2/tasks/main.yml <<TASKS2_END
    ---
    - name: Always true in role2
      command: echo role2
      notify: handler2
    TASKS2_END
    
    cat >./sf831880/roles/role1/handlers/main.yml <<HANDLERS1_END
    ---
    - name: handler1
      debug:
        msg: "This is a handler in role1"
    HANDLERS1_END
    
    cat >./sf831880/roles/role2/handlers/main.yml <<HANDLERS2_END
    ---
    - name: handler2
      debug:
        msg: "This is a handler in role2"
    HANDLERS2_END
    
    cat >./sf831880/playbook.yml <<PLAYBOOK_END
    ---
    - hosts: localhost
      gather_facts: no
      connection: local
      roles:
        - role1
        - role2
      tasks:
        - debug:
            msg: "This is a task in a play"
    PLAYBOOK_END
    
    ansible-playbook ./sf831880/playbook.yml
    

    परिणाम:

    PLAY [localhost] ***************************************************************
    
    TASK [role1 : Always true in role1] ********************************************
    changed: [localhost]
    
    TASK [role2 : Always true in role2] ********************************************
    changed: [localhost]
    
    TASK [debug] *******************************************************************
    ok: [localhost] => {
        "msg": "This is a task in a play"
    }
    
    RUNNING HANDLER [role1 : handler1] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role1"
    }
    
    RUNNING HANDLER [role2 : handler2] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role2"
    
  • इसमें शामिल होने के लिए संशोधित करें meta: flush_handlers:

    ---
    - hosts: localhost
      gather_facts: no
      connection: local
      roles:
        - role1
        - role2
      tasks:
        - meta: flush_handlers
        - debug:
            msg: "This is a task in a play"
    

    परिणाम:

    PLAY [localhost] ***************************************************************
    
    TASK [role1 : Always true in role1] ********************************************
    changed: [localhost]
    
    TASK [role2 : Always true in role2] ********************************************
    changed: [localhost]
    
    RUNNING HANDLER [role1 : handler1] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role1"
    }
    
    RUNNING HANDLER [role2 : handler2] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role2"
    }
    
    TASK [debug] *******************************************************************
    ok: [localhost] => {
        "msg": "This is a task in a play"
    

2

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

1) वही काम करने वाले हैंडलर का नाम वही होना चाहिए।
restart nginxहमेशा nginx को पुनरारंभ करता है, नहीं handler1औरhandler2

2) हैंडलर पूरे "प्ले" के अंत में चलाए जाते हैं जो आपके अनुभागों के लिए एक नाटक है।

3) मैं उन कार्यों के लिए registerऔर whenकार्यों का उपयोग करूंगा जिन्हें फिर से शुरू किया जाना चाहिए, ध्यान दें कि यह संस्करण आपके साथ होना चाहिए।

कोड स्रोत

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "Play 1"
}

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role2 : Run if change in task c of role 1] *******************************
changed: [localhost]

TASK [role2 : Always true in role2] ********************************************
changed: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "This is a task in a play"
}

RUNNING HANDLER [role1 : handler] **********************************************
ok: [localhost] => {
    "msg": "This is a handler in role1"
}

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "Play 2"
}

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role2 : Run if change in task c of role 1] *******************************
changed: [localhost]

TASK [role2 : Always true in role2] ********************************************
changed: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "This is a task in a play"
}

RUNNING HANDLER [role1 : handler] **********************************************
ok: [localhost] => {
    "msg": "This is a handler in role1"
}

PLAY RECAP *********************************************************************
localhost                  : ok=20   changed=14   unreachable=0    failed=0

समान कार्य करने के बहुत सारे तरीके। हैंडलर को कई बार एक ही प्रक्रिया को फिर से शुरू करने से रोकने के लिए डिज़ाइन किया गया था, जैसे कि एक nginx सर्वर में कई बदलाव, जिसमें वेबसाइट, ssl certs, और अन्य कार्य हैं जिन्हें सेवा पुनरारंभ की आवश्यकता है।


आप " एक विशेष नाटक में सभी कार्यों को पूरा करने के बाद " केवल एक बार चला रहे हैं , और फिर कुछ पूरी तरह से अलग दावा करते हैं " प्रत्येक भूमिका के अंत में एक कार्य चलाएँ "। आपका दावा भी वास्तविकता से अलग है।
Techraf

नहीं, आपको गलतफहमी है, अगर मैं मेटा से 4 बार सर्वर रोल से एक ही हैंडलर को कॉल करता हूं। यह केवल एक बार चलता है
याकूब

प्रश्न स्पष्ट है: हैंडलर कब चलाए जाते हैं? न जाने कितनी बार चलाए गए। और उन्हें एक नाटक के अंत में चलाया जाता है, किसी भूमिका के अंत में नहीं। अवधि। आप किसी तीसरे व्यक्ति का दावा कर रहे हैं, भले ही आपने ऐसा करने के बाद भी मैंने अपना जवाब उदाहरणों के साथ दिया हो, यह दावा गलत है।
टेक्रफ

और मेरा उत्तर है, उन वस्तुओं के लिए कार्यों का उपयोग न करें जो उनकी भूमिका के भीतर फिर से शुरू होनी चाहिए।
जैकब इवांस

@ आप वहां हैं।
जेकब इवान्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.