2013年9月6日金曜日

zabbixで大量のアイテムとグラフを追加する場合


◆ 目的
zabbixで大量のアイテムとグラフを登録する場合、
webから一つ一つクリックして作っていては時間がかかる。

数個だけ追加してテンプレートをxmlファイルとしてエクスポートし、
それを参考にコマンドでxmlを作りインポートした方が早いだろう。



◆ 前提
テンプレート名: service
アプリケーション名: web
追加するアイテム: keyword1, keyword2, keyword3



◆ ツール
エクスポートしたテンプレートを元に
キーワードを読み込ませてアイテム部分とグラフ部分を
ループさせるだけである。
zabbixのバージョンは2.0系を利用。

キーワードを並べたファイルを用意しておく。
keyword1
keyword2
keyword3


上のファイルを読み込んでxmlを作成する。 template変数と、application変数だけを各環境に合わせて変えればよい。
#!/usr/bin/ruby

$template = "service"
$application = "web"

$vars = []

def vars()
  open('vars.txt', 'r') do |fp|
    fp.each do |line|
      $vars << line
    end
  end

end


def header()
  puts <<-"EOS"
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
    <version>2.0</version>
    <date>2013-08-27T16:56:56Z</date>
    <groups>
        <group>
            <name>#{$template}</name>
        </group>
    </groups>
    <templates>
        <template>
            <template>#{$template}</template>
            <name>#{$template}</name>
            <groups>
                <group>
                    <name>#{$template}</name>
                </group>
            </groups>
            <applications>
                <application>
                    <name>#{$application}</name>
                </application>
            </applications>
  EOS
end


def footer()
  puts <<-EOS
</zabbix_export>
  EOS
end


def items()
  puts "            <items>"

  $vars.each do |var|
    var.chomp!
    puts <<-EOF
                <item>
                    <name>#{var}</name>
                    <type>2</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>#{var}</key>
                    <delay>0</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>0</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>#{$application}</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
    EOF
  end
  puts "            </items>"
  puts "            <discovery_rules/>"
  puts "            <macros/>"
  puts "            <templates/>"
  puts "            <screens/>"
  puts "        </template>"
  puts "    </templates>"
end


def graphs()
  puts "    <graphs>"

  $vars.each do |var|
    var.chomp!
    puts <<-EOF
        <graph>
            <name>#{var}</name>
            <width>900</width>
            <height>200</height>
            <yaxismin>0.0000</yaxismin>
            <yaxismax>100.0000</yaxismax>
            <show_work_period>1</show_work_period>
            <show_triggers>1</show_triggers>
            <type>0</type>
            <show_legend>1</show_legend>
            <show_3d>0</show_3d>
            <percent_left>0.0000</percent_left>
            <percent_right>0.0000</percent_right>
            <ymin_type_1>0</ymin_type_1>
            <ymax_type_1>0</ymax_type_1>
            <ymin_item_1>0</ymin_item_1>
            <ymax_item_1>0</ymax_item_1>
            <graph_items>
                <graph_item>
                    <sortorder>0</sortorder>
                    <drawtype>0</drawtype>
                    <color>C80000</color>
                    <yaxisside>0</yaxisside>
                    <calc_fnc>2</calc_fnc>
                    <type>0</type>
                    <item>
                        <host>#{$template}</host>
                        <key>#{var}</key>
                    </item>
                </graph_item>
            </graph_items>
        </graph>
    EOF
  end
  puts "    </graphs>"

end


vars()

header()
items()
graphs()
footer()