2023年5月29日月曜日

Zabbix APIで楽してホストを登録する

 Zabbix APIがあるので、ファイル一覧を作成してホストの登録をすることとする。

作成するスクリプトは参考にしたwebページに掲載されているファイル名のまま。けっこう色々なサイトで公開されていますね。

デフォルトの管理者名が「Admin」になっていますが、うちの場合小文字の「admin」を他機器で使用しています。「Admin」は残したまま「admin」を Super Admin role で追加してあります。

以降、管理者は「admin」を使うこととします。

スクリプトは /root/shell/zabbix へまとめて置いてあります。

で、ホストを登録するには

  • 監視対象ホスト作成時に所属先ホストグループを1つ以上選択しなければならない

という決まりがあります。ホスト作成時に所属先ホストグループがないとエラーになってしまいホストを登録できません。

どんな風にホストグループを登録するかですが、会社の組織に沿って作ってみました。青山本社と相模原支社がありますので、それぞれの機器に対するグループを作ってみました。

作った後に気が付いたのですが、Zabbix の監視を停止したいことがあります。

具体例でいうと法定停電時の監視停止です。停電の日は違うので、青山全域・相模原全域を個別に監視停止できるようにできると便利だなと後から思いました。

まぁ使い勝手は後々考えるとして、取り敢えずはホストの自動登録ができるところまで進めることにします。

認証トークンの取得

認証トークン」とはざっくり説明すると 「Zabbix APIで、ユーザーのIDとパスワードでログイン認証する代わりに必要な32文字の文字列」です。

Zabbix操作時に IDとパスワードを入力する代わりに、JSONクエリの "auth"パラメーターにユーザーの認証トークンを指定します。

zabbix_token_get.sh

#!/bin/bash
#########################################
## Zabbix token get                    ##
#########################################
ZabbixWeb=http://192.168.1.248/zabbix/
#上記IPは自分の環境に合わせて変更
#ログインIDとPWも適宜変更のこと
curl -s -d '{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "admin",
        "password": "adminのパスワード"
    },
    "id": 1,
    "auth": null
}' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php | gawk -F'"' '{print $8}'

ホストグループを追加する

2byte文字もokでしたので、分かりやすく漢字で次の 4グループを登録してみます。

数が少ないので手動でもokなんですが、先々もっと登録することになるので練習を兼ねて Zabbix API で登録をします。

hostgroup_create_list へ下記内容でグループを作成しました。

(青山_本社)(フロアスイッチ)(センドバック保守)
(青山_本社)(無線AP)(センドバック保守)
(相模原_支社)(フロアスイッチ)(センドバック保守)
(相模原_支社)(無線AP)(センドバック保守)

下記スクリプトでホストグループを登録します。

hostgroup_create.sh 

#!/bin/bash
#####################################################################################
### ファイルから読み取ったホストグループを作成する                                    ###
#####################################################################################
### 使い方
###  ./hostgroup_create.sh "読み込むファイル"
###
### 使用例
###  ./hostgroup_create.sh "/work/ZabbixAPITest/hostgroup.txt"
###
#####################################################################################
### 変数定義                                                                      ###
#####################################################################################
####ZabbixWeb画面のURL。環境に合わせて要修正
ZabbixWeb=http://192.168.1.248/zabbix/
###ZabbixAPIの認証
auth=`bash zabbix_token_get.sh`
###csv読み取りのための設定。修正不要
PRE_IFS=$IFS
IFS=$'\n'
#####################################################################################
###csvから一行ずつ読み取る
for line in `cat "$1" | grep -v ^#`
do
  HostGroupName=`echo ${line} | cut -d ';' -f 1`
### ホストグループを追加する
curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "hostgroup.create",
    "params": {
        "name": "'$HostGroupName'"
    },
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php

 echo ""
done
IFS=$PRE_IFS

失敗した場合は error が返ってきます。
ただし、already exists. は既に登録済みということなので問題なし。

ホストグループID変換スクリプト

ホストの作成は設定必須のパラメーターが複数あるため、それを踏まえてリストファイルを作ります。

  1. ホストグループ名
    監視対象ホストを所属させるホストグループ名を記載する。
  2. ホスト名
    監視対象ホストの名前を記載する。
  3. インターフェースタイプ
    1:Zabbixエージェント、2:SNMP、3:IPMI、4:JMX
  4. インターフェースをデフォルトで使用するか否か?
    0:使用しない、1:使用する。
  5. 接続にDNSとIPアドレスのどちらを使用するか?
    0:DNSに接続して監視を行う、1:IPアドレスで監視を行う。
  6. IPアドレス
    「接続にDNSとIPアドレスのどちらを使用するか?」で「1」を選択した場合、ここにホストのIPアドレスを記述する。
  7. ホストのDNS名
    接続にDNSとIPアドレスのどちらを使用するか?」で「0」を選択した場合、ここにホストのDNS名を記述する。今回は使用しないのでなにも設定しない。
  8. インターフェースが使用するポート
    Zabbixエージェントで監視する場合は「10051」を指定する。SNMPの監視は「161」。

※パラメータの区切り文字は「;」にします。

で作ったのがこんな感じ。

host_create_list

(青山_本社)(フロアスイッチ)(センドバック保守);AFL01-CISCO-001;2;1;1;10.12.250.12;;161
(青山_本社)(無線AP)(センドバック保守);AAP-001;2;1;1;10.20.101.1;;161
(青山_本社)(無線AP)(センドバック保守);AAP-002;2;1;1;10.20.101.2;;161
~中略~
(相模原_支社)(フロアスイッチ)(センドバック保守);SFL01-CISCO-001;2;1;1;10.22.250.12;;161
(相模原_支社)(無線AP)(センドバック保守);SAP-001;2;1;1;10.40.101.1;;161
(相模原_支社)(無線AP)(センドバック保守);SAP-002;2;1;1;10.40.101.2;;161

ホストを追加する際には、ホストグループ名での指定はできません。ホストグループIDを指定する必要があります。

ということで、ホストグループ名をホストグループIDに変換するスクリプトを作ります。

hostgroup_name_to_ID.sh

#!/bin/bash
#####################################################################################
### ホストグループ名をホストグループIDに変換する                                      ###
#####################################################################################
### 使い方
###  ./hostgroup_name_to_ID.sh "ホストグループ名"
###
### 使用例
###  ./hostgroup_name_to_ID.sh "Zabbix servers"
###
#####################################################################################
### 変数定義                                                                       ###
#####################################################################################
####ZabbixWeb画面のURL。環境に合わせて要修正
ZabbixWeb=http://192.168.1.248/zabbix/
###ZabbixAPIの認証
auth=`bash zabbix_token_get.sh`
###csv読み取りのための設定。修正不要
PRE_IFS=$IFS
IFS=$'\n'
#####################################################################################
### ホストグループ名をホストグループIDに変換する
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}'

最後にホスト追加のシェルスクリプトhost_create.shを作ります。

リストファイルから一行ずつ読み込み、;で区切って、それぞれのパラメーターに値を渡します。

参考にしたサイトは Zabbix 4 or 5 だったので、6 だとうまく登録ができませんでした。

APIのリファレンスを見ると 6では snmpのコミュニティ名をパラメータとして追加しないとエラーが出ます。最初原因が分からず途方に暮れていました...

host_create.sh

#!/bin/bash
#####################################################################################
### ファイルから読み取ったホストをホストグループに追加する                             ###
#####################################################################################
### 使い方
###  ./host_create.sh "読み込むファイル"
###
### 使用例
###  ./host_create.sh "/work/ZabbixAPITest/host_create_list"
###
#####################################################################################
### 変数定義                                                                      ###
#####################################################################################
####ZabbixWeb画面のURL。環境に合わせて要修正
ZabbixWeb=http://192.168.1.248/zabbix/
###ZabbixAPIの認証
auth=`bash zabbix_token_get.sh`
###csv読み取りのための設定。修正不要
PRE_IFS=$IFS
IFS=$'\n'
#####################################################################################
###csvから一行ずつ読み取る
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`
#  TemplateNumber=`echo ${line} | cut -d ';' -f 9`
### ホストグループ名をホストIDに変換する
HostGroupID=`bash hostgroup_name_to_ID.sh "$HostGroupName"`
### ホストを追加する
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'",
                "details": {
                    "version": 2,
                    "community": "public"
                }
            }
        ],
        "groups": [
            {
                "groupid": "'$HostGroupID'"
            }
        ]
    },
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php

 echo ""
done
IFS=$PRE_IFS

0 件のコメント:

コメントを投稿