|
之前配置了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
- 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
- url = "http://202.206.32.41/api_jsonrpc.php";
- $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
- 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);
- }
- }
|
|
|