Chinaunix首页 | 论坛 | 博客
  • 博客访问: 243575
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 414
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-22 11:22
个人简介

.....

文章分类

全部博文(32)

文章存档

2016年(1)

2015年(12)

2014年(19)

我的朋友

分类: 系统运维

2015-03-25 07:52:31

之前配置了Discovery+Action实现了主机自动发现并主机、分组、添加模板等功能。后来进入组里面一看原来都是Hostsname都是以IP地址命名的,后来就拿phpzbx 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表结构:

点击(此处)折叠或打开

  1. CREATE TABLE IF NOT EXISTS `dhosts_plus` (

  2.   `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增',

  3.   `IP` varchar(20) NOT NULL COMMENT 'IP地址',

  4.   `OS` varchar(255) NOT NULL COMMENT '系统',

  5.   `agent.hostname` varchar(30) NOT NULL COMMENT '名字',

  6.   `agent.version` varchar(30) NOT NULL COMMENT '版本',

  7.   PRIMARY KEY (`ID`)

  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

MYSQL表内容:



脚本内容
:

        这些php文件头部都加了#!/opt/lampp/bin/php 这是我配置的php环境 在LINUX命令行下chmod +x insert.php 就可在命令行下运行php文件。

Insert.php

点击(此处)折叠或打开

  1. #!/opt/lampp/bin/php
  2. <?php
  3. /* PDO方式连接MYSQL */
  4. $pdo = new PDO("mysql:host=202.206.32.218;dbname=zabbix","root","zsdsywr.");

  5. function insert($pdo){

  6.     // 清空dhosts_plus表 SQL语句
  7.     $SQL_1 = 'TRUNCATE TABLE dhosts_plus';
  8.     // 执行SQL语句
  9.     $pdo -> query($SQL_1);
  10.     // 查找dservices表内的ip,value字段 SQL语句
  11.     $SQL_2 = 'SELECT ip,value FROM dservices';
  12.     //执行SQL语句
  13.     $result = $pdo -> query($SQL_2);
  14.     // 遍历
  15.     while($row = $result -> fetch()){
  16.          #print_r($row);
  17.          $ip = $row['ip'];
  18.          $os = $row['value'];

  19.          // 用zabbix_get脚本来获取主机名称 和 客户端版本号
  20.          $name = exec("/usr/local/zabbix_proxy/bin/zabbix_get -s $ip -k'agent.hostname'");
  21.          $version = exec("/usr/local/zabbix_proxy/bin/zabbix_get -s $ip -k'agent.version'");

  22.          // 将上面返回结果插入到 dhosts_plus 表内 SQL语句
  23.          $SQL_3 = "INSERT INTO `dhosts_plus` (`ID`, `IP`, `OS`,`agent.hostname`, `agent.version`) VALUES (NULL, '$ip', '$os', '$name', '$version')";
  24.          # echo $SQL_3;
  25.          # exit;
  26.          // 执行
  27.          $pdo -> exec($SQL_3);
  28.          $ID = $pdo -> lastInsertId();
  29.          // 执行成功后 返回ID
  30.          echo $ID."\n";
  31.     }
  32. }

  33. insert($pdo);

Update.php

点击(此处)折叠或打开

  1. #!/opt/lampp/bin/php
  2. <?php
  3. /* 调用zabbix api PHP版本 非官方版 */
  4. require __DIR__ . '/zbx.inc.php';
  5. /* PDO方式连接MYSQL数据库 */
  6. $pdo = new PDO("mysql:host=202.206.32.218;dbname=zabbix","root","zsdsywr.");

  7. $zbx = new zbx;

  8. /* 调用API 并 认证 */
  9. $zbx->url = "";
  10. $zbx->method = 'user.login';
  11. /* 用户名 */
  12. $zbx->query['user'] = 'api';
  13. /* 密码 */
  14. $zbx->query['password'] = 'zabbix';
  15. $zbx->access_token = $zbx->call()['result'];


  16. // 获得windows 主机 SQL语句
  17. $SQL_1='SELECT * FROM `dhosts_plus` WHERE `OS` like "%Win%"';
  18. // 执行
  19. $result = $pdo -> query($SQL_1);
  20. // windows 主机更新
  21. while($row = $result -> fetch()){
  22.     #print_r($row);
  23.     $ip = $row['IP'];
  24.     $host = $row['agent.hostname'];
  25.     $version = $row['agent.version'];

  26.     // 获得 hosts id
  27.     $zbx->method = 'host.get';
  28.     $zbx->query['output'] = 'hostids';
  29.     $zbx->query['filter']['ip'] = "$ip";
  30.     $hostid = $zbx->call()['result']['0']['hostid'];
  31.     #print_r($hostid);

  32.     // 通过hosts id 更新主机
  33.     $zbx->method = 'host.update';
  34.     $zbx->query['hostid'] = "$hostid";
  35.     $zbx->query['host'] = "$host";
  36.     $zbx->query['name'] = "$host";
  37.     // 描述的位置写上 客户端版本号;覆盖性写入
  38.     # $zbx->query['description'] = "This Agentd version:$version";
  39.     $hostupdate = $zbx->call();
  40.     // 返回hostsid,证明更新成功
  41.     print_r($hostupdate);
  42. }

  43. // 获得LINUX 主机 SQL语句
  44. $SQL_2='SELECT * FROM `dhosts_plus` WHERE `OS` like "%Linux%"';
  45. // 执行
  46. $result = $pdo -> query($SQL_2);
  47. // LINUX 主机更新
  48. while($row = $result -> fetch()){
  49.     #print_r($row);
  50.     $ip = $row['IP'];
  51.     $host = $row['agent.hostname'];
  52.     $version = $row['agent.version'];

  53.     // Host ID
  54.     $zbx->method = 'host.get';
  55.     $zbx->query['output'] = 'hostids';
  56.     $zbx->query['filter']['ip'] = "$ip";
  57.     $hostid = $zbx->call()['result']['0']['hostid'];
  58.     #print_r($hostid);

  59.     // Update Host
  60.     $zbx->method = 'host.update';
  61.     $zbx->query['hostid'] = "$hostid";
  62.     $zbx->query['host'] = "$host";
  63.     $zbx->query['name'] = "$host";
  64.     # $zbx->query['description'] = "This Agentd version:$version";
  65.     $hostupdate = $zbx->call();
  66.     print_r($hostupdate);
  67. }

Zbx.inc.php

点击(此处)折叠或打开

  1. <?php

  2. class jsonrpc{

  3.  

  4.     protected function connect($server, $query){

  5.         $http = curl_init($server);

  6.         curl_setopt($http, CURLOPT_CUSTOMREQUEST, 'POST');

  7.         curl_setopt($http, CURLOPT_POSTFIELDS, $query);

  8.         curl_setopt($http, CURLOPT_RETURNTRANSFER, TRUE);

  9.         curl_setopt($http, CURLOPT_SSL_VERIFYPEER, FALSE);

  10.         /* curl_setopt($http, CURLOPT_PROXY, 'proxy_url');

  11.         curl_setopt($http, CURLOPT_PROXYPORT, '3128');

  12.         curl_setopt($http, CURLOPT_PROXYUSERPWD, 'login:pass'); */

  13.         curl_setopt($http, CURLOPT_SSL_VERIFYHOST, FALSE);

  14.         curl_setopt($http, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);

  15.         $response = curl_exec($http);

  16.         return json_decode($response, true);

  17.         curl_close($http);

  18.     }

  19.  

  20. }

  21.  

  22.  

  23. class zbx extends jsonrpc{

  24.  

  25.     public $method;

  26.     public $access_token;

  27.     public $url;

  28.     public $query;

  29.  

  30.     function call(){

  31.         $data['jsonrpc'] = '2.0';

  32.         $data['method'] = $this->method;

  33.         $data['params'] = $this->query;

  34.         $this->query = '';

  35.         if(!empty($this->access_token))

  36.         $data['auth'] = $this->access_token;

  37.         $data['id'] = rand(1,100);

  38.         $data = json_encode($data, JSON_PRETTY_PRINT);

  39.         return $this->connect($this->url, $data);

  40.     }

  41.  

  42. }






阅读(3381) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~