Zabbix - memperluas batas makro

Saat membuat solusi untuk klien, muncul 2 tugas yang ingin saya selesaikan dengan indah dan dengan fungsionalitas Zabbix biasa.

Tugas 1. Melacak versi firmware saat ini di router Mikrotik.

Tugas diselesaikan dengan mudah - dengan menambahkan agen ke template HTTP. Agen menerima versi saat ini dari situs web Mikrotik, dan pemicu membandingkan versi saat ini dengan versi saat ini dan mengeluarkan peringatan jika terjadi ketidaksesuaian.

Ketika Anda memiliki 10 router, algoritme seperti itu tidak kritis, tetapi apa yang harus dilakukan dengan 3000 router? Kirim 3000 permintaan ke server? Tentu saja, skema seperti itu akan berhasil, tetapi ide 3000 permintaan tidak cocok untuk saya, saya ingin mencari solusi lain. Selain itu, masih ada kekurangan dalam algoritme semacam itu: pihak lain dapat menghitung begitu banyak permintaan dari satu IP untuk serangan DoS, mereka dapat dengan mudah melarangnya.

Tugas 2. Menggunakan sesi otorisasi di berbagai agen HTTP.

Saat agen perlu menerima informasi dari halaman "tertutup" melalui HTTP, cookie otorisasi diperlukan. Untuk melakukan ini, biasanya ada formulir otorisasi standar dengan pasangan "login / kata sandi" dan pengaturan ID sesi di cookie.

Namun ada masalah, tidak mungkin mengakses data item lain dari satu item agen HTTP untuk mengganti nilai ini di Header.

Ada juga "skrip Web", yang memiliki batasan lain, tidak memungkinkan Anda mendapatkan konten untuk dianalisis dan disimpan lebih lanjut. Anda hanya dapat memeriksa keberadaan variabel yang diperlukan pada halaman atau meneruskan variabel yang diperoleh sebelumnya di antara langkah-langkah skrip web.

Setelah memikirkan sedikit tentang tugas-tugas ini, saya memutuskan untuk menggunakan makro yang terlihat sempurna di bagian mana pun dari sistem pemantauan: di templat, host, pemicu, atau item. Dan Anda dapat memperbarui makro melalui API antarmuka web.

Zabbix memiliki dokumentasi API yang bagus dan terperinci. Untuk pertukaran data melalui api, digunakan format data Json. Detail dapat ditemukan di dokumentasi resmi.

Urutan tindakan untuk mendapatkan data yang kita butuhkan dan merekamnya dalam makro ditunjukkan pada diagram di bawah ini.

Zabbix - memperluas batas makro

Langkah 1

Langkah pertama dapat terdiri dari satu tindakan atau beberapa tindakan. Semua logika utama diletakkan di langkah pertama, dan 3 langkah terakhir adalah yang utama.

Dalam contoh saya, langkah pertama adalah mendapatkan cookie otorisasi di PBX untuk tugas pertama. Untuk tugas kedua, saya mendapatkan nomor firmware Mikrotik versi saat ini.

URL versi firmware Mikrotik saat ini

Alamat-alamat ini diakses oleh peralatan Mikrotik itu sendiri ketika versi firmware terbaru yang tersedia diterima.

Langkah pertama sepenuhnya individual untuk setiap kasus dan logika kerjanya mungkin berbeda. Itu semua tergantung pada tugas Anda.

Saat bekerja dengan pembuatan skrip web, catat metode respons mana yang Anda perlukan. Judul Respons HTTP atau diri sendiri Ρ‚Π΅Π»ΠΎ respon tanpa header?
Jika cookie otorisasi diperlukan, setel metode respons Judul seperti dalam kasus Asterisk.

Jika Anda membutuhkan data, seperti dalam kasus respons server mikrotik, masukkan tubuh respon tanpa header.

Langkah 2

Mari kita lanjutkan ke langkah kedua. Mendapatkan sesi otorisasi:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin"
        "password": "zabbix"
    },
    "id": 1,
    "auth": null
}

jsonrpc adalah versi protokol JSON-RPC yang sedang digunakan;
Zabbix mengimplementasikan JSON-RPC versi 2.0;

  • metode - metode yang dipanggil;
  • params - parameter yang dilewatkan oleh metode;
  • id adalah pengidentifikasi permintaan arbitrer;
  • auth - kunci autentikasi pengguna; karena kita belum memilikinya, mari kita atur ke null.

Untuk bekerja dengan API, saya membuat akun terpisah dengan hak terbatas. Pertama, Anda tidak perlu memberikan akses ke tempat yang tidak Anda perlukan. Dan kedua, sebelum versi 5.0, kata sandi yang diatur melalui makro dapat dibaca. Karenanya, jika Anda menggunakan kata sandi administrator Zabbix, akun admin mudah dicuri.

Ini terutama benar ketika bekerja dengan API melalui skrip pihak ketiga dan menyimpan kredensial di samping.

Sejak versi 5.0 ada opsi untuk menyembunyikan kata sandi yang disimpan di makro.

Zabbix - memperluas batas makro

Saat membuat akun terpisah untuk memperbarui data melalui API, pastikan untuk memeriksa apakah data yang Anda perlukan tersedia melalui antarmuka web dan apakah mungkin untuk memperbaruinya. Saya tidak memeriksa, dan untuk waktu yang lama saya tidak mengerti mengapa makro yang saya butuhkan tidak terlihat di API.

Zabbix - memperluas batas makro

Setelah kami menerima otorisasi di API, kami melanjutkan untuk mendapatkan daftar makro.

Langkah 3

API tidak mengizinkan Anda memperbarui makro host berdasarkan nama, Anda harus mendapatkan ID makro terlebih dahulu. Selain itu, untuk mendapatkan daftar makro untuk host tertentu, Anda perlu mengetahui ID host tersebut, dan ini merupakan permintaan tambahan. Gunakan makro default {ID HOST} dalam permintaan tidak diperbolehkan. Saya memutuskan untuk melewati batasan seperti ini:

Zabbix - memperluas batas makro

Saya membuat makro lokal dengan ID Host ini. Mencari tahu host ID sangat mudah dari antarmuka web.

Respons dengan daftar semua makro pada host tertentu dapat difilter dengan pola:

regex:{"hostmacroid":"([0-9]+)"[A-z0-9,":]+"{$MIKROTIK_VERSION}"

Zabbix - memperluas batas makro

Jadi, kami mendapatkan ID dari makro yang kami butuhkan, di mana MIKROTIK_VERSION adalah nama makro yang kita cari. Dalam kasus saya, makro dicari MIKROTIK_VERSIONItu yang ditugaskan ke tuan rumah.

Permintaan itu sendiri terlihat seperti ini:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.get",
    "params":{
        "output":"extend",
        "hostids":"{$HOST_ID}"
    },
    "auth":"{sid}",
    "id":1
}

Variabel {sid} diperoleh pada langkah kedua dan akan digunakan terus-menerus, di mana Anda harus bekerja dengan antarmuka API.

4 LANGKAH Terakhir - memperbarui makro

Sekarang kita tahu ID makro yang perlu diperbarui, cookie otorisasi, atau versi firmware router. Anda dapat memperbarui makro itu sendiri.

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.update",
    "params":{
        "hostmacroid":"{hostmacroid}",
        "value":"{mikrotik_version}"
    },
    "auth":"{sid}",
    "id":1
}

{mikrotik_version} adalah nilai yang diperoleh pada langkah pertama. Dalam contoh saya, versi firmware mikrotik saat ini
{hostmacroid} - nilai diperoleh pada langkah ketiga - id dari makro yang sedang kita perbarui.

Temuan

Pendekatan untuk memecahkan masalah dengan fungsionalitas standar jauh lebih rumit dan lebih lama. Apalagi jika Anda mengetahui pemrograman dan dapat dengan cepat menambahkan logika yang diperlukan dalam skrip.

Keuntungan nyata dari pendekatan ini adalah "portabilitas" solusi antara server yang berbeda.

Bagi saya pribadi, aneh bahwa agen HTTP tidak dapat mengakses data item lain dan menggantinya di badan permintaan atau header [ ZBXNEXT-5993].

Template yang sudah jadi bisa unduh di GitHub.

Sumber: www.habr.com

Tambah komentar