2&>1

AWSとかGCPとかGolangとかとか

Zabbix APIでのURL監視設定スクリプト

ZabbixでのURL監視をZabbix_APIでちゃっちゃと登録するスクリプトつくりました。

対応フォーマットが弊社唯我独尊でピンポイントです。

環境

Zabbix 4.0.12

流れは以下

1.zabbixの認証トークンを取得

2.ホストを作成

3.URL監視を設定

社内ツールなので決め打ちの設定項目もありますが、基本はエクセルに記載された内容をそのままコピって、貼り付けてそこから変数取得して設定します。

認証トークン取得

zabbix_token_get.sh

#!/bin/sh

curl -s -d '{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "app_user",
        "password": "ほげほげ"
    },
    "id": 1,
    "auth": null
}' -H "Content-Type: application/json-rpc" http://192.168.26.29/zabbix/api_jsonrpc.php | gawk -F'"' '{print $8}'

api操作用にapp_userを用意してます。実行する内容だけに権限を絞ったユーザーです。 実行することで以下のような結果を得られます

9258169f1184ba3ab13d4a3d65cwed8c

zabbix側でAPI操作するにはこのトークンが必要となります。

設定元となるファイル

Zabbix設定元になるファイルはエクセル管理している内容です。 エクセルから行ごとコピって同階層にテキストファイルを作成

以下のような情報になります

hoge hoge hoge hoee ・・・
hai hai haii    haii ・・・

空白によって区切られてzabbix設定値が記述されてます

ホストを作成

変数などはソース見てもらえると一発かと。

APIの説明はドキュメントが良いです。

Host [Zabbix Documentation 4.0]

create_host.sh

#!/bin/bash

#############################################
### 変数定義
#############################################

####ZabbixWeb画面のURL
ZabbixWeb=http://192.168.26.29/zabbix/

###ZabbixAPIの認証
auth=`bash zabbix_token_get.sh`

####ログ
FIFO=/tmp/$$.fifo
LOG=./zabbix_api.log
mkfifo ${FIFO}
trap '/bin/rm -f ${FIFO}' EXIT
tee -a ${LOG} < ${FIFO} &
exec > ${FIFO} 2>&1


###################################################
### ホストを追加する
##################################################
IFS=$'\n'
for line in `cat $1`

do

echo ${line} > ./tmp

###変数
HostName=`cat tmp| gawk '{print $5}'| tr -d '\n'`
IFType=1
IFdefaultORnot=1
UseIP=0
DNSname=`cat tmp| gawk '{print $5}'| tr -d '\n'`
Port=10050

### ホストグループID
HostGroupID=19

echo "** `date '+%Y-%m-%d %H:%M:%S'` - CreateHOST START"

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'"
            }
        ]
    },
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php


  echo ""
  echo "** `date '+%Y-%m-%d %H:%M:%S'` - CreateHOST END"
done
exit 0

ホストIDを取得するやつ

監視設定を行うにはホスト名ではなくIDを指定する必要があるためホスト名からホストIDを取得するスクリプトが以下となります。

get_hostid.sh

#!/bin/sh

###ZabbixAPIの認証
auth=`bash zabbix_token_get.sh`

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

APP作成とWebシナリオとトリガー設定

トリガーを設定するときにホストIDをとかいらないのがよくわかんなくてどうやって紐付けたらと悩んでたけど条件式でうまいことやってるみたい

set_webcheck.sh

#!/bin/bash


####ZabbixWeb画面のURL
ZabbixWeb=http://192.168.26.29/zabbix/

###ZabbixAPIの認証
auth=`bash zabbix_token_get.sh`

###
PRE_IFS=$IFS
IFS=$'\n'

####ログ
FIFO=/tmp/$$.fifo
LOG=./zabbix_api.log
mkfifo ${FIFO}
trap '/bin/rm -f ${FIFO}' EXIT
tee -a ${LOG} < ${FIFO} &
exec > ${FIFO} 2>&1

############################################
IFS=$'\n'
for line in `cat $1`

do

echo ${line} > ./tmp

#######################################
###   変数
#######################################
  HostName=`cat tmp| gawk '{print $5}'| tr -d '\n'`
  NAME=`cat tmp| gawk '{print $6}'| tr -d '\n'`
  HostID=`bash get_hostid.sh "$HostName"`
  DelayTime=`cat tmp |  gawk '{print $8}'| tr -d '\n'`
  RETRY=`cat tmp |  gawk '{print $9}'| tr -d '\n'`
  STEPNAME=`cat tmp |  gawk '{print $12}'| tr -d '\n'`
  URL=`cat tmp |  gawk '{print $13}'| tr -d '\n'`
  TIMEOUT=`cat tmp |  gawk '{print $15}'| tr -d '\n'`
  CODE=`cat tmp |  gawk '{print $16}'| tr -d '\n'`
  TriggerName=`cat tmp| gawk '{print $17}'| tr -d '\n'`
  Expression=`cat tmp| gawk '{print $18" "$19" "$20}'| tr -d '\n'`

###アプリケーションの作成

echo "** `date '+%Y-%m-%d %H:%M:%S'` - CreateAPP START"

curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "application.create",
    "params": {
        "name": "TCP/IP",
        "hostid": "'$HostID'"
    },
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php

  APPID=`bash get_appid.sh`

echo "** `date '+%Y-%m-%d %H:%M:%S'` - CreateAPP END"

###webシナリオを追加する

echo "** `date '+%Y-%m-%d %H:%M:%S'` - CreateWEBscenario START"

curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "httptest.create",
    "params": {
        "name": "'${NAME}'",
        "hostid": "'$HostID'",
        "retries": "'$RETRY'",
        "applicationid": '$APPID',
        "delay": "'$DelayTime'",
        "steps": [
            {
                "name": "'$STEPNAME'",
                "url": "'$URL'",
                "timeout": '$TIMEOUT',
                "status_codes": "'$CODE'",
                "no": 1
            }
        ]
    },
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php


echo ""
echo "** `date '+%Y-%m-%d %H:%M:%S'` - CreateWEBscenario END"

###トリガーを追加する

echo "** `date '+%Y-%m-%d %H:%M:%S'` - CreateTrigger START"
curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "trigger.create",
    "params":
        {
            "description": "'${TriggerName}'",
            "expression": "'${Expression}'",
            "priority": "4",
            "url": "'$URL'"
        },
    "auth": "'${auth}'",
    "id": 1
}
' -H "Content-Type: application/json-rpc" ${ZabbixWeb}api_jsonrpc.php

echo ""
echo "** `date '+%Y-%m-%d %H:%M:%S'` - CreateTrigger END"
done
IFS=$PRE_IFS
exit 0

アプリケーションIDを取得するやつ

監視設定するときにアプリケーションIDもいるのでそれを取得するやつ

get_appid.sh

#!/bin/sh

###ZabbixAPIの認証
  auth=`bash zabbix_token_get.sh`
  HostName=`cat tmp| gawk '{print $5}'| tr -d '\n'`
  HostID=`bash get_hostid.sh "$HostName"`


curl -s -d '{
    "jsonrpc": "2.0",
    "method": "application.get",
    "params": {
        "output": "extend",
        "hostids": "'$HostID'",
        "sortfield": "name"
    },
    "auth": "'${auth}'",
    "id": 1
}' -H "Content-Type: application/json-rpc" http://192.168.26.29/zabbix/api_jsonrpc.php | gawk -F'"' '{print $10}'

使い方

./create_host.sh ./kanshi_list.txt

ホスト作ったあとに

./set_wencheck.sh ./kanshi_list.txt

まとめ

いままでGUIからやってたけどこれで管理エクセル作成したあとコピってポンポンで終わるようになった。

効率化の波が押し寄せた