Zabbix APIを使用する

なぜそれが必要ですか



インフラストラクチャを監視するためのzabbixの実装中に、センサーとトリガーを大量に追加する必要がありました。

この目的のためにWebインターフェースを使用しても何の喜びももたらされませんでした。それは幸福に向かう途方もない量の単調な作業と低速でした。 simはzabbix apiの存在に注意を向けました。 センサーやその他の生活の快適さを大量に追加するために、それが最も多く見えました。



ツールの簡単な分析



簡単な調査により、Ruby、Python、およびphpにライブラリがあることが示されました。

PHPは、その無知のために、残りの言語からすぐに破棄され、選択はルビーに落ちました。 これは個人的な中毒とみなすことができますが、私が仕事をするときにはルビーでしっかりと書かれたパペットを使用しているため、この言語に少し精通しています。

Zabbix APIはJSONおよびJSON-RPCを使用して、サードパーティのユーティリティおよびサービスと統合します。

それが判明したように、この獣はひどいものではなく、綿密な検査で理解するのに十分簡単であることが判明しました。

頭を悩ませないために、既製のzabconライブラリが見つかりました

あなたからのものは、リンクを見ることができます。

レシピに直接進みます。



最初のタスク





多くのサーバーがあります。 すべてのサーバーにzabbix-agentがあります。 ディスク容量を監視するにはセンサーが必要ですが、これらのセンサーにはトリガーも必要です。 テンプレートを使用することはできますが、私にとってはこのオプションは十分に柔軟ではないようです。これもWebインターフェースを介して行われます。



1日中負けてから5分で飛ぶ方がいいです。





この問題を解決するために、zabconユーティリティによって提供されるライブラリを使用します。

ダウンロード、依存関係のインストール、解凍。



次に、次の内容のルビースクリプトを描画します。



#!/usr/bin/ruby

#

require './zabbixapi.rb'



zbx=ZbxAPI. new ( 'http://zabbix.server.com')

zbx.login( 'login','password')



# trigger

HIGH=4

AVERAGE=3

WARNING=2

INFORMATION=1



ENABLE=0

DISABLE=1



# return hostid

def hostid_from_hostname(hostname,zabbix)

for host in zabbix.host. get ({ "extendoutput" => true , 'pattern'=>"#{hostname}"})

return host[ 'hostid']

end

end



def add_disk_check(hostname,zabbix)

# , ssh

ssh=`ssh -o "StrictHostKeyChecking no" -q #{hostname} 'df -l -P -h | tail -n +2' `



hostid=hostid_from_hostname(hostname,zabbix)

for l in ssh

disk=l.split[5].gsub( "/" , "\/" )

name= "API Free diskspace on #{disk}"



item_p = {

'description'=>name,

'key_'=>"vfs.fs.size[#{disk},pfree]",

'hostid'=>hostid,

'type'=>'0',

'data_type'=>0,

'value_type'=>0,

'units'=>"%"

}



begin

uid = zabbix.item.create(item_p)

p "cant create item on #{hostname} disk #{disk}" if uid.nil?

end



expression= "{#{hostname}:vfs.fs.size[#{disk},pfree].last(0)}<10"

description= "API Free diskspace on {HOSTNAME} volume #{disk}"



item_t={

'hostid' => hostid,

'expression'=>expression,

'description'=>description,

'priority'=>HIGH,

'status'=>ENABLE,

}



begin

uid = zabbix.trigger.create(item_t)

p "cant create trigger on #{hostname} disk #{disk}" if uid.nil?

end



end

end



# zabbix

for host in zbx.host. get ({ "extendoutput" => true })

id=host[ 'hostid']

hostname=host[ 'host']

puts "#{id} -- #{hostname}"

add_disk_check(hostname,zbx)

end



# the end



* This source code was highlighted with Source Code Highlighter .










アクティビティの過程で、zabbixapi.rbを修正する必要がありました。元のバージョンでは、必要なセンサーまたはトリガーが既に存在する場合、スクリプトは失敗しました。

do_request関数で、次のコードを探します。

if !resp[ "error" ].nil?

raise ZbxAPI_GeneralError, resp[ "error" ] #

end



return resp

rescue Redirect #

redirects+=1

retry if redirects<=5

raise ZbxAPI_GeneralError, "Too many redirects"

end




* This source code was highlighted with Source Code Highlighter .






指定された行についてコメントします。



まとめ



zabbixサーバーのWebインターフェースをサーフィンする作業は、ツールキットが作成された過程で研究活動に置き換えられ、独自のニーズに合わせて監視チューニングを迅速に提供できるようになりました。

この例は、日常業務をなくそうとする人の柔軟性と機知を示しています。



All Articles