Apakah penangan yang mungkin ditentukan dalam peran dijalankan setelah seluruh playbook atau peran itu?


12

Saya menjalankan Ansible 2.0, dan saya bisa menjalankan ini, tetapi saya juga bisa tertipu untuk mempercayai sesuatu yang tidak benar dengan tes empiris saya dan saya tidak dapat menemukan dokumentasi untuk memberi tahu saya ketika penangan seharusnya berlari.

Jika pawang tidak berlari di akhir tugas mereka, ini adalah teka-teki saya. Saya punya buku pedoman dengan 5 peran di dalamnya, saya ingin menambahkan 6 peran sampai akhir yang harus diselesaikan penangan peran ke-4 sebelum dapat mulai.

Adakah cara untuk menjalankan Ansible untuk mengandalkan penangan yang selesai (yaitu peran yang sepenuhnya selesai) sebelum melakukan sesuatu yang lain atau saya salah menggunakan penangan?

Jawaban:


15

Penangan dieksekusi:

  • di akhir drama (bukan playbook)
  • tentang menjalankan meta: flush_handlerstugas

Jadi " untuk menambahkan 6 peran pada bagian akhir yang membutuhkan penangan peran ke-4 " yang Anda butuhkan:

  • baik untuk membagi tugas peran menjadi drama yang terpisah;
  • atau tambahkan tugas meta dan sertakan peran ke-6 dengan include_rolemodul :

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

Untuk kasus penggunaan Anda, saya akan menyarankan metode pertama karena include_rolemodul ini masih sangat segar dan ada kebiasaan saat menggunakannya (lihat pertanyaan ini pada SO ).


Selain itu, harap perhatikan bahwa nama-nama penangan dan panggilan dengar bersifat global, sehingga dua penangan dalam peran terpisah akan mengalami konflik jika mereka memiliki nama yang sama dan kedua peran tersebut ditetapkan dalam satu permainan. (ref. Penangan: Menjalankan Operasi Saat Berubah )

Penangan [] dirujuk oleh nama unik secara global, dan diberi tahu oleh pemberi notifikasi. [] seorang pawang, itu akan berjalan hanya sekali, setelah semua tugas selesai dalam permainan tertentu.

Nama-nama handler dan dengarkan topik langsung di namespace global


  • Bukti empiris (jalankan skrip shell ini untuk mengonfirmasi handler dieksekusi pada akhir permainan - ada komentar dan jawaban yang bertentangan di sini):

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

    Hasil:

    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"
    
  • Putar dimodifikasi untuk mengandung 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"
    

    Hasil:

    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

Penangan adalah daftar tugas, tidak benar-benar berbeda dari tugas biasa, yang dirujuk oleh nama unik secara global, dan diberitahukan oleh pemberi notifikasi. Jika tidak ada yang memberi tahu penangan, itu tidak akan berjalan. Terlepas dari berapa banyak tugas yang memberi tahu penangan, itu akan berjalan hanya sekali, setelah semua tugas selesai dalam permainan tertentu. dok yang memungkinkan

1) Penangan yang melakukan hal yang sama harus dinamai sama.
restart nginxSELALU me-restart nginx, bukan handler1danhandler2

2) Penangan dijalankan pada AKHIR dari seluruh "Mainkan" permainan yang dicakup ke bagian Anda.

3) Saya akan menggunakan registerdan whenfungsi untuk tugas-tugas yang harus dimulai kembali, perhatikan var ini harus dibawa bersama Anda.

Sumber Kode

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

Banyak cara untuk melakukan tugas yang sama. Handler dirancang untuk mencegah memulai kembali proses yang sama beberapa kali, seperti beberapa perubahan pada server nginx yang memiliki situs web, sertifikat ssl, dan tugas-tugas lain yang memerlukan restart layanan.


Anda mengutip " jalankan hanya sekali, setelah semua tugas selesai dalam permainan tertentu " dan kemudian mengklaim sesuatu yang sama sekali berbeda " jalankan tugas di akhir setiap peran ". Klaim Anda juga berbeda dari kenyataan.
techraf

tidak Anda salah paham, jika saya memanggil handler yang sama dari peran server 4 kali dari meta. hanya berjalan sekali
Jacob Evans

Pertanyaannya jelas: kapan penangan dijalankan? Tidak berapa kali mereka dijalankan. Dan mereka dijalankan di akhir permainan, bukan di akhir peran. Titik. Anda adalah orang ketiga yang mengklaim sebaliknya, meskipun Anda melakukannya setelah saya memposting jawaban saya dengan contoh yang menunjukkan bahwa klaim ini salah.
techraf

dan jawaban saya adalah, gunakan tugas bukan penangan untuk item yang harus dimulai ulang dalam peran mereka.
Jacob Evans

@ Techraf, ini dia.
Jacob Evans
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.