なぜそれが必要ですか
インフラストラクチャを監視するための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インターフェースをサーフィンする作業は、ツールキットが作成された過程で研究活動に置き換えられ、独自のニーズに合わせて監視チューニングを迅速に提供できるようになりました。
この例は、日常業務をなくそうとする人の柔軟性と機知を示しています。