- 参考
- PowerShell でweb APIを使うときはInvoke-RestMethodコマンドレット
- PowerShellでZabbix APIを投げる
- templateの一覧を取得する
- ひとこと
PowerShellからZabbixのAPIを投げるときの備忘録です。
まだまだ試行錯誤中なので随時追加していこうと思います。
参考
- 19. API
- メソッドリファレンス
- ZabbixAPI触ってみた - mikedaの日記
- Invoke-RestMethod (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn
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を参考にすれば基本的に大体いけるはず・・・。
というわけで、ここまでお読みいただきありがとうございました。