適材適所

PowerShellを中心にプログラミングやシステム管理の備忘録的なブログ

ZabbixのAPIをPowerShellで扱う

PowerShellからZabbixのAPIを投げるときの備忘録です。

まだまだ試行錯誤中なので随時追加していこうと思います。

参考

PowerShell でweb APIを使うときはInvoke-RestMethodコマンドレット

Invoke-RestMethodコマンドレットはRest APIを使うのに便利です。

似たようなコマンドレットにInvoke-WebRequestコマンドレットがありますが、

戻り値の型に違いがあり、Invoke-RestMethodコマンドレットはJSON形式の戻り値をPSObjecによしなに変換してくれるので後続の処理がとても楽になります。

Invoke-WebRequestコマンドレットはもうちょっと低レイヤー(といってもアプリケーション層の話だけど)の制御をしたいとき、主にスクレイピングするときに使用します。

というわけでRest APIを使うのでInvoke-RestMethodコマンドレットにお世話になります。

PowerShellでZabbix APIを投げる

以下の例のurlの、http://localhost/zabbix の部分はご自身の環境に置き換えてください。

置き換えるときのヒントが、Zabbix Documentationのサイトにあります。

Webインターフェースのディレクトリにある api_jsonrpc.php ファイルに HTTP POST リクエストを送信する必要があります。

version情報の確認

下記の処理でZabbix APIのバージョンを確認できます。

 
$uri='http://localhost/zabbix/api_jsonrpc.php'
$body = @{
    jsonrpc = "2.0"
    method = "apiinfo.version"
    id = 1
    auth = $null
    params=@{}
}
$requestBody=$body|ConvertTo-Json
$response= Invoke-RestMethod -Uri $uri -ContentType 'application/json-rpc' -Method Post -Body $requestBody
$response.result

httpのボディにjson形式でクエリを入れることで処理を指定してあげます。

トークンの取得

Zabbix内のデータにアクセスするための事前準備としてログインして認証トークンを取得します。

下記の処理で$token変数に認証トークンが格納されます。

 
$uri='http://localhost/zabbix/api_jsonrpc.php'
$body = @{
    jsonrpc = "2.0"
    method = "user.login"
    id = 1
    auth = $null
    params=@{
        user="userid"
        password="password"
    }
}
$requestBody=$body|ConvertTo-Json
$response= Invoke-RestMethod -Uri $uri -ContentType 'application/json-rpc' -Method Post -Body $requestBody
$token=$response.result

ホストの取得

前述のトークンの取得で取得したトークンを使用してZabbixサーバーにAPIを投げます。

以下、$token変数には前述の処理で取得した認証トークンを使用する前提です。

 
$uri='http://localhost/zabbix/api_jsonrpc.php'
$body = @{
    jsonrpc = "2.0"
    method = "host.get"
    id = 2
    params=@{
        output="extend"
    }
    auth = $($token)
}
$requestBody=$body|ConvertTo-Json
$response= Invoke-RestMethod -Uri $uri -ContentType 'application/json-rpc' -Method Post -Body $requestBody
$response.result

これで全部のホストが取得できます。

ホストの情報を取得

ホストのアイテムを取得するには↓のとおり。

itemidsを指定しないとエラーになってしまう・・・?

 
$uri='http://localhost/zabbix/api_jsonrpc.php'
$itemId='xxxxx'
$body = @{
    jsonrpc = "2.0"
    method = "item.get"
    id = 1
    params=@{
        output="extend"
        itemids=$itemId
    }
    auth = $token
}
$requestBody=$body|ConvertTo-Json
$response= Invoke-RestMethod -Uri $uri -ContentType 'application/json-rpc' -Method Post -Body $requestBody
$response.result

item全体の数だけ知りたいときは次のように。

 
$uri='http://localhost/zabbix/api_jsonrpc.php'
$body = @{
    jsonrpc = "2.0"
    method = "item.get"
    id = 1
    params=@{
        countOutput=$true
    }
    auth = $token
}
$requestBody=$body|ConvertTo-Json
$response= Invoke-RestMethod -Uri $uri -ContentType 'application/json-rpc' -Method Post -Body $requestBody
$response.result
ホスト名で指定する
 
$uri='http://localhost/zabbix/api_jsonrpc.php'
$host="hostname"
$body = @{
    jsonrpc = "2.0"
    method = "item.get"
    id = 2
    params=@{
        output="extend"
        host=$host
    }
    auth =$token 
}
$requestBody=$body|ConvertTo-Json
$response= Invoke-RestMethod -Uri $uri -ContentType 'application/json-rpc' -Method Post -Body $requestBody
$response.result

templateの一覧を取得する

どんなtemplateがあるのかなぁ??というとき。

 
$uri='http://localhost/zabbix/api_jsonrpc.php'
$body = @{
    jsonrpc = "2.0"
    method = "template.get"
    id = 2
    params=@{
        output="extend"
    }
    auth =$token
}
$requestBody=$body|ConvertTo-Json
$response= Invoke-RestMethod -Uri $uri -ContentType 'application/json-rpc' -Method Post -Body $requestBody
$response.result

↑の命令だと適用しているホストがあろうがなかろうが持ってくるので↓で抽出してみます(多分apiの中でできるんだろうけど)。

 
$response.result|?{$_.hosts.count -ne 0}|select name ,hosts

さらにそこに属するhostidの一覧を取得したいなぁといったときは↓のようにすると template名とホストidを持ったオブジェクトを出力します。

 
$response.result|?{$_.hosts.count -ne 0}|%{foreach($h in $_.hosts){[pscustomobject]@{name=$_.name;hostid=$h.hostid}}}

なんだかだんだんPowerShellのテクニックみたいになってきた・・。

ひとこと

APIを投げること自体はWindowsであれば特別に環境を構築しなくてもPowerShellで簡単にできますね。

あとはDocumentationを参考にすれば基本的に大体いけるはず・・・。

というわけで、ここまでお読みいただきありがとうございました。