Cara Menggunakan Handler Di Playbook yang Dimungkinkan

Handlers sama seperti tugas biasa dalam kemungkinan yang hanya berjalan saat diberi tahu. Handler adalah konsep yang sangat berguna dan juga penting dalam Ansible.

Ada dua arahan yang terlibat dalam menjalankan tugas handler.NbspNotify directive yang akan mengirimkan sinyal pemicu ke tugas untuk dijalankan.Direktif Handler di mana tugas dikelompokkan.
Mari kita bicara tentang praktik kasus penggunaan. Katakanlah Anda ingin menulis buku pedoman pengerasan SSH di mana Anda akan membuat beberapa perubahan pada file konfigurasi ssh.

Seperti yang Anda ketahui, perubahan konfigurasi apa pun akan memerlukan layanan dimulai ulang agar perubahan tersebut efektif. Di sinilah penangan sangat efektif.

Setelah tugas membuat perubahan dalam file konfigurasi sshd, kami dapat mengirim sinyal ke tugas yang akan memulai ulang layanan sshd.
Contents
Poin Kunci Penangan yang Mungkin Memanggil Beberapa TugasUrutan PelaksanaanJalankan Hanya SekaliTugas DuplikatMenangani Kegagalan Tugas1. Force Handler2. Abaikan KesalahanFlushing HandlerRun Handler Task Menggunakan “Listen”ConclusionAnsible Handler Points

Sebelum masuk ke bagian hands-on, mari kita pahami beberapa poin penting sehubungan dengan handlers.
Handler tugas hanya akan berjalan ketika tugas induk membuat perubahan (diubah=true).Handler tugas hanya akan berjalan di akhir setiap permainan, tetapi ada opsi untuk menjalankannya di mana pun kita inginkan. Terlepas dari berapa kali Anda memanggil tugas pengendali yang sama dalam permainan di satu host, tugas pengendali hanya akan berjalan sekali. nama harus unik. Jika dua tugas memiliki nama yang sama, hanya tugas pertama yang akan dijalankan. Tugas akan dieksekusi dalam urutan yang ditentukan di bawah arahan handler tetapi tidak dalam urutan yang dipanggil oleh notify directive.
Syntax

Untuk mendefinisikan tugas handler, notify dan handler directive harus digunakan. Notify directive akan mengirimkan sinyal ke handler task untuk dieksekusi.

Di bawah ini adalah contoh buku pedoman. Saya memiliki dua tugas yang ditentukan di bawah arahan handler. Untuk menjalankan tugas ini, perintah notify digunakan dan nama tugas diteruskan sebagai value.

- name: Handlers testing hosts: ubuntu.anslab.com assemble_facts: false tugas: - name: Get the hostname shell: hostname -s register : hostname notify: print hostname handlers: - name: print hostname debug: var: hostname.stdout - name: print IP debug: var: IP.stdout

Di bawah ini adalah output dari playbook. Meskipun saya memiliki dua tugas di handler, hanya satu tugas yang berjalan yang dipanggil melalui notify directive.
Memanggil Beberapa Tugas

Di bawah satu notify directive Anda dapat memanggil beberapa tugas handler. Berikan nama tugas handler dalam format daftar YAML.

 - name: Get the hostname shell: hostname -s register: hostname notify: - print hostname - print IP

Python list notation juga dapat digunakan untuk memanggil beberapa tugas handler.

 - name: Dapatkan shell nama host: hostname -s register: hostname notify: ["print hostname", "print IP"]

Order Of Execution

Handler tugas akan berjalan hanya di akhir permainan bahkan ketika dipanggil sebelum tugas apa pun.

-name: Handler menguji host: ubuntu.anslab.com assemble_facts: tugas palsu: - nama: Dapatkan shell nama host: nama host -s daftar: nama host beri tahu: cetak nama host - nama: Dapatkan alamat IP dari nama host shell: nama host -Saya mendaftar: IP beri tahu : print IP handler: - name: print hostname debug: var: hostname.stdout - name: print IP debug: var: IP.stdout

Perhatikan buku pedoman di atas. Tugas pertama (Dapatkan nama host) memanggil tugas penangan (cetak nama host). Tugas kedua memanggil tugas handler kedua (print IP).

Ketika saya menjalankan buku pedoman, kedua tugas akan dijalankan terlebih dahulu dan mengirim sinyal ke pengendali dan tugas pengendali akan berjalan setelah semua tugas selesai.
Perhatian: terlepas dari bagaimana tugas pengendali dipanggil, itu akan dijalankan dalam urutan itu didefinisikan dalam direktif handler.
Run Only Once

Anda dapat memanggil tugas handler yang sama beberapa kali, tetapi tugas handler hanya akan dijalankan satu kali.

Saya menjalankan buku pedoman yang sama yang saya gunakan di bagian sebelumnya tetapi memodifikasi perintah notify untuk memanggil tugas handler yang sama (cetak nama host). Dapatkan shell hostname: hostname -s register: hostname notify: print hostname – name: Dapatkan alamat IP dari hostname shell: hostname -Saya mendaftar: IP notify: print hostname handlers: – name: print hostname debug: var: hostname.stdout – name: print IP debug: var: IP.stdout
Seperti yang Anda lihat dari output di bawah, tugas print hostname handler hanya berjalan sekali.
Duplicate Tasks

Seperti yang saya katakan di bagian pendahuluan, Anda harus memberikan nama deskriptif dan unik untuk tugas tersebut. Jika dua atau lebih tugas didefinisikan dengan nama yang sama hanya tugas pertama yang dibaca oleh ansible yang akan berjalan mengabaikan semua tugas lain dengan nama yang sama.

Jika Anda melihat tugas di bawah ini, kedua nama tugas tersebut sama. Sekarang ketika saya menjalankan buku pedoman, ansible akan menjalankan tugas handler pertama dan mencetak handler IP.

: - name: print hostname debug: var: IP.stdout - name: print hostname debug: var: hostname.stdout

Handling Task Failures

In ansible , jika tugas gagal, tugas berikutnya tidak akan berjalan. Cara handler menangani kegagalan adalah, jika ada tugas yang gagal di host tertentu, maka tugas handler tidak akan berjalan untuk host tersebut meskipun tugas yang gagal bukan tugas induk (notify directive).

Jika Anda dapat melihat playbook di bawah ini, ada dua tugas yang menggunakan modul shell. Tugas pertama menggunakan /bin/true dan akan selalu berjalan dengan baik. Tugas ini memanggil tugas handler (run_now) yang hanya mencetak pesan ke stdout. Tugas kedua diatur untuk gagal dengan menggunakan /bin/false.

- name: Menguji host handler: ubuntu.anslab.com kumpulkan_facts: tugas palsu: - nama: setel tugas ke sukses shell: /bin/true notify: run_now - name: atur tugas agar gagal Shell: /bin/false handlers: - name: run_now debug: msg="Saya dipanggil dari [ tugas 1 ]"

Jika Anda dapat melihat gambar di bawah ini, output dari tugas pertama berjalan dengan baik dan sebuah sinyal dikirim ke tugas handler untuk dijalankan tetapi tugas berikutnya di host yang sama gagal sehingga tugas handler tidak berjalan.

Mari kita lihat cara menangani kegagalan tugas dengan opsi yang berbeda.
1. Force Handlers

Anda dapat menyetel properti force_handlers: true di buku pedoman yang akan menjalankan tugas handler meskipun Anda mengalami kegagalan tugas.

Anda juga dapat menyetel parameter ini di area yang berbeda.
Playbook force_handlers: file trueansible.cfg force_handlers = trueArgumen baris perintah –force-handler2. Abaikan Errors

Anda juga dapat menyetel properti aign_errors: true yang akan mengabaikan tugas yang gagal dan akan menjalankan tugas handler.
Flushing Handler

Saat ini Anda seharusnya sudah memahami bahwa tugas handler hanya akan berjalan di akhir permainan. Tetapi ada cara untuk membuatnya berjalan kapan saja sesuai keinginan kita. Hal ini dapat dicapai melalui modul meta flush_handler command.

$ ansible-doc meta

Flush_handlers akan menjalankan semua tugas yang telah mengirimkan sinyal ke notify directive.

name: Testing handler hosts: ubuntu.anslab.com assemble_facts: false tasks : - name: set a task to success shell: /bin/true notify: run_now - name: Run handler now meta: flush_handlers - name: set a task to fail Shell: /bin/false handlers: - name: run_now debug: msg ="Saya dipanggil dari [ tugas 1 ]"

Seperti yang dapat Anda lihat dari output di atas, tugas handler berjalan sebagai tugas kedua di play.
Run Handler Task Using “Listen”

Sampai sekarang kami telah memicu semua tugas handler menggunakan nama tugas. Menggunakan “dengarkan”, Anda dapat mengelompokkan banyak tugas dan menjalankan semua tugas melalui pernyataan pemberitahuan. Ini adalah opsi alternatif yang baik untuk tag saat menggunakan handlers.

Jika Anda melihat buku pedoman di bawah ini, saya telah menyetel mendengarkan “semua tugas” dan memanggilnya melalui direktif notify.

name: Menguji host handler: ubuntu.anslab.com assemble_facts : tugas palsu: - nama: atur tugas agar berhasil Shell: /bin/true notify: "semua tugas" penangan: - nama: tugas penangan 1 debug: pesan: Ini adalah tugas penangan 1 dengarkan: "semua tugas" - nama: handler task 2 debug: msg: Ini adalah handler task 2 mendengarkan: "all task" - nama: handler task 3 debug: msg: Ini adalah handler task 3 mendengarkan: "all task"

Kesimpulan

Dalam artikel ini kita telah melihat apa itu handler dan cara menggunakan arahan notify dan handler dalam buku pedoman yang memungkinkan untuk mencapai tujuan yang berbeda.

Kami juga telah melihat cara menangani kegagalan tugas dengan dua opsi berbeda. Akhirnya, kami menyimpulkan artikel dengan cara memicu banyak tugas menggunakan mendengarkan direktif.

Resource:
Handlers: menjalankan operasi saat perubahan