ভূমিকার মধ্যে সংজ্ঞায়িত হ্যান্ডলারগুলি পুরো প্লেবুক বা ভূমিকার পরে চলে?


13

আমি আনসিবল ২.০ চালাচ্ছি, এবং আমি কেবল এটি চালাতে পারি, তবে এমন কিছু বিশ্বাস করতেও আমার প্ররোচিত হতে পারে যা আমার অভিজ্ঞতাবাদী পরীক্ষাগুলির দ্বারা সত্য নয় এবং হ্যান্ডলারের দৌড়ানোর সময় কখন আমাকে ডকুমেন্টেশন পাওয়া যায় না তা বলার জন্য।

হ্যান্ডলারের যদি তাদের কাজ শেষে না চালানো হয় তবে এটি আমার বিচক্ষণতা। এতে 5 টি ভূমিকা সহ আমি একটি প্লেবুক পেয়েছি, আমি শেষ পর্যন্ত একটি 6 টি ভূমিকা যুক্ত করতে চাই যা 4 র্থ রোলটির হ্যান্ডলারগুলি শুরু হওয়ার আগেই শেষ করা উচিত।

কোনও অন্য কিছু করার আগে হ্যান্ডলারটি সম্পূর্ণ হয়ে যাওয়ার (যেমন একটি ভূমিকা সম্পূর্ণভাবে সম্পূর্ণ করা হচ্ছে) উপর নির্ভর করার জন্য কী অনিশ্চিত চালানোর কোনও উপায় আছে বা আমি হ্যান্ডলারগুলি ভুল ব্যবহার করছি?

উত্তর:


17

হ্যান্ডলারগুলি কার্যকর করা হয়:

  • একটি নাটক শেষে (প্লেবুক নয়)
  • meta: flush_handlersকার্য সম্পাদন উপর

সুতরাং " আপনার চতুর্থ ভূমিকার হ্যান্ডলারগুলি থাকা দরকার এমন শেষে 6 টি ভূমিকা যুক্ত করতে ":

  • হয় ভূমিকাকে আলাদা নাটকে বিভক্ত করা;
  • বা একটি মেটা টাস্ক যুক্ত করুন এবং include_roleমডিউল সহ the ষ্ঠ ভূমিকা অন্তর্ভুক্ত করুন :

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

আপনার ব্যবহারের ক্ষেত্রে, আমি প্রথম পদ্ধতিটি পরামর্শ দেব কারণ include_roleমডিউলটি এখনও খুব সতেজ এবং এটি ব্যবহার করার সময় প্রশ্নগুলি রয়েছে ( এসও তে এই প্রশ্নটি দেখুন )।


তদুপরি, দয়া করে লক্ষ্য করুন যে হ্যান্ডলারের নাম এবং শোনার কলগুলি বিশ্বব্যাপী, সুতরাং পৃথক চরিত্রে দু'জন হ্যান্ডলার যদি একই নাম এবং উভয় ভূমিকা একক নাটকে নির্ধারিত হয় তবে তারা বিরোধে পড়বে। (রেফ। হ্যান্ডলারগুলি: পরিবর্তনগুলি চলমান চলছে )

হ্যান্ডলারগুলি [] একটি বিশ্বব্যাপী অনন্য নাম দ্বারা রেফারেন্স করা হয়, এবং বিজ্ঞপ্তিদাতাদের দ্বারা অবহিত করা হয়। [] একজন হ্যান্ডলার, এটি একটি নির্দিষ্ট নাটকটিতে সমস্ত কাজ শেষ করার পরে একবারে চলবে।

হ্যান্ডলারের নাম এবং শোনার বিষয়গুলি বিশ্বব্যাপী নেমস্পেসে লাইভ।


  • গবেষণামূলক প্রমাণ (নাটকটির শেষে হ্যান্ডলারগুলি কার্যকর করা হয়েছে তা নিশ্চিত করতে এই শেল স্ক্রিপ্টটি চালান - এখানে বিপরীত মন্তব্য এবং উত্তর ছিল):

    #!/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

হ্যান্ডলারগুলি হ'ল কার্যগুলির তালিকাগুলি, নিয়মিত কর্মের চেয়ে কোনও আলাদা নয়, যা বিশ্বব্যাপী অনন্য নাম দ্বারা উল্লেখ করা হয় এবং বিজ্ঞপ্তিদাতাদের দ্বারা বিজ্ঞপ্তি দেওয়া হয়। যদি কোনও হ্যান্ডলারকে কিছু না জানায় তবে তা চলবে না। কোনও হ্যান্ডলারকে কতগুলি কাজই অবহিত করুন না কেন, এটি নির্দিষ্ট খেলায় সমস্ত টাস্ক সম্পূর্ণ করার পরে, এটি একবারে চলবে। জবাবদিহি ডক

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

একই কাজ করার জন্য প্রচুর উপায়। হ্যান্ডলারগুলি একই প্রক্রিয়াটিকে একাধিকবার পুনঃসূচনা প্রতিরোধ করার জন্য ডিজাইন করা হয়েছিল, যেমন একটি এনজিএনএক্স সার্ভারে একাধিক পরিবর্তন যার মধ্যে ওয়েবসাইট রয়েছে, এসএসএল শংসাপত্রগুলি এবং পরিষেবাগুলি পুনরায় চালু করার দরকার আছে এমন অন্যান্য কার্যগুলি।


আপনি " নির্দিষ্ট খেলায় সমস্ত কাজ শেষ করার পরে, একবারে রান করুন " উদ্ধৃত করছেন এবং তারপরে সম্পূর্ণ ভিন্ন কিছু দাবি করে " প্রতিটি ভূমিকা শেষে একটি কাজ চালান "। আপনার দাবিও বাস্তবতা থেকে পৃথক।
টেক্রাফ

না আপনি ভুল বুঝে না, যদি আমি মেটা থেকে 4 বার সার্ভারের ভূমিকা থেকে একই হ্যান্ডলারটিকে কল করি। এটি কেবল একবারে চালিত হয়
জ্যাকব ইভান্স

প্রশ্নটি পরিষ্কার: হ্যান্ডলারগুলি কখন চালিত হয়? কতবার চালানো হয় তা নয়। এবং এগুলি কোনও নাটকের শেষে পরিচালিত হয়, কোনও ভূমিকা শেষে নয়। সময়কাল। আপনি তৃতীয় ব্যক্তি অন্যথায় দাবি করছেন, যদিও আমি এই দাবিটি মিথ্যা দেখাচ্ছে এমন উদাহরণ দিয়ে আমার উত্তর পোস্ট করার পরে আপনি তা করেছেন।
টেক্রাফ

এবং আমার উত্তর হ'ল, আইটেমগুলির জন্য হ্যান্ডলারগুলি নয় এমন কাজগুলি ব্যবহার করুন যা তাদের ভূমিকার মধ্যে পুনরায় শুরু করতে হবে।
জ্যাকব ইভান্স 13

আপনি এখানে আছেন।
জ্যাকব ইভান্স 14
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.