zabbix-api使用php版本

API简介

Zabbix API开始扮演着越来越重要的角色,尤其是在集成第三方软件和自动化日常任务时。很难想象管理数千台服务器而没有自动化是多么的困难。Zabbix API为批量操作、第三方软件集成以及其他作用提供可编程接口。

Zabbix API是在1.8版本中开始引进并且已经被广泛应用。所有的Zabbix移动客户端都是基于API,甚至原生的WEB前端部分也是建立在它之上。Zabbix API 中间件使得架构更加模块化也避免直接对数据库进行操作。它允许你通过JSON RPC协议来创建、更新和获取Zabbix对象并且做任何你喜欢的操作【当然前提是你拥有认证账户】。
Zabbix API提供两项主要功能:

  • 远程管理Zabbix配置
  • 远程检索配置和历史数据

使用JSON

API 采用JSON-RPC实现。这意味着调用任何函数,都需要发送POST请求,输入输出数据都是以JSON格式。大致工作流如下:



#### 基本请求格式


Zabbix API 简化的JSON请求如下:


{
“jsonrpc”: “2.0”,
“method”: “method.name”,
“params”: {
“param_1_name”: “param_1_value”,
“param_2_name”: “param_2value”
},
“id”: 1,
“auth”: “159121b60d19a9b4b55d49e30cf12b81”,
}

下面一行一行来看:

“jsonrpc”: “2.0”-这是标准的JSON RPC参数以标示协议版本。所有的请求都会保持不变。 “method”: “method.name”-这个参数定义了真实执行的操作。例如:host.create、item.update等等
* “params”-这里通过传递JSON对象来作为特定方法的参数。如果你希望创建监控项,”name”和”key“参数是需要的,每个方法需要的参数在Zabbix API文档中都有描述。
“id”: 1-这个字段用于绑定JSON请求和响应。响应会跟请求有相同的”id”。在一次性发送多个请求时很有用,这些也不需要唯一或者连续 “auth”: “159121b60d19a9b4b55d49e30cf12b81”-这是一个认证令牌【authentication token】用以鉴别用户、访问API。这也是使用API进行相关操作的前提-获取认证ID。

### API 使用

环境准备
Zabbix API是基于JSON-RPC 2.0规格,具体实现可以选择任何你喜欢的编程语言或者手动方式。这里我们采用的Python和基于Curl的方式来做示例。Python 2.7版本已经支持JSON,所以不再需要其他模块组件。当然可以采用Perl、Ruby、PHP之类的语言,使用前先确保相应JSON模块的安装。
身份验证

任何Zabbix API客户端在真正工作之前都需要验证它自身。在这里是采用User.login方法。这个方法接受一个用户名和密码作为参数并返回验证ID,一个安全哈希串用于持续的API调用(在使用User.logout之前该验证ID均有效)。这里使用php代码获取


function Curl($url,$header,$info){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $info);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response);
}

//获取token
function GetToken() {

$logininfo = [
‘jsonrpc’ => ‘2.0’,
‘method’ => ‘user.login’,
‘params’ => [
‘user’ => ‘username’,
‘password’ => ‘password’,
],
‘id’ => 1,
];

$url = ‘http://www.example.com/api_jsonrpc.php‘;
$data = json_encode($logininfo);
$header = [“Content-type: application/json”];
//实例化模型
$model = new GetZabbixToken();
if (!$result = $model->Curl($url, $header, $data)) {
echo ‘无法获取token’;
exit;
}

$token = $result->result;
return $token;
}

//获取主机信息
function GetHosts() {
$hostinfo = [
‘jsonrpc’ => ‘2.0’,
‘method’ => ‘host.get’,
‘params’ => [
‘output’ => [‘hostid’, ‘name’],
‘filter’ => [‘host’ => ‘’],
],
‘auth’ => GetToken(),
‘id’ => 1
];
$url = ‘http://www.example.com/api_jsonrpc.php‘;
$data = jsonencode($hostinfo);
$header = [“Content-type: application/json”];
if (!$result = Curl($url, $header, $data)) {
echo ‘无法获取主机信息’;
exit;
}
return $result->result;
}

这里我用前端页面渲染,效果如下



查看详情页是具体主机硬件信息




代码如下:
function GetInfo($hostid){
$info = [
‘jsonrpc’ => ‘2.0’,
‘method’ => ‘item.get’,
‘params’ => [
‘output’ => [‘key‘,’lastvalue’,’hostid’],
‘filter’ => [
‘hostid’ => $hostid,
‘key_’ => [
‘vfs.fs.size[/,total]’,
‘vfs.fs.size[/,used]’,
‘vfs.fs.size[/,free]’,
‘vfs.fs.size[/data,total]’,
‘vfs.fs.size[/data,used]’,
‘vfs.fs.size[/data,free]’,
‘system.cpu.load[percpu,avg15]’,
‘system.cpu.load[percpu,avg5]’,
‘system.cpu.load[percpu,avg1]’,
‘system.cpu.util[,idle]’,
‘system.cpu.switches’,
‘system.cpu.util[,interrupt]’,
‘system.cpu.util[,iowait]’,
‘vm.memory.size[available]’,
‘vm.memory.size[total]’,
‘custom.vfs.dev.read.ms[sda]’,
‘custom.vfs.dev.write.ms[sda]’,
‘icmpping’,
‘icmppingsec’,
‘icmppingloss’,
‘iptables.lines’,
‘kernel.maxfiles’,
‘net.if.in[em1]’,
‘net.if.in[em2]’,
‘net.if.in[em3]’,
‘net.if.in[em4]’,
‘net.if.out[em1]’,
‘net.if.out[em2]’,
‘net.if.out[em3]’,
‘net.if.out[em4]’,
‘proc.num[]’,
‘system.boottime’,
‘system.localtime’,
‘system.swap.size[,free]’,
‘system.swap.size[,pfree]’,
‘system.swap.size[,total]’,
‘system.uname’,
‘system.uptime’,
‘system.users.num’,
‘vfs.fs.inode[/,pfree]’,
‘vfs.fs.inode[/data,pfree]’,
],
],
],
‘auth’ => GetToken(),
‘id’ => 1,
];

$url = ‘http://www.example.com/api_jsonrpc.php‘;
$info = json_encode($info);
$header = [“Content-type: application/json”];
if(!$info = $model->Curl($url,$header,$info)){
echo ‘无法获取信息’;
exit;
}
return $info->result;
}

 





坚持原创技术分享,您的支持将鼓励我继续创作!