zabbix apiを使ってメンテナンス設定・解除する

サーバアプリケーションのデプロイ時等に、不要なアラートや自動復旧設定を抑制するためzabbixをメンテナンス状態にしたい場合があります。zabbixのGUIからメンテナンス設定しておけば良いのですが、Jenkins等のCI/CD環境が整っているのに、メンテナンス設定だけはGUIから手動というのは面倒なのと、設定漏れのリスクがあります。
そんなこんなで、zabbix APIについて調べたので残しておきます。

# 注意点
zabbixのVerによって、zabbix APIの仕様やサポート是非が異なっていることがあります
この記事はzabbix ver：4.0系で記載しています
Verが異なる場合は、[API仕様](https://www.zabbix.com/documentation/4.0/en/manual/api/reference/maintenance)で確認しながら実装すると良いです

# Zabbix APIを使ってみる
早速使ってみます
基本は、認証（TOKEN取得）→実行したい処理（TOKEN利用）→ログアウト（TOKEN破棄）の流れになります

## TOKENを取得する
まずは、どのAPIを使うにも認証を済ませる必要があります
userにはエイリアス（ログインID）、passwordにはログインパスワードを指定します
```Bash
curl -s -d '
{
    "jsonrpc": "2.0" ,
    "method": "user.login",
    "params": {
        "user": "XXXXXXX",
        "password": "YYYYYYYY"
    },
    "id": 1
}
' -H "Content-Type: application/json-rpc" https://xxxxxx.xxxx.xxx/zabbix/api_jsonrpc.php
```

認証が通れば、TOKENが返却されます
以降のAPIを使うためには、このTOKENが必要になります
```Bash
{"jsonrpc":"2.0","result":"hogehogehogehogehogehogehogehoge","id":1}
```

## ホストグループを取得する
ホストグループのgroupidを確認できます
filterは任意項目で、指定しなければ全てのホストグループが取得できます
```Bash
curl -s -d '
{
    "jsonrpc": "2.0" ,
    "method": "hostgroup.get",
    "params": {
        "output": "extend",
        "filter": {
            "name": [
                "fuga"
            ]
        }
    },
    "auth": "hogehogehogehogehogehogehogehoge",
    "id": 1
}
' -H "Content-Type: application/json-rpc" https://xxxxxx.xxxx.xxx/zabbix/api_jsonrpc.php
```

## メンテナンスを設定する
メンテナンスの設定例です
この例では、ホストグループを指定したメンテナンスを設定しています
ホストグループは、groupidで指定する必要があるので上のAPIで取得しておきましょう
active_since、active_tillは十分な期間にしておけば良いと思います
```Bash
curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "maintenance.create",
    "params": {
            "name": "testmaintenance",
            "active_since": 1645714800,
            "active_till": 1964271600,
            "groupids": [
                "15"
            ],
            "timeperiods": [
                {
                    "timeperiod_type": 0,
                    "period": 6000
                }
            ]
    },
    "auth": "hogehogehogehogehogehogehogehoge",
    "id": 1
}
' -H "Content-Type: application/json-rpc" https://xxxxxx.xxxx.xxx/zabbix/api_jsonrpc.php
```

メンテナンスを設定すると、maintenanceidが割り振られます
```Bash
{"jsonrpc":"2.0","result":{"maintenanceids":["12"]},"id":1}
```

## メンテナンス情報を取得する
メンテナンス設定後でも、maintenanceidを取得することができます
ホストグループの取得と同じように、filterを指定することも可能です
```Bash
curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "maintenance.get",
    "params": {
        "output": "extend"
    },
    "auth": "hogehogehogehogehogehogehogehoge",
    "id": 1
}
' -H "Content-Type: application/json-rpc" https://xxxxxx.xxxx.xxx/zabbix/api_jsonrpc.php
```

## メンテナンスを削除する
maintenanceid指定で、メンテナンスを削除（解除）することができます
```Bash
curl -s -d '
{
    "jsonrpc": "2.0",
    "method": "maintenance.delete",
    "params": [
        "12"
    ],
    "auth": "hogehogehogehogehogehogehogehoge",
    "id": 1
}
' -H "Content-Type: application/json-rpc" https://xxxxxx.xxxx.xxx/zabbix/api_jsonrpc.php
```

## TOKENを破棄する
APIを使い終えたら、TOKENを破棄してしまいしょう
```Bash
curl -s -d '
{
    "jsonrpc": "2.0" ,
    "method": "user.logout",
    "params": [ ],
    "auth": "hogehogehogehogehogehogehogehoge",
    "id": 1
}
' -H "Content-Type: application/json-rpc" https://xxxxxx.xxxx.xxx/zabbix/api_jsonrpc.php
```

# まとめ
zabbix APIは、curlで簡単に使うことができます
Ver違いによるAPI差分には注意した方が良いです
shell script等で実装すれば、デプロイ前後で自動メンテナンス設定することができそうです
他にもかなりの種類のAPI（[API仕様](https://www.zabbix.com/documentation/4.0/en/manual/api/reference/maintenance)）があるようです、アイテムやトリガーの設定等もGUIより楽かもしれないですね