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:
- Modul Apache diinstal
- Vhosts diaktifkan
- PHP mencoba untuk menginstal dan gagal
- Keluarnya skrip
- (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:
- Jalankan perintah langsung ke server melalui ansible atau ssh
- Edit skrip untuk memicu tugas
- Tambahkan tugas terpisah untuk itu
- 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.*