문서
원본 보기20 API
개요
Zabbix API를 사용하면 Zabbix 구성을 프로그래밍 방식으로 검색 및 수정할 수 있으며 과거 데이터에 대한 액세스를 제공합니다. 다음과 같은 용도로 널리 사용됩니다:
- Zabbix와 함께 작동하는 새로운 애플리케이션 생성;
- Zabbix를 타사 소프트웨어에 통합;
- 일상적인 작업 자동화.
Zabbix API는 HTTP 기반 API이며 웹 프론트엔드의 일부로 제공됩니다. JSON-RPC 2.0 프로토콜을 사용하는데, 이는 다음 두 가지를 의미합니다:
- API는 별도의 메서드 집합으로 구성됩니다;
- 클라이언트와 API 간의 요청 및 응답은 JSON 형식을 사용하여 인코딩됩니다.
프로토콜 및 JSON에 대한 자세한 내용은 JSON-RPC 2.0 사양 및 JSON 형식 홈페이지를 참조하세요.
Zabbix 기능을 Python 애플리케이션에 통합하는 방법에 대한 자세한 내용은 Zabbix용 Python 라이브러리를 참조하세요.
구조
API는 명목상 별도의 API로 그룹화된 여러 메소드로 구성됩니다. 각 메소드는 하나의 특정 작업을 수행합니다. 예를 들어, host.create 메소드는 host API에 속하며 새 호스트를 생성하는 데 사용됩니다. 역사적으로 API는 때때로 "클래스"라고도 불립니다.
대부분의 API는 최소한 네 가지 메소드를 포함합니다: 데이터 검색, 생성, 업데이트, 삭제를 위한 get, create, update, delete이지만, 일부 API는 완전히 다른 메소드 세트를 제공할 수 있습니다.
요청 수행하기
프론트엔드를 설정한 후에는 원격 HTTP 요청을 사용하여
API를 호출할 수 있습니다. 이를 위해서는 프론트엔드 디렉토리에 위치한
api_jsonrpc.php 파일로 HTTP POST 요청을 보내야 합니다. 예를 들어,
Zabbix 프론트엔드가 https://example.com/zabbix 아래에 설치되어 있다면,
apiinfo.version 메서드를 호출하는 HTTP 요청은 다음과 같이
보일 수 있습니다:
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}'
요청에는 Content-Type 헤더가 다음 값 중 하나로
설정되어야 합니다: application/json-rpc, application/json 또는
application/jsonrequest.
요청 객체는 다음 속성들을 포함해야 합니다:
jsonrpc- API에서 사용하는 JSON-RPC 프로토콜 버전 (Zabbix API는 JSON-RPC 버전 2.0을 구현함);method- 호출되는 API 메서드;params- API 메서드에 전달될 매개변수;id- 요청의 임의 식별자 (생략하면 API는 요청을 알림으로 처리함).
요청이 올바르다면, API에서 반환하는 응답은 다음과 같이 보여야 합니다:
{
"jsonrpc": "2.0",
"result": "7.0.0",
"id": 1
}
응답 객체에는 다음 속성들이 포함됩니다:
jsonrpc- JSON-RPC 프로토콜 버전;result- 메서드에서 반환한 데이터;id- 해당 요청의 식별자.
예제 워크플로
다음 섹션에서는 사용법의 몇 가지 예제를 더 자세히 살펴보겠습니다.
인증
Zabbix의 데이터에 접근하려면 다음 중 하나를 사용해야 합니다:
- 기존 API 토큰 사용 (Zabbix 프론트엔드에서 생성하거나 Token API를 사용하여 생성);
- user.login 메서드로 획득한 인증 토큰 사용.
예를 들어, 표준 Admin 사용자로 로그인하여 새로운 인증 토큰을 얻고자 한다면, JSON 요청은 다음과 같습니다:
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}'
자격 증명을 올바르게 제공했다면, API에서 반환되는 응답에는 사용자 인증 토큰이 포함되어야 합니다:
{
"jsonrpc": "2.0",
"result": "0424bd59b807674191e7d77572075f33",
"id": 1
}
인증 방법
Authorization 헤더로
모든 API 요청에는 인증 또는 API 토큰이 필요합니다. 요청에서 Authorization 헤더를 사용하여 자격 증명을 제공할 수 있습니다:
curl --request POST \
--url 'https://example.com/zabbix/api_jsonrpc.php' \
--header 'Authorization: Bearer 0424bd59b807674191e7d77572075f33'
인증 문제가 발생하는 경우 Authorization 헤더 전달을 참조하세요.
Zabbix 7.0.7부터 Authorization 헤더가 교차 출처 요청(CORS)에서 지원됩니다.
Zabbix 7.0.11부터 Zabbix API는 대소문자를 구분하지 않는 방식으로 헤더를 허용합니다(예: authorization, Authorization, AUTHORIZATION이 동일하게 처리됩니다).
auth 속성으로
API 요청은 auth 속성으로 인증할 수 있습니다.
auth 속성은 더 이상 사용되지 않습니다. 향후 릴리스에서 제거될 예정입니다.
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}'
Zabbix 쿠키로
"zbx_session" 쿠키는 JavaScript를 사용하여 수행되는 Zabbix UI의 API 요청(모듈 또는 커스텀 위젯에서)을 인증하는 데 사용됩니다.
호스트 조회
이제 Zabbix의 데이터에 액세스하는 데 사용할 수 있는 유효한 사용자 인증 토큰(다음 예제에서 변수로 표시)을 얻었습니다. 예를 들어, host.get 메서드를 사용하여 구성된 모든 호스트의 ID, 호스트명 및 인터페이스를 조회할 수 있습니다:
요청:
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은 JSON 쿼리가 포함된 파일입니다. 파일 대신 --data 인수에서 쿼리를 직접 전달할 수도 있습니다.
data.json
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2
}
응답 객체에는 호스트에 대한 요청된 데이터가 포함됩니다:
{
"jsonrpc": "2.0",
"result": [
{
"hostid": "10084",
"host": "Zabbix server",
"interfaces": [
{
"interfaceid": "1",
"ip": "127.0.0.1"
}
]
}
],
"id": 2
}
성능상의 이유로 조회하고자 하는 객체 속성을 목록으로 지정하는 것이 항상 권장됩니다. 이렇게 하면 모든 것을 조회하는 것을 피할 수 있습니다.
새 아이템 생성
이제 이전 host.get
요청에서 얻은 데이터를 사용하여 "Zabbix
server" 호스트에 새 아이템을 생성합니다. 이는
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}'
성공적인 응답에는 새로 생성된 아이템의 ID가 포함되어 있으며, 이후 요청에서 아이템을 참조하는 데 사용할 수 있습니다:
{
"jsonrpc": "2.0",
"result": {
"itemids": [
"24759"
]
},
"id": 3
}
item.create 메서드와 다른 생성 메서드들은
객체 배열도 허용하여 하나의 API 호출로 여러 아이템을 생성할 수 있습니다.
여러 트리거 생성
따라서 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":"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}'
성공적인 응답에는 새로 생성된 트리거들의 ID가 포함됩니다:
{
"jsonrpc": "2.0",
"result": {
"triggerids": [
"17369",
"17370"
]
},
"id": 4
}
아이템 업데이트
상태를 "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}'
성공적인 응답에는 업데이트된 아이템의 ID가 포함됩니다:
{
"jsonrpc": "2.0",
"result": {
"itemids": [
"10092"
]
},
"id": 5
}
item.update 메서드와 다른 업데이트 메서드들은
객체 배열도 받을 수 있어서 하나의 API 호출로 여러 아이템을 업데이트할 수 있습니다.
여러 트리거 업데이트
상태를 "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}'
성공적인 응답에는 업데이트된 트리거의 ID가 포함됩니다:
{
"jsonrpc": "2.0",
"result": {
"triggerids": [
"13938",
"13939"
]
},
"id": 6
}
이것이 권장되는 업데이트 방법입니다. host.massupdate와 같은 일부 API 메서드는 더 간단한 코드를 작성할 수 있게 해줍니다.
그러나 이러한 메서드는 향후 릴리스에서 제거될 예정이므로 사용하지 않는 것이 좋습니다.
오류 처리
지금까지 시도한 모든 것이 잘 작동했습니다. 하지만 API를 잘못 호출하면 어떻게 될까요?
host.create를 호출하여 다른 호스트를 생성해보되,
필수 매개변수인 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}'
그러면 응답에는 오류 메시지가 포함됩니다:
{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "Invalid params.",
"data": "No groups for host \"Linux server\"."
},
"id": 7
}
오류가 발생한 경우, 응답 객체는 result 속성 대신 다음 데이터를 포함하는
error 속성을 포함합니다:
code- 오류 코드;message- 짧은 오류 요약;data- 더 자세한 오류 메시지.
오류는 잘못된 입력 값 사용, 세션 시간 초과 또는 존재하지 않는 객체에 접근하려는 시도 등 다양한 경우에 발생할 수 있습니다. 애플리케이션은 이러한 종류의 오류를 우아하게 처리할 수 있어야 합니다.
API 버전
API 버전 관리를 단순화하기 위해 Zabbix 2.0.4부터 API 버전이 Zabbix 자체 버전과 일치합니다. apiinfo.version 메소드를 사용하여 작업 중인 API 버전을 확인할 수 있습니다. 이는 버전별 기능을 사용하도록 애플리케이션을 조정하는 데 유용할 수 있습니다.
Zabbix는 주요 버전 내에서 기능 하위 호환성을 보장합니다. 주요 릴리스 간에 하위 호환되지 않는 변경사항을 만들 때, Zabbix는 일반적으로 다음 릴리스에서 기존 기능을 더 이상 사용되지 않는 것으로 남겨두고, 그 다음 릴리스에서만 제거합니다. 때때로 Zabbix는 하위 호환성을 제공하지 않고 주요 릴리스 간에 기능을 제거할 수 있습니다. 더 이상 사용되지 않는 기능에 의존하지 말고 가능한 한 빨리 새로운 대안으로 마이그레이션하는 것이 중요합니다.
API에 대한 모든 변경사항은 API 변경 로그에서 확인할 수 있습니다.
추가 읽을거리
이제 Zabbix API로 작업을 시작할 충분한 지식을 갖게 되었지만, 여기서 멈추지 마세요. 추가 읽을거리로 사용 가능한 API 목록을 살펴보는 것을 권장합니다.