ตัวจัดการ Ansible ถูกกำหนดไว้ในบทบาทที่ถูกเรียกใช้หลังจาก playbook ทั้งหมดหรือบทบาทหรือไม่


13

ฉันกำลังใช้ Ansible 2.0 และฉันสามารถเรียกใช้สิ่งนี้ได้ แต่ฉันอาจถูกหลอกให้เชื่อสิ่งที่ไม่เป็นความจริงจากการทดสอบเชิงประจักษ์ของฉันและฉันไม่สามารถหาเอกสารใด ๆ

หากตัวจัดการไม่ได้ทำงานในตอนท้ายของงานของพวกเขานี่คือปริศนาของฉัน ฉันมี playbook ที่มี 5 บทบาทอยู่ในนั้นฉันต้องการเพิ่ม 6 บทบาทในตอนท้ายซึ่งจำเป็นต้องมีตัวจัดการของบทบาทที่ 4 ให้เสร็จสมบูรณ์ก่อนจึงจะสามารถเริ่มต้นได้

มีวิธีใดที่จะเรียกใช้ Ansible เพื่อพึ่งพาตัวจัดการที่เสร็จสมบูรณ์ (เช่นบทบาทที่ทำเสร็จสมบูรณ์) ก่อนที่จะทำอย่างอื่นหรือฉันใช้ตัวจัดการผิด

คำตอบ:


17

ตัวจัดการถูกดำเนินการ:

  • ในตอนท้ายของการเล่น (ไม่ใช่ playbook)
  • ในการดำเนินmeta: flush_handlersงาน

ดังนั้น " เพื่อเพิ่มบทบาท 6 ถึงจุดสิ้นสุดที่ต้องมีตัวจัดการของบทบาทที่ 4 " คุณต้อง:

  • เพื่อแยกการกำหนดบทบาทออกเป็นการเล่นแยก
  • หรือเพิ่มงานเมตาและรวมถึงบทบาทที่ 6 กับinclude_roleโมดูล :

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

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

3) ฉันจะใช้registerและwhenฟังก์ชั่นสำหรับงานที่ควรเริ่มต้นใหม่โปรดทราบว่า var นี้ควรพกติดตัวไปด้วย

รหัสแหล่งที่มา

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 ครั้งจากเมตา มันทำงานเพียงครั้งเดียว
Jacob Evans

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

และคำตอบของฉันคือใช้งานที่ไม่จัดการสำหรับรายการที่จะต้องเริ่มต้นใหม่ภายในบทบาทของพวกเขา
Jacob Evans

@ techraf คุณอยู่ที่นั่น
Jacob Evans
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.