Interroger l'API Zabbix avec curl
L’API Zabbix peut-être un bon moyen d’interagir avec son instance. Pour cela, il y a moult outils permettant de s’en servir. Mais, si vous n’avez qu’un Lignux sous la main et que vous voulez faire une requête basique, pas de panique, il vous reste un atout.
Ce joker, c’est la commande curl
.
C’est bien connu, curl
fait tout, et même plus (sauf le café, encore que …).
Tout ce dont on a besoin ici sera : un shell avec curl, un lien réseau avec l’instance Zabbix,
des identifiants fonctionnels sur cette instance.
À quoi ça va ressembler
Ce qui est important ici, plus que le contenu des requêtes qu’on passera avec l’option -d
(et qui sont dispos sur la documentation),
c’est de passer le bon en-tête, et de spécifier la méthode POST
.
Les options -H
et -X
vont nous y aider.
Voici à quoi ressembleront nos appels API :
curl -i -H "Content-Type: application/json-rpc" -X POST \
-d 'Le json de requête' \
http://url_instance_zabbix/api_jsonrpc.php
Remarque : -i
sert à afficher en sortie de commande les en-têtes de réponse HTTP.
Pratique quand on teste la connexion ou de petites requêtes, mais fortement inutile si on veut ensuite traiter le json qu’on recevra.
S’authentifier
Tout d’abord, envoyer utilisateur et mot de passe pour récupérer un jeton :
curl -i -H "Content-Type: application/json-rpc" -X POST \
-d '{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "login",
"password": "mot de passe"
},
"id": 1,
"auth": null
}' \
http://url_instance_zabbix/api_jsonrpc.php
ATTENTION : Les identifiants pourraient bien se retrouver dans l’historique du shell !
L’API va répondre avec un jeton dans le champ result
, qu’on pourra dès lors réutiliser :
{ "jsonrpc": "2.0", "result": "0424bd59b807674191e7d77572075f33", "id": 1 }
Utiliser l’API
Maintenant que l’on a un jeton en poche, y’a plus qu’à,
en le mettant dans le champ auth
qu’on avait laissé à null avant.
Ici un exemple qui permet de lister les hôtes et leurs templates :
curl -H "Content-Type: application/json-rpc" -X POST \
-d '{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["host","name","hostid"],
"selectParentTemplates": [
"templateid",
"name"
]
},
"id": 1,
"auth": "0424bd59b807674191e7d77572075f33"
' \
http://url_instance_zabbix/api_jsonrpc.php
Petit bonus
Si jamais on veut scripter des appels avec variables, toujours en mode outillage minimal, il faudra faire attention à l’extrapolation des chaines et des variables. Attention, ça va être sale !
while read hstgrp
do
curl -H "Content-Type: application/json-rpc" -X POST \
-d "{
\"jsonrpc\": \"2.0\",
\"method\": \"hostgroup.create\",
\"params\": {
\"name\":\"${hstgrp}\"
},
\"id\": 1,
\"auth\": \"0424bd59b807674191e7d77572075f33\"
" \
http://url_instance_zabbix/api_jsonrpc.php
sleep 1
done < hosts_groups.txt
Le mot de la fin
Évidemment, avec un véritable outil ou langage plus adapté, la vie sera plus facile et les scripts beaucoup plus propres et robustes. Par exemple en python il y a la bibliothèque PyZabbix.
Mais, pour dépanner ou des interrogations ponctuelles de l’API, c’est toujours bon à savoir.