之前配置了Discovery+Action实现了主机自动发现并主机、分组、添加模板等功能。后来进入组里面一看原来都是Hostsname都是以IP地址命名的,后来就拿php和zbx api 写了一个脚本,来完成批量修改主机名的目的。
注:这个hostsname我是用的agentd里面配置的hostsname。
流程:
1.读取zabbix数据库中原有的dservices表,表内存放着discovery的发现信息,IP地址、系统版本。
2.在zabbix数据库中新建一个dhosts_plus表,存放zabbix_get脚本发现的hostsname。
3.通过dhosts_plus表内的信息,与API调用修改已经注册的主机。
注: 主要是通过zabbix_get脚本和agent.hostname agent.version这两个参数。Hostsname是配置文件下设置的。 1.8.2不支持agent.hostname!!!!!!!!!!!!!
目录结构:
MYSQL表结构:
-
CREATE TABLE IF NOT EXISTS `dhosts_plus` (
-
-
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增',
-
-
`IP` varchar(20) NOT NULL COMMENT 'IP地址',
-
-
`OS` varchar(255) NOT NULL COMMENT '系统',
-
-
`agent.hostname` varchar(30) NOT NULL COMMENT '名字',
-
-
`agent.version` varchar(30) NOT NULL COMMENT '版本',
-
-
PRIMARY KEY (`ID`)
-
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
MYSQL表内容:
脚本内容:
这些php文件头部都加了#!/opt/lampp/bin/php 这是我配置的php环境 在LINUX命令行下chmod +x insert.php 就可在命令行下运行php文件。
Insert.php
-
#!/opt/lampp/bin/php
-
<?php
-
/* PDO方式连接MYSQL */
-
$pdo = new PDO("mysql:host=202.206.32.218;dbname=zabbix","root","zsdsywr.");
-
-
function insert($pdo){
-
-
// 清空dhosts_plus表 SQL语句
-
$SQL_1 = 'TRUNCATE TABLE dhosts_plus';
-
// 执行SQL语句
-
$pdo -> query($SQL_1);
-
// 查找dservices表内的ip,value字段 SQL语句
-
$SQL_2 = 'SELECT ip,value FROM dservices';
-
//执行SQL语句
-
$result = $pdo -> query($SQL_2);
-
// 遍历
-
while($row = $result -> fetch()){
-
#print_r($row);
-
$ip = $row['ip'];
-
$os = $row['value'];
-
-
// 用zabbix_get脚本来获取主机名称 和 客户端版本号
-
$name = exec("/usr/local/zabbix_proxy/bin/zabbix_get -s $ip -k'agent.hostname'");
-
$version = exec("/usr/local/zabbix_proxy/bin/zabbix_get -s $ip -k'agent.version'");
-
-
// 将上面返回结果插入到 dhosts_plus 表内 SQL语句
-
$SQL_3 = "INSERT INTO `dhosts_plus` (`ID`, `IP`, `OS`,`agent.hostname`, `agent.version`) VALUES (NULL, '$ip', '$os', '$name', '$version')";
-
# echo $SQL_3;
-
# exit;
-
// 执行
-
$pdo -> exec($SQL_3);
-
$ID = $pdo -> lastInsertId();
-
// 执行成功后 返回ID
-
echo $ID."\n";
-
}
-
}
-
-
insert($pdo);
Update.php
-
#!/opt/lampp/bin/php
-
<?php
-
/* 调用zabbix api PHP版本 非官方版 */
-
require __DIR__ . '/zbx.inc.php';
-
/* PDO方式连接MYSQL数据库 */
-
$pdo = new PDO("mysql:host=202.206.32.218;dbname=zabbix","root","zsdsywr.");
-
-
$zbx = new zbx;
-
-
/* 调用API 并 认证 */
-
$zbx->url = "";
-
$zbx->method = 'user.login';
-
/* 用户名 */
-
$zbx->query['user'] = 'api';
-
/* 密码 */
-
$zbx->query['password'] = 'zabbix';
-
$zbx->access_token = $zbx->call()['result'];
-
-
-
// 获得windows 主机 SQL语句
-
$SQL_1='SELECT * FROM `dhosts_plus` WHERE `OS` like "%Win%"';
-
// 执行
-
$result = $pdo -> query($SQL_1);
-
// windows 主机更新
-
while($row = $result -> fetch()){
-
#print_r($row);
-
$ip = $row['IP'];
-
$host = $row['agent.hostname'];
-
$version = $row['agent.version'];
-
-
// 获得 hosts id
-
$zbx->method = 'host.get';
-
$zbx->query['output'] = 'hostids';
-
$zbx->query['filter']['ip'] = "$ip";
-
$hostid = $zbx->call()['result']['0']['hostid'];
-
#print_r($hostid);
-
-
// 通过hosts id 更新主机
-
$zbx->method = 'host.update';
-
$zbx->query['hostid'] = "$hostid";
-
$zbx->query['host'] = "$host";
-
$zbx->query['name'] = "$host";
-
// 描述的位置写上 客户端版本号;覆盖性写入
-
# $zbx->query['description'] = "This Agentd version:$version";
-
$hostupdate = $zbx->call();
-
// 返回hostsid,证明更新成功
-
print_r($hostupdate);
-
}
-
-
// 获得LINUX 主机 SQL语句
-
$SQL_2='SELECT * FROM `dhosts_plus` WHERE `OS` like "%Linux%"';
-
// 执行
-
$result = $pdo -> query($SQL_2);
-
// LINUX 主机更新
-
while($row = $result -> fetch()){
-
#print_r($row);
-
$ip = $row['IP'];
-
$host = $row['agent.hostname'];
-
$version = $row['agent.version'];
-
-
// Host ID
-
$zbx->method = 'host.get';
-
$zbx->query['output'] = 'hostids';
-
$zbx->query['filter']['ip'] = "$ip";
-
$hostid = $zbx->call()['result']['0']['hostid'];
-
#print_r($hostid);
-
-
// Update Host
-
$zbx->method = 'host.update';
-
$zbx->query['hostid'] = "$hostid";
-
$zbx->query['host'] = "$host";
-
$zbx->query['name'] = "$host";
-
# $zbx->query['description'] = "This Agentd version:$version";
-
$hostupdate = $zbx->call();
-
print_r($hostupdate);
-
}
Zbx.inc.php
-
<?php
-
-
class jsonrpc{
-
-
-
-
protected function connect($server, $query){
-
-
$http = curl_init($server);
-
-
curl_setopt($http, CURLOPT_CUSTOMREQUEST, 'POST');
-
-
curl_setopt($http, CURLOPT_POSTFIELDS, $query);
-
-
curl_setopt($http, CURLOPT_RETURNTRANSFER, TRUE);
-
-
curl_setopt($http, CURLOPT_SSL_VERIFYPEER, FALSE);
-
-
/* curl_setopt($http, CURLOPT_PROXY, 'proxy_url');
-
-
curl_setopt($http, CURLOPT_PROXYPORT, '3128');
-
-
curl_setopt($http, CURLOPT_PROXYUSERPWD, 'login:pass'); */
-
-
curl_setopt($http, CURLOPT_SSL_VERIFYHOST, FALSE);
-
-
curl_setopt($http, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
-
-
$response = curl_exec($http);
-
-
return json_decode($response, true);
-
-
curl_close($http);
-
-
}
-
-
-
-
}
-
-
-
-
-
-
class zbx extends jsonrpc{
-
-
-
-
public $method;
-
-
public $access_token;
-
-
public $url;
-
-
public $query;
-
-
-
-
function call(){
-
-
$data['jsonrpc'] = '2.0';
-
-
$data['method'] = $this->method;
-
-
$data['params'] = $this->query;
-
-
$this->query = '';
-
-
if(!empty($this->access_token))
-
-
$data['auth'] = $this->access_token;
-
-
$data['id'] = rand(1,100);
-
-
$data = json_encode($data, JSON_PRETTY_PRINT);
-
-
return $this->connect($this->url, $data);
-
-
}
-
-
-
-
}
阅读(3381) | 评论(0) | 转发(0) |