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

Source: https://habr.com/ru/post/J104387/


All Articles