-- Leo's gemini proxy

-- Connecting to bwog-notes.chagratt.site:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

Interroger l'API Zabbix avec curl


Rédigé le 8 mars 2022 - modifié le 8 février 2024. Étiquettes : curl zabbix




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


A l'ancienne


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": {
        "username": "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 }

Via un jeton pré-généré


_À partir de la version 5.4_


Depuis votre compte, sur l'interface ouaibe, allez dans « User settings » puis « API tokens ».

De là vous pourrez générer un ou plusieurs jetons qui seront utilisables par la suite dans le champ auth des requêtes.


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

Pour faire bien plus propre, on peut passer par un Heredoc.

Il y aura toutefois un petit changement dans l'ordre des arguments envoyés à curl :


while read hstgrp
do
    curl -H "Content-Type: application/json-rpc" -X POST http://url_instance_zabbix/api_jsonrpc.php \
    -d @- <<- EOF
	{
	"jsonrpc": "2.0",
	"method": "hostgroup.create",
	"params": {
		"name":"${hstgrp}"
	},
	"id": 1,
	"auth": "0424bd59b807674191e7d77572075f33"
	}
EOF
    sleep 1
done < hosts_groups.txt

*Attention* J'ai remarqué qu'avec la version 6.0 de Zabbix,

le json envoyé était considéré comme invalide en faisant une indentation avec des espaces.

Dans l'exemple ci-dessus, l'indentation est faite avec des tabulations.

Je vous renvoie vers


mon article sur le Heredoc


pour plus de détails si vous le souhaitez.


Sinon, si ça ne vous dérange pas, l'exemple suivant est tout aussi valide, bien que moins lisible :


while read hstgrp
do
    curl -H "Content-Type: application/json-rpc" -X POST http://url_instance_zabbix/api_jsonrpc.php \
    -d @- << EOF
{
"jsonrpc": "2.0",
"method": "hostgroup.create",
"params": {
"name":"${hstgrp}"
},
"id": 1,
"auth": "0424bd59b807674191e7d77572075f33"
}
EOF
    sleep 1
done < hosts_groups.txt

Notez bien que l'opérateur de redirection perd son caractère - juste après l'ouverture du Heredoc dans ce cas.


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,

ou bien les utilitaires python publiés par Zabbix.


Mais, pour dépanner ou des interrogations ponctuelles de l'API, c'est toujours bon à savoir.


Liens


La documentation API de Zabbix


PyZabbix


Article du blog Zabbix sur leur bibliothèque python


Les sources de la bibliothèque Python Zabbix



-------------------------------

← Plus récent : Stargazer, un server Gemini sur Alpine

→ Plus ancien : Ma PineTime, Gadgetbridge et la musique sur android

Aléatoire : GCC et dossier temporaire

Retour à l'accueil


Contenu sous licence CC-BY-SA


-- Response ended

-- Page fetched on Sat May 18 06:52:01 2024