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