Tinjauan kode - praktik rekayasa dalam hal metodologi pengembangan yang fleksibel. Ini adalah analisis (inspeksi) kode untuk mengidentifikasi kesalahan, kekurangan, perbedaan dalam gaya penulisan kode dan untuk memahami apakah kode menyelesaikan tugas.

Hari ini saya akan berbicara tentang bagaimana kami mengatur proses peninjauan untuk memantau konfigurasi di Zabbix. Artikel ini akan berguna bagi mereka yang bekerja dengan sistem pemantauan Zabbix, baik dalam tim besar, dan sendirian, bahkan jika Anda memiliki "sepuluh host, apa yang ada untuk ditinjau".
Masalah apa yang kita pecahkan
Untuk memantau layanan internal kami dan membangun infrastruktur, kami menggunakan Zabbix. Kami memiliki konvensi penamaan - konvensi nama (kami menggunakan model peran dengan menyoroti Peran, template Profil untuk pemantauan), tetapi tidak ada tim pemantauan khusus (ada insinyur senior yang "memakan anjing" dalam masalah pemantauan), ada insinyur dan insinyur junior, ~ 500 host, ~ 150 templat (infrastruktur kecil, tetapi sangat dinamis).
Infrastruktur ini digunakan untuk mendukung dan mengotomatisasi proses pengembangan di perusahaan , selain dukungannya, kami juga mengembangkan alat otomatisasi dan integrasi, oleh karena itu kami memiliki sedikit pengalaman dan pemahaman tentang proses pengembangan dari dalam.
Dengan meningkatnya jumlah karyawan dan perubahan yang dimasukkan ke dalam sistem pemantauan, semakin banyak kesalahan tipikal yang terjadi yang sulit dilacak:
- Mengikat item, memicu langsung ke host, di luar template (dan beberapa host tetap tidak diawasi)
- Nilai pemicu yang salah (semacam menyetujui ruang yang tersedia 3 GB, tapi salah ketik, kami mendapatkan pemicu yang tidak pernah berfungsi sebesar 34 GB).
- Gagal mematuhi konvensi nama - dan kami mendapatkan nama yang tidak dapat dipahami dari pemicu Script yang gagal (meskipun ini berarti bahwa sistem pengiriman pembaruan tidak berfungsi) atau template Template Gitlab (memantau server atau agen mana?).
- Menonaktifkan pemicu, sementara, untuk pengujian. Akibatnya, kami melewatkan peringatan tentang infrastruktur dan berdiri.
Dalam dunia programmer, semua masalah ini diselesaikan dengan sederhana: linter, codereview. Jadi mengapa tidak mengambil praktik terbaik ini untuk ulasan konfigurasi Zabbix? Ambillah!

Kami sudah menulis sebelumnya tentang pro dan contoh-contoh tinjauan kode: Menerapkan inspeksi kode dalam proses pengembangan , Contoh praktis penerapan inspeksi kode, inspeksi kode . Ringkasan
Mengapa Anda mungkin perlu meninjau konfigurasi Zabbix:
- Periksa apakah host dan template diberi nama sebagaimana diterima dalam perintah ( konvensi nama ).
- Latih karyawan baru dan verifikasi bahwa mereka melakukan tugas sebagaimana dibahas.
- Transfer pengetahuan antara karyawan yang berpengalaman.
- Pemberitahuan terpicu dimatikan secara tidak sengaja atau sementara.
- Perhatikan nilai yang salah pada item atau trigger - last (0) dan bukan min (5m) .
Tambahkan masalah Anda di komentar, coba cari tahu bersama bagaimana menyelesaikannya dengan ulasan.
Seperti Zabbix dengan pelacakan perubahan
Zabbix memiliki subsistem Audit , dengan bantuannya kami melihat siapa yang membuat perubahan pada konfigurasi. Kelemahan signifikannya adalah banyaknya acara yang disimpan, karena menyimpan setiap peristiwa pengguna.
Bayangkan bahwa setiap perubahan kode tetap dalam sejarah git, Anda mencoba untuk memilih nama variabel selama satu jam, mencoba 40 opsi dan semuanya sekarang disimpan, setiap perubahan adalah komit terpisah, dan kemudian mengirimkan riwayat komit ini ke ulasan, tanpa kemampuan untuk membandingkan awal dan akhir versi. Mengerikan, kan?
Dan di Zabbix Audit, itu benar. Ini dapat digunakan untuk melacak perubahan, tetapi itu tidak memungkinkan Anda untuk dengan cepat melihat perbedaan (perbedaan) antara dua kondisi sistem (di awal minggu dan di akhir). Selain itu, semua tindakannya dibagi berdasarkan jenis: tambah, ubah, hapus harus dilihat di jendela yang berbeda. Contohnya dapat ditemukan di Zabbix Anda pada tab Audit (atau lihat tangkapan layar). Sulit untuk memahami keadaan awal, apa saat ini, perubahan apa selama seminggu. Situasinya rumit ketika kami memiliki lusinan perubahan per minggu.

Saya ingin mekanisme yang memungkinkan:
- Sekali seminggu atau setelah menyelesaikan tugas mengubah logika pemantauan, buat peran dari status sistem.
- Bandingkan konfigurasi nugget saat ini dengan nugget sebelumnya (beda).
- Secara otomatis memeriksa konvensi nama.
- Periksa kualitas tugas, berikan rekomendasi, saran, diskusikan solusi.
- Periksa apakah perubahan itu sah - semua dilakukan sesuai dengan tugas.
- Gunakan alat yang dikenal untuk pengembang - git, diff, mergerequest.
- Putar kembali ke beberapa kondisi sistem, tetapi jangan kehilangan data (karena itu, cadangan tidak cocok).
- Kontrol entitas Zabbix - host, templat, tindakan, makro, layar, peta.
Sekarang mari kita bicara tentang bagaimana kami menerapkan mekanisme dan bagaimana itu dapat bermanfaat bagi Anda untuk infrastruktur Zabbix Anda.
Membuat tinjauan konfigurasi Zabbix
Untuk menyimpan konfigurasi Zabbix, kami menggunakan format berikut:
- XML asli - diekspor menggunakan Ekspor Zabbix asli. Gunakan untuk host, templat, objek layar. Ada beberapa fitur:
- XML sulit dibaca dan dilihat perubahannya;
- berisi semua bidang, termasuk yang kosong;
- berisi tanggal lapangan - tanggal ekspor, kami hentikan itu.
- Raw JSON - beberapa jenis objek yang tidak dapat diekspor Zabbix (tindakan, mediatypes), tetapi mereka penting dan saya ingin melihat perubahannya, jadi kami mengambil data mentah dari ZabbixAPI dan menyimpannya di JSON.
- YAML yang Dapat Dibaca - Kami memproses XML dan JSON yang diekspor dan menyimpannya dalam YAML yang mudah dibaca dan nyaman digunakan manusia. Dengan itu, Anda mudah menangani perubahan besar dengan mata Anda. Tambahkan pengolahan kecil di sana:
- Menghapus bidang tanpa nilai adalah titik yang dapat diperdebatkan, sehingga kami dapat melewati bidang kosong, meskipun harus diisi, misalnya, bidang dengan deskripsi masalah di pemicu (trigger.description). Setelah diskusi, diputuskan bahwa akan lebih baik untuk menghapus bidang kosong, ada terlalu banyak. Jika mau, Anda dapat membuat pengecualian pada beberapa bidang kosong dan tidak menghapusnya.
- Kami menghapus tanggal - mereka berubah setiap kali dan ketika menggabungkan permintaan ditampilkan sebagai perubahan untuk setiap host.
- Anda dapat menambahkan operasi lain secara opsional untuk mengisi informasi - misalnya userid ditulis dalam aksi alih-alih pengguna, misalnya.
Kami membedakan tiga repositori git (kami menggunakan gitlab untuk penyimpanan, tetapi VCS apa pun akan melakukannya):
- zabbix-review-export - ini akan menyimpan kode ekspor (skrip Python) dan parameter untuk pekerjaan gitlab-ci.
- zabbix-xml - kami menyimpan XML + JSON, semuanya dalam satu cabang. Meninjau bisnis ini sulit dan memakan waktu. Digunakan untuk mengembalikan status konfigurasi Zabbix untuk waktu tertentu.
- zabbix-yaml adalah repositori utama kami, di sini kami membuat permintaan penggabungan, melihat perubahan, mendiskusikan keputusan yang dibuat, bergabung dalam master jika tidak ada komentar.
Dalam repositori ini kami menyimpan data konfigurasi, aturannya adalah sebagai berikut:
Sekarang kita melihat dengan jelas jenis objek apa yang telah berubah, dan jelas objek mana yang telah berubah; Pada contoh di bawah ini, template Profil telah berubah . Scmdev. FlusContinuousTest .

Tunjukkan pada contoh
Untuk melihat perubahan, kami menggunakan mekanisme permintaan gabungan di gitlab.
Mengubah template Profil. DevOps. Tes - mengubah ekspresi pemicu. Templat, seperti yang ada di folder templat :

Mengubah ekspresi di pemicu dan prioritas:

Tautkan ke satu templat lainnya:

Mengubah tindakan - menambahkan baris baru ke akhir teks secara default:

Contoh diskusi dalam permintaan gabungan (seperti halnya programmer!) - dapat dilihat bahwa mereka menghubungkan template standar langsung ke host, tetapi perlu menyoroti peran terpisah untuk masa depan. Cuplikan layar dari ulasan lama, kemudian masih menggunakan representasi konfigurasi XML.

Secara umum, semuanya sederhana:
- Menambahkan host baru atau objek lain - file baru dibuat.
- Mengubah host atau objek lain - tampak berbeda.
- Dihapus - file telah dihapus.
Misalkan Anda menyelesaikan tugas dan ingin meminta seorang kolega untuk melihat apakah Anda telah melupakan sesuatu. Kami meminta ulasan: untuk ini, di repositori zabbix-review-export , jalankan pekerjaan gitlab-ci dengan awal manual.

Kami menetapkan permintaan penggabungan kepada seorang kolega yang mencari, membahas dan memperbaiki infrastruktur pemantauan kode.
Sekali seminggu, tinjauan baru diluncurkan untuk melacak perubahan kecil, untuk ini, sesuai dengan jadwal ( Jadwal ), konfigurasi diekspor dan disimpan ke repositori git (dengan komit baru), dan guru pemantau meninjau perubahan tersebut.
Anda menyebar dengan lembut, tetapi Anda harus mencoba
Sekarang kami akan memberi tahu Anda cara mengonfigurasi sistem ini untuk tinjauan konfigurasi Zabbix ( kami menyukai open source dan mencoba berbagi praktik terbaik kami dengan komunitas).
Ada dua kemungkinan penggunaan:
- Jalankan skrip ekspor dengan tangan - jalankan skrip, lihat perubahannya, buat
git add * && git commit && git push
. Opsi ini cocok untuk perubahan yang jarang terjadi atau saat Anda hanya bekerja dengan sistem pemantauan. - Gunakan gitlab-ci untuk otomatisasi - maka Anda hanya perlu mengklik tombol start (lihat screenshot di atas). Opsi lebih cocok untuk yang besar
malas tim atau dengan perubahan yang sering.
Kedua opsi dijelaskan dalam https://gitlab.com/devopshq/zabbix-review-export repository, di mana semua yang Anda butuhkan disimpan di sana - pengaturan skrip, gitlab-ci dan README.md, bagaimana memasukkan infrastruktur Anda.
Pertama, coba opsi pertama (atau jika Anda tidak memiliki infrastruktur gitlab-ci): gunakan mode manual - jalankan skrip zabbix-export.py untuk mengekspor (mencadangkan) konfigurasi, jangan git add * && git commit && git push
mesin kerja Anda. Ketika Anda lelah, buka opsi kedua - otomatisasi otomatis!
Masalah dan Kemungkinan Perbaikan
Sekarang perubahan didepersonalisasi dan untuk mengetahui siapa yang membuat perubahan, Anda perlu menggunakan sistem Audit , yang menyebabkan rasa sakit dan penderitaan. Tetapi tidak semuanya begitu menakutkan, dan Audit jarang diperlukan, biasanya pesan dalam obrolan tim cukup untuk menemukan karyawan yang tepat.
Masalah lain: ketika suatu host atau item berubah dalam suatu host, itu tidak terkandung dalam XML. Artinya, kita dapat mematikan semua pemicu pada host tertentu atau mengubah prioritasnya ke yang lebih rendah - dan tidak ada yang akan mengetahuinya dan mengoreksi kita! Kami menunggu perbaikan untuk ini di https://support.zabbix.com/browse/ZBX-15175
Sampai mereka menemukan mekanisme untuk pemulihan otomatis. Misalkan templat atau host sangat diubah, kami memahami bahwa perubahan tidak benar dan Anda harus mengembalikan semuanya seperti semula. Sekarang kami sedang mencari XML yang diperlukan untuk host yang sesuai, mengimpornya secara manual ke UI, tetapi kami hanya ingin mengklik tombol "Putar kembali templat Templat Nama ke keadaan komit komitmen-hash".
Anda dapat menerapkan sinkronisasi dua arah - ketika perubahan dibuat pada konfigurasi Zabbix ketika perubahan dilakukan pada YAML, maka Anda tidak harus pergi ke antarmuka web sistem Zabbix. Di github kami bertemu proyek serupa, tetapi entah bagaimana cepat menghilang dan komunitas tidak menerima gagasan itu; rupanya, itu tidak begitu mudah untuk diterapkan di YAML apa yang dapat Anda klik dengan mouse di antarmuka web. Oleh karena itu, kami memutuskan interaksi satu arah.
Opsi yang ideal adalah menanamkan sistem ini untuk menyimpan konfigurasi sebagai kode, meskipun hanya dalam format XML, di Zabbix. Cara ini dilakukan di server TeamCity CI : konfigurasi yang dikonfigurasi melalui UI membuat komitmen atas nama pengguna yang mengubah konfigurasi. Ternyata alat yang sangat mudah untuk melihat perubahan, dan juga menghilangkan masalah perubahan depersonalisasi.
Coba
Mulai ekspor konfigurasi Zabbix Anda, komit ke repositori (cukup lokal), tunggu seminggu dan jalankan lagi. Sekarang perubahan ada di kendali Anda! https://gitlab.com/devopshq/zabbix-review-export
Siapa yang tertarik dengan fungsi ini di kotak Zabbix - silakan pilih untuk isu https://support.zabbix.com/browse/ZBXNEXT-4862
Semua waktu aktif 100%!