Zabbix-API ホストをまとめて登録する方法

Zabbix

はじめに

ZabbixのAPIを使用し、ホストをある程度の数があっても一括で登録できる方法を書きました。なお、認証については、以下が組み込まれていることが前提です。

APIに関して何も知らなかったので、以下のサイトを参考にカスタマイズしました。

Zabbix APIでラクにミスなく大量のホストを登録しよう! | そるでぶろぐ
Zabbix APIを使いこなせば、手作業によるミスを減らしてラクに大量の監視設定を行うことができます。でも初心者には分かりにくいし、とっつきにくい…。そこで本記事では、Zabbi...

使い方

ホストを一括登録するために必要な物は、以下の4つです。

  • 1. 登録したホストの情報を記載したファイル
  • 2. テンプレートIDを取得するスクリプト
  • 3. ホストグループIDを取得するスクリプト
  • 4. ホストを一括登録するスクリプト

4のスクリプトのために、1〜3が必要というイメージです。1つ1つ見ていきます。

登録したホストの情報を記載したファイル

以下は、登録したいホストの情報をまとめたテキストファイルです。イメージとしては、「;」で区切られたcsvファイルのようなイメージです。ファイル内のフィールドがそれぞれ何が対応しているのかは、コメントアウトして書いてあるので、それを参考に設定してみてください。

[root@localhost zabbix_api]# cat host_create_snmp_list

Test_Linux_Servers;Test_Lin_00;2;1;1;192.168.60.101;;161;Template Net Cisco IOS SNMPv2;omoti
Test_Linux_Servers;Test_Lin_01;2;1;1;192.168.60.102;;161;Template Net Cisco IOS SNMPv2;omoti
Test_Linux_Servers;Test_Lin_02;2;1;1;192.168.60.103;;161;Template Net Cisco IOS SNMPv2;omoti
Test_Linux_Servers;Test_Lin_03;2;1;1;192.168.60.104;;161;Template Net Juniper SNMPv2;omoti
Test_Linux_Servers;Test_Lin_04;2;1;1;192.168.60.105;;161;Template Net Cisco IOS SNMPv2;omoti
Test_Linux_Servers;Test_Lin_05;2;1;1;192.168.60.106;;161;Template Net Cisco IOS SNMPv2;omoti
###############################各列の名称###############################
#【1.HostGroupName】
# ホストグループ名
# 監視対象ホストを所属させるホストグループ名を記載する。
########################################################################
#【2.HostName】
# ホスト名
# 監視対象ホストの名前を記載する。
########################################################################
#【3. IFType】
#インターフェースタイプ
#1:Zabbixエージェント、2:SNMP、3:IPMI、4:JMX
########################################################################
#【4.IFdefaultORnot】
#インターフェースをデフォルトで使用するか否か?
#0:使用しない、1:使用する。
########################################################################
#【5.UseIP】
#接続にDNSとIPアドレスのどちらを使用するか?
#0:DNSに接続して監視を行う、1:IPアドレスで監視を行う。
########################################################################
#【6.IPaddress】
# IPアドレス
# UseIPで「1」を選択した場合、ホストIPアドレスを記述する。
########################################################################
#【7.DNSname】
# ホストのDNS名
# UseIPで「0」を選択した場合、ホストのDNS名を記述する。
# 上記の例では使用しないのでなにも設定しない。
########################################################################
#【8.Port】
# インターフェースが使用するポート
# Zabbixエージェントで監視する場合は「10051」を指定する。SNMPの監視は「161」。
########################################################################
#【9.TemplateName】
# テンプレート名
# テンプレートの名前を入力します。
########################################################################
#【10.SnmpCommunityName】
#Snmpのコミュニティ名を指定します。
########################################################################

テンプレートIDを取得するスクリプト

テンプレートIDを取得するスクリプトは以下です。引数にテンプレート名を指定すると、テンプレートIDが戻ってきます。

[root@localhost ~]# bash tempID_get.sh "Template Net Cisco IOS SNMPv2"
10218

[root@localhost ~]# cat tempID_get.sh

ZabbixWeb=http://192.168.68.250/zabbix/

PRE_IFS=$IFS
IFS=$'\n'

auth=bash zabbix_token_get.sh

tempNAME=$1

curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "template.get",
    "params": {
        "output": "extend",
        "filter": {
            "host":"'${tempNAME}'"
                  }
              },
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php | gawk -F'"' '{print $130}'

IFS=$PRE_IFS

ホストグループIDを取得するスクリプト

ホストグループIDを取得するスクリプトは以下です。

[root@localhost zabbix_api]# cat hostgroup_name_to_ID.sh

#!/bin/bash

ZabbixWeb=http://192.168.68.250/zabbix/
#上記IPは自分の環境に合わせて使用します。
auth=bash zabbix_token_get.sh

PRE_IFS=$IFS
IFS=$'\n'

curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "hostgroup.get",
    "params": {
        "output": "extend",
        "filter": {
            "name": [
                "'$1'"
                  ]
        }
    },
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php | gawk -F'"' '{print $10}'

ホストを一括登録するスクリプト

スクリプト本体です。2、3のスクリプトが以下のスクリプト内で使用されています。

以下はスクリプトのコードのみを掲載していますが、実際使用する場合は「hostgroup_name_to_ID.sh host_create_snmp_list」として登録したいホスト情報が書かれたファイルを引数として指定し、実行します。

[root@localhost zabbix_api]# cat host_create_snmp.sh

#!/bin/bash

ZabbixWeb=http://192.168.68.250/zabbix/

auth=bash zabbix_token_get.sh

PRE_IFS=$IFS
IFS=$'\n'

for line in cat "$1" | grep -v ^#

do

  HostGroupName=echo ${line} | cut -d ';' -f 1
  HostName=echo ${line} | cut -d ';' -f 2
  IFType=echo ${line} | cut -d ';' -f 3
  IFdefaultORnot=echo ${line} | cut -d ';' -f 4
  UseIP=echo ${line} | cut -d ';' -f 5
  IPaddress=echo ${line} | cut -d ';' -f 6
  DNSname=echo ${line} | cut -d ';' -f 7
  Port=echo ${line} | cut -d ';' -f 8
  TemplateName=echo ${line} | cut -d ';' -f 9
  SnmpCommunityName=echo ${line} | cut -d ';' -f 10

HostGroupID=bash hostgroup_name_to_ID.sh "$HostGroupName"

TemplateNumber=bash tempID_get.sh "$TemplateName"

curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "host.create",
    "params": {
        "host": "'$HostName'",
        "interfaces": [
            {
                "type": '$IFType',
                "main": '$IFdefaultORnot',
                "useip": '$UseIP',
                "ip": "'$IPaddress'",
                "dns": "'$DNSname'",
                "port": "'$Port'"
            }
        ],
        "groups": [
            {
                "groupid": "'$HostGroupID'"
            }
        ],
        "templates": [
            {
                "templateid": "'$TemplateNumber'"
            }
        ],
        "macros": [
            {
                "macro": "{$SNMP_COMMUNITY}",
                "value": "'$SnmpCommunityName'"
            }
        ]
    },
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php


 echo ""

done

IFS=$PRE_IFS

おまけ(ホストの一括削除)

GUIでもできますが、色々と検証している過程で作りました。

[root@localhost zabbix_api]# cat test_host_delete_list
Test_Lin_00
Test_Lin_01

[root@localhost zabbix_api]# cat test_host_delete.sh

#!/bin/bash

ZabbixWeb=http://192.168.68.250/zabbix/

auth=bash zabbix_token_get.sh

PRE_IFS=$IFS
IFS=$'\n'

for line in cat "$1" | grep -v ^#

do

HostName=echo ${line}

HostID=bash test_host_get_ID.sh "$HostName"

curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "host.delete",
    "params": [
       "'$HostID'"
    ],
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php

 echo ""

done

IFS=$PRE_IFS