Zabbix - genişleyen makro sınırları

Bir müşteri için bir çözüm oluştururken, güzelce ve düzenli Zabbix işlevselliği ile çözmek istediğim 2 görev ortaya çıktı.

Görev 1. Mikrotik yönlendiricilerdeki mevcut ürün yazılımı sürümünün izlenmesi.

Görev, HTTP şablonuna bir aracı ekleyerek kolayca çözülür. Temsilci, Mikrotik web sitesinden güncel sürümü alır ve tetikleyici, mevcut sürümle mevcut sürümü karşılaştırır ve bir tutarsızlık durumunda bir uyarı verir.

10 yönlendiriciniz olduğunda, böyle bir algoritma kritik değildir, ancak 3000 yönlendirici ile ne yapılır? Sunucuya 3000 istek gönderilsin mi? Elbette böyle bir plan işe yarayacak ama 3000 istek fikri bana uymadı, başka bir çözüm bulmak istedim. Ek olarak, böyle bir algoritmada hala bir dezavantaj vardı: diğer taraf, bir DoS saldırısı için bir IP'den bu kadar çok sayıda isteği sayabilir, basitçe yasaklayabilirler.

Görev 2. Farklı HTTP aracılarında bir yetkilendirme oturumu kullanma.

Bir aracının "kapalı" sayfalardan HTTP aracılığıyla bilgi alması gerektiğinde, bir yetkilendirme tanımlama bilgisine ihtiyaç duyulur. Bunu yapmak için, genellikle bir "oturum açma / şifre" çifti ve çerezde oturum kimliğini ayarlayan standart bir yetkilendirme formu vardır.

Ancak bir sorun var, Header'da bu değeri değiştirmek için bir HTTP ajanı öğesinden başka bir öğenin verilerine erişmek mümkün değil.

Ayrıca bir "Web komut dosyası" vardır, başka bir sınırlaması vardır, analiz ve daha fazla tasarruf için içerik almanıza izin vermez. Sadece gerekli değişkenlerin sayfalarda olup olmadığını kontrol edebilir veya önceden elde edilen değişkenleri web script adımları arasında iletebilirsiniz.

Bu görevler hakkında biraz düşündükten sonra, izleme sisteminin herhangi bir bölümünde mükemmel şekilde görülebilen makroları kullanmaya karar verdim: şablonlarda, ana bilgisayarlarda, tetikleyicilerde veya öğelerde. Ve makroları web arayüzü API'si aracılığıyla güncelleyebilirsiniz.

Zabbix, iyi ve ayrıntılı API belgelerine sahiptir. API üzerinden veri alışverişi için Json veri formatı kullanılır. Detaylar şu adreste bulunabilir: resmi belgeler.

İhtiyacımız olan verileri elde etmek ve bunları bir makroya kaydetmek için eylem sırası aşağıdaki şemada gösterilmiştir.

Zabbix - genişleyen makro sınırları

1 Adım

İlk adım, tek bir eylemden veya birden çok eylemden oluşabilir. Tüm ana mantık ilk adımlarda atılır ve son 3 adım ana olanlardır.

Benim örneğimde, ilk adım, ilk görev için PBX'te yetkilendirme tanımlama bilgileri almaktı. İkinci görev için Mikrotik aygıt yazılımının güncel sürümünün numarasını aldım.

Mikrotik belleniminin güncel sürümlerinin URL'si

Bu adreslere, mevcut en son aygıt yazılımı sürümü alındığında Mikrotik ekipmanının kendisi tarafından erişilir.

İlk adım, her durum için tamamen bireyseldir ve çalışma mantığı farklı olabilir. Her şey görevinize bağlı.

Web komut dosyasıyla çalışırken, hangi yanıt yöntemine ihtiyacınız olduğunu takip edin. haber başlıkları HTTP yanıtı veya öz тело başlıksız yanıt?
Yetkilendirme tanımlama bilgileri gerekiyorsa, yanıt yöntemini ayarlayın haber başlıkları Yıldız örneğinde olduğu gibi.

Veriye ihtiyacınız varsa, mikrotik sunucu yanıtında olduğu gibi, vücut başlıksız yanıt.

2 Adım

İkinci adıma geçelim. Bir yetkilendirme oturumu alma:

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, kullanılan JSON-RPC protokolünün sürümüdür;
Zabbix, JSON-RPC sürüm 2.0'ı uygular;

  • yöntem - çağrılan yöntem;
  • parametreler - yöntem tarafından iletilen parametreler;
  • id isteğe bağlı bir istek tanımlayıcısıdır;
  • auth - kullanıcı doğrulama anahtarı; henüz elimizde olmadığı için onu null olarak ayarlayalım.

API ile çalışmak için sınırlı haklara sahip ayrı bir hesap oluşturdum. İlk olarak, ihtiyacınız olmayan yerlere erişim izni vermenize gerek yoktur. İkincisi, sürüm 5.0'dan önce, makro aracılığıyla ayarlanan şifre okunabiliyordu. Buna göre, Zabbix yönetici şifresini kullanırsanız, yönetici hesabının çalınması kolaydır.

Bu, özellikle üçüncü taraf komut dosyaları aracılığıyla API ile çalışırken ve kimlik bilgilerini yan tarafta depolarken geçerli olacaktır.

5.0 sürümünden beri, makroda kaydedilen parolayı gizleme seçeneği vardır.

Zabbix - genişleyen makro sınırları

API aracılığıyla verileri güncellemek için ayrı bir hesap oluştururken, ihtiyacınız olan verilerin web arayüzü aracılığıyla mevcut olup olmadığını ve güncellemenin mümkün olup olmadığını kontrol ettiğinizden emin olun. Kontrol etmedim ve sonra uzun süre ihtiyacım olan makronun API'de neden görünmediğini anlayamadım.

Zabbix - genişleyen makro sınırları

API'de yetkilendirmeyi aldıktan sonra makro listesini almaya geçiyoruz.

3 Adım

API, bir ana bilgisayar makrosunu ada göre güncellemenize izin vermez, önce makro kimliğini almanız gerekir. Ayrıca, belirli bir ana bilgisayar için makroların bir listesini almak için, bu ana bilgisayarın kimliğini bilmeniz gerekir ve bu, ekstra bir istektir. Varsayılan makroyu kullan {HOST KIMLIĞI} istekte izin verilmez. Kısıtlamayı şu şekilde atlamaya karar verdim:

Zabbix - genişleyen makro sınırları

Bu ana bilgisayarın kimliğiyle yerel bir makro oluşturdum. Ana bilgisayar kimliğini bulmak web arayüzünden çok kolaydır.

Belirli bir ana bilgisayardaki tüm makroların listesini içeren bir yanıt, bir kalıba göre filtrelenebilir:

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

Zabbix - genişleyen makro sınırları

Böylece, ihtiyacımız olan makronun kimliğini alıyoruz, burada MIKROTIK_VERSION aradığımız makronun adıdır. Benim durumumda, makro aranır MIKROTIK_VERSIONAna bilgisayara atanan.

İsteğin kendisi şöyle görünür:

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
}

değişken {sid} ikinci adımda elde edilen ve API arayüzü ile çalışmanız gereken yerlerde sürekli olarak kullanılacaktır.

Son 4 ADIM - makronun güncellenmesi

Artık güncellenmesi gereken makro kimliğini, yetkilendirme tanımlama bilgisini veya yönlendiricinin donanım yazılımı sürümünü biliyoruz. Makronun kendisini güncelleyebilirsiniz.

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_versiyon} birinci adımda elde edilen değerdir. Örneğimde, mevcut mikrotik belleniminin sürümü
{hostmacroid} - üçüncü adımda elde edilen değer - güncellemekte olduğumuz makronun kimliği.

Bulgular

Sorunu standart işlevsellik ile çözme yaklaşımı çok daha karmaşık ve daha uzundur. Özellikle programlama biliyorsanız ve komut dosyasına gerekli mantığı hızlı bir şekilde ekleyebiliyorsanız.

Bu yaklaşımın bariz avantajı, çözümün farklı sunucular arasında "taşınabilirliği"dir.

Şahsen benim için, HTTP aracısının başka bir öğenin verilerine erişememesi ve bunları istek gövdesinde veya başlıklarında değiştirememesi gariptir [ ZBXNEXT-5993].

Bitmiş şablon şunları yapabilir: GitHub'da indir.

Kaynak: habr.com

Yorum ekle