Kemungkinan Cara memutar ulang notifikasi

Saat ini saya beralih dari boneka ke Ansible dan saya agak bingung dengan beberapa konsep atau setidaknya cara kerja ansible.

Beberapa info tentang penyiapan:

Saya menggunakan contoh dari Praktik Terbaik yang Mungkin dan telah menyusun proyek saya serupa dengan beberapa peran (buku pedoman ) dan seterusnya.

Saya menggunakan Vagrant untuk penyediaan dan kotaknya adalah Saucy64 VBox.

Dasarnya Kebingungan:

Saat saya menyediakan, dan saya menjalankan kemungkinan, tugas mulai dijalankan, lalu tumpukan notifikasi.

Contoh:

Tugas terakhir:

TASK: [mysql | delete anonymous MySQL server user for localhost] ************** 
<127.0.0.1> REMOTE_MODULE mysql_user user='' state=absent 
changed: [default] => {"changed": true, "item": "", "user": ""}

Kemudian pemberitahuan pertama:

NOTIFIED: [timezone | update tzdata] ****************************************** 
<127.0.0.1> REMOTE_MODULE command /usr/sbin/dpkg-reconfigure --frontend noninteractive tzdata
changed: [default] => {"changed": true, "cmd": ["/usr/sbin/dpkg-reconfigure", "--frontend", "noninteractive", "tzdata"], "delta": "0:00:00.224081", "end": "2014-02-03 22:34:48.508961", "item": "", "rc": 0, "start": "2014-02-03 22:34:48.284880", "stderr": "\nCurrent default time zone: 'Europe/Amsterdam'\nLocal time is now:      Mon Feb  3 22:34:48 CET 2014.\nUniversal Time is now:  Mon Feb  3 21:34:48 UTC 2014.", "stdout": ""}

Sekarang semuanya baik-baik saja. Ketika peran meningkat, semakin banyak pemberitahuan yang terhenti.

Sekarang masalahnya.

Ketika pemberitahuan gagal, penyediaan berhenti seperti biasa. Tapi kemudian tumpukan notifikasi kosong! Ini berarti bahwa semua pemberitahuan setelah yang salah tidak akan dieksekusi!

Jika demikian maka jika Anda mengubah pengaturan vhosts untuk apache dan mendapat pemberitahuan untuk memuat ulang layanan apache maka ini akan hilang.

Mari kita beri contoh (bahasa semu):

- name: Install Apache Modules
  notify: Restart Apache

- name: Enable Vhosts
  notify: Reload Apache

- name: Install PHP
  command: GGGGGG # throws an error

Ketika hal di atas dijalankan:

  1. Modul Apache diinstal
  2. Vhosts diaktifkan
  3. PHP mencoba untuk menginstal dan gagal
  4. Keluarnya skrip
  5. (Di mana notifikasinya?)

Sekarang pada titik ini semua tampak logis tetapi sekali lagi Ansible mencoba menjadi pintar (tidak!*) menumpuk pemberitahuan dan dengan demikian memuat ulang dan memulai ulang apache akan menghasilkan satu kali restart apache yang dijalankan di akhir penyediaan. Artinya semua notifikasi akan gagal!!!

Nah sampai disini bagi sebagian orang ini juga oke. Mereka akan mengatakan hei, jalankan kembali penyediaannya dan notifikasi akan menyala, sehingga apache akhirnya akan dimuat ulang dan situs akan aktif kembali. Bukan itu masalahnya.

Saat skrip dijalankan untuk kedua kalinya setelah kode untuk menginstal php diperbaiki, notifikasi tidak akan berjalan karena desain. Mengapa?

Inilah alasannya: Ansible akan memiliki tugas yang berhasil dijalankan, ditandai sebagai Selesai/Hijau sehingga tidak mendaftarkan pemberitahuan apa pun untuk tugas ini. Penyediaan akan berhasil dan untuk memicu pemberitahuan dan restart apache, Anda dapat melakukan salah satu hal berikut:

  1. Jalankan perintah langsung ke server melalui ansible atau ssh
  2. Edit skrip untuk memicu tugas
  3. Tambahkan tugas terpisah untuk itu
  4. Hancurkan instance kotak dan penyediaan ulang

Ini cukup membuat frustrasi karena memerlukan pembersihan total pada kotak, atau apakah saya tidak memahami sesuatu dengan benar dengan Ansible?

Apakah ada cara lain untuk 'mengklaim kembali'/memutar ulang/memaksa eksekusi notifikasi?

  • Cara yang cerdas adalah dengan menandai tugas sebagai belum selesai lalu memulai ulang notifikasi atau menyimpan antrean terpisah dengan notifikasi sebagai tugasnya sendiri.*

person Jimmy Kane    schedule 03.02.2014    source sumber


Jawaban (2)


Ya, itulah salah satu kekurangan Ansible jika dibandingkan dengan Puppet. Boneka bersifat deklaratif dan tidak salah seperti Ansible (atau Chef) dalam hal ini. Ada sisi positif dan negatifnya, misalnya Wayang membutuhkan sedikit waktu sebelum mulai berjalan karena perlu menyusun katalognya.

Jadi, Anda benar jika skrip Ansible Anda error maka pembaruan notifikasi Anda tidak akan terjadi. Satu-satunya cara kita menyiasatinya adalah dengan menggunakan pernyataan kondisional. Di buku pedoman Anda, Anda dapat melakukan sesuatu seperti ini:

- name: My cool playbook
  hosts: all

  vars:
      force_tasks: 0

  tasks:
    - name: Apache install
      action: apt pkg=$item state=latest
      with_items:
       - apache2
       - apache2-mpm-prefork

    - name: Restart apache
      action: service name=apache2 state=restart
      when: force_tasks

Kemudian ketika Anda menjalankan pedoman Anda, Anda dapat meneruskan force_tasks sebagai variabel lingkungan:

ansible-playbook -i my_inventory -e "force_tasks=True" my_ansible_playbook.yml

Anda dapat melakukannya dengan cara yang sama dengan tag.

person Rico    schedule 07.02.2014
comment
Tank Riko. Itulah pendekatan yang hampir saya ambil. Saya tidak menambahkan sebagai variabel tetapi sebagai tag. Saya merasa ini lebih pas. - person Jimmy Kane; 08.02.2014

Jalankan buku pedoman yang memungkinkan dengan bendera --force-handlers. Ini memberitahu Ansible untuk menjalankan penangan antrian apa pun bahkan jika tugas gagal dan pemrosesan lebih lanjut berhenti. Pengembang Ansible berencana menambahkan ini sebagai opsi pada file ansible.cfg sehingga dapat disetel secara global dan dilupakan. Saya tidak tahu jangka waktunya untuk itu.

person John McNulty    schedule 06.03.2015