La API de Zabbix le permite recuperar y modificar mediante programación la configuración de Zabbix y proporciona acceso a datos históricos. Es ampliamente utilizada para:
La API de Zabbix es una API basada en HTTP y se envía como parte de la interfaz web. Utiliza el protocolo JSON-RPC 2.0, lo que significa dos cosas:
Para obtener más información sobre el protocolo y JSON, consulte la [especificación JSON-RPC 2.0] (http://www.jsonrpc.org/specification) y la [página de inicio del formato JSON] (http://json.org/).
Para obtener más información sobre cómo integrar la funcionalidad de Zabbix en sus aplicaciones Python, consulte la biblioteca Python zabbix_utils para la API de Zabbix.
La API consta de una serie de métodos que se agrupan nominalmente en APIs separadas. Cada uno de los métodos realiza una tarea específica. Por ejemplo, el método host.create
pertenece a la API host y es usado para crear nuevos equipos. Históricamente las APIs a veces se denominan "clases".
La gran mayoria de las APIs contienen al menos cuatro métodos: get
, create
, update
y delete
para recuperar, crear, actualizar y borrar datos respectivamente, pero algunas de las APIs pueden proporcionar un conjunto totalmente distinto de métodos.
Una vez que haya configurado la interfaz, puede utilizar solicitudes HTTP remotas para llamar a la API. Para hacer eso, debe enviar solicitudes HTTP POST al archivo api_jsonrpc.php
ubicado en el directorio de la interfaz. Por ejemplo, si su interfaz de Zabbix está instalada en https://example.com/zabbix
, una solicitud HTTP para llamar al método apiinfo.version
puede parecerse a esto:
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Content-Type: application/json-rpc' \
--data '{"jsonrpc":"2.0","method":"apiinfo.version","params":{},"id":1}'
La solicitud debe tener el encabezado Content-Type
establecido en uno de estos valores: aplicación/json-rpc
, aplicación/json
o aplicación/jsonrequest
.
El objeto de solicitud contiene las siguientes propiedades:
jsonrpc
: la versión del protocolo JSON-RPC utilizada por la API (la API de Zabbix implementa JSON-RPC versión 2.0);method
: el método API que se llama;params
: los parámetros que se pasarán al método API;id
: un identificador arbitrario de la solicitud.Si la solicitud es correcta, la respuesta devuelta por la API debería parecerse a esto:
El objeto de respuesta, a su vez, contiene las siguientes propiedades:
jsonrpc
- la versión del protocolo JSON-RPC;result
: los datos devueltos por el método;id
: un identificador de la solicitud correspondiente.En la siguiente sección vamos a guiarlo a través de algunos ejemplos con mayor detalle.
Para acceder a cualquier dato en Zabbix, necesita:
Por ejemplo, si desea obtener un nuevo token de autenticación iniciando sesión como usuario Admin estándar, entonces una solicitud JSON se vería así:
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Content-Type: application/json-rpc' \
--data '{"jsonrpc":"2.0","method":"user.login","params":{"username":"Admin","password":"zabbix"},"id":1}'
Si proporcionó las credenciales correctamente, la respuesta devuelta por la API debe contener el token de autenticación del usuario:
Todas las solicitudes de API requieren una autenticación o un token de API. Puede proporcionar las credenciales utilizando el encabezado de solicitud "Authorization":
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Authorization: Bearer 0424bd59b807674191e7d77572075f33'
La propiedad "auth" puede autorizar una solicitud de API.
Tenga en cuenta que la propiedad "auth" está en desuso. Se eliminará en futuras versiones.
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Content-Type: application/json-rpc' \
--data '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid"]},"auth":"0424bd59b807674191e7d77572075f33","id":1}'
Una cookie "zbx_session" se utiliza para autorizar una solicitud de API desde la interfaz de usuario de Zabbix realizada utilizando JavaScript (desde un módulo o un widget personalizado).
Ahora tiene un token de autenticación de usuario válido que puede usar para acceder a los datos en Zabbix. Por ejemplo, puede utilizar el Método host.get para recuperar los ID, nombres de equipo e interfaces de todos los equipos configurados:
Solicitud:
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
--header 'Content-Type: application/json-rpc' \
--data @data.json
data.json
es un archivo que contiene una consulta JSON. En lugar de un archivo, puede pasar la consulta en el argumento --data
.
datos.json
{"jsonrpc": "2.0","method": "host.get","params": {"output": ["hostid","host"],"selectInterfaces": ["interfaceid","ip"]},"id": 2
}
El objeto de respuesta contendrá los datos solicitados sobre los equipos:
{
"jsonrpc": "2.0",
"result": [
{
"hostid": "10084",
"host": "Zabbix server",
"interfaces": [
{
"interfaceid": "1",
"ip": "127.0.0.1"
}
]
}
],
"id": 2
}
Por motivos de rendimiento, siempre se recomienda enumerar las propiedades del objeto que desea recuperar. Así, evitará recuperarlo todo.
Ahora, cree una nueva métrica en el equipo "Zabbix server" usando los datos que ha obtenido del host.get
en la solicitud anterior. Esto se puede hacer usando el método item.create:
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
--header 'Content-Type: application/json-rpc' \
--data '{"jsonrpc":"2.0","method":"item.create","params":{"name":"Free disk space on /home/joe/","key_":"vfs.fs.size[/home/joe/,free]","hostid":"10084","type":0,"value_type":3,"interfaceid":"1","delay":30},"id":3}'
Una respuesta exitosa contendrá el ID de la métrica recién creada, que se puede utilizar para hacer referencia a la métrica en las siguientes solicitudes:
El método item.create
así como otros métodos de creación también pueden aceptar matrices de objetos y crear varios elementos con una única llamada a la API.
Entonces, si los métodos de creación aceptan matrices, podemos agregar múltiples iniciadores así:
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
--header 'Content-Type: application/json-rpc' \
--data '{"jsonrpc":"2.0","method":"trigger.create","params":[{"description":"Processor load is too high on {HOST.NAME}","expression":"last(/Linux server/system.cpu.load[percpu,avg1])>5",},{"description":"Too many processes on {HOST.NAME}","expression":"avg(/Linux server/proc.num[],5m)>300",}],"id":4}'
Una respuesta exitosa contendrá los ID de los iniciadores recién creados:
Habilite una métrica estableciendo su estado en "0":
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
--header 'Content-Type: application/json-rpc' \
--data '{"jsonrpc":"2.0","method":"item.update","params":{"itemid":"10092","status":0},"id":5}'
La respuesta exitosa contendrá el ID de la métrica actualizada:
El método item.update
así como otros métodos de actualización también pueden aceptar matrices de objetos y actualizar varias métricas con una única llamada a la API.
Habilite múltiples iniciadores estableciendo su estado en "0":
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
--header 'Content-Type: application/json-rpc' \
--data '{"jsonrpc":"2.0","method":"trigger.update","params":[{"triggerid":"13938","status":0},{"triggerid":"13939","status":0}],"id":6}'
La respuesta exitosa contendrá los ID de los iniciadores actualizados:
Este es el método preferido de actualización. Algunos métodos API, como host.massupdate
, permiten escribir un código más simple. Sin embargo, no se recomienda utilizar estos métodos ya que se eliminarán en versiones futuras.
Hasta el momento todo lo que ha probado ha funcionado bien. Pero ¿qué sucede si intenta realizar una llamada incorrecta a la API? Intentar crear otro equipo llamando a host.create pero omitiendo el parámetro obligatorio de groups
:
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
--header 'Content-Type: application/json-rpc' \
--data '{"jsonrpc":"2.0","method":"host.create","params":{"host":"Linux server","interfaces":[{"type":1,"main":1,"useip":1,"ip":"192.168.3.1","dns":"","port":"10050"}]},"id":7}'
La respuesta contendrá entonces un mensaje de error:
{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "Invalid params.",
"data": "No groups for host \"Linux server\"."
},
"id": 7
}
Si se ha producido un error, en lugar de la propiedad result
, el objeto de la respuesta contendrá la propiedad error
con los siguientes datos:
code
- un código de error;message
: un breve resumen de errores;data
: un mensaje de error más detallado.Los errores pueden ocurrir en varios casos, como por ejemplo, al usar valores de entrada incorrectos, un tiempo excedido de espera de sesión o intentar acceder a objetos no existentes. Su aplicación debería poder manejar correctamente este tipo de errores.
Para simplificar el versionado de API, desde Zabbix 2.0.4, la versión de la API coincide con la versión misma de Zabbix . Puede usar el método apiinfo.version para encontrar la versión de la API con la que está trabajando. Esto puede ser muy útil para ajustar su aplicación y usar las funciones especificas de la versión.
Zabbix garantiza la compatibilidad con versiones anteriores en una misma versión principal. Cuando hacemos cambios incompatibles entre versiones principales, solemos dejar las características anteriores como obsoletas en la nueva versión, y solo las eliminamos después del lanzamiento de la siguiente versión. Ocasionalmente podríamos eliminar funciones entre versiones principales sin proveer compatibilidad. Es importante que nunca confíe en ninguna función obsoleta y actualice cuanto antes a las nuevas alternativas.
Puede seguir todos los cambios de la API en el API changelog.
Ahora ya sabe suficiente para empezar a trabajar con las API en Zabbix, pero no se detenga aquí. Para más información le sugerimos que eche un vistazo a la lista de API disponibles.