由于 Zabbix 自动注册没有删除机制(例如以主机名为规则注册,当服务器主机名变更时,会再次注册,并不删除原主机名的监控),导致有重复项。另外机器下线也需要删除服务器的监控。本文记录一种基于 iTop CMDB 和 Zabbix 接口自动审计 Zabbix 监控服务器的方案。
概述
使用 PHP 语言写脚本,并使用以下 SDK。
{
"require": {
"ec-europa/itopapi": "^0.5.2",
"confirm-it-solutions/php-zabbix-api": "2.4.2"
}
}
脚本使用计划任务,每 10 分钟执行一次。
删除下线机器
使用 iTop CMDB API 查询已下线机器列表。
// iTop 中查询所有已下线服务器列表
function getObsoleteServer()
{
global $iTopAPI;
$oql = "SELECT Server WHERE status='obsolete'";
$output_fields = "status,name,hostname";
$data = $iTopAPI->coreGet("Server", $oql, $output_fields);
$data = json_decode($data, true);
$sn = array();
if($data['objects']) {
foreach($data['objects'] as $v) {
$sn[] = $v['fields']['name'];
}
}
return $sn;
}
删除操作
// zabbix查询host接口
function zabbixHostGet($name)
{
global $zbxAPI;
$param = array(
"output" => array("host","inventory"),
"selectInventory" => array("asset_tag", "vendor", "model", "tag", "notes"),
"searchInventory" => array("asset_tag" => $name)
);
$data = $zbxAPI->hostGet($param);
return($data);
}
// zabbix获取所有有asset_tag的服务器
function zabbixAllHostGet()
{
return(json_decode(json_encode(zabbixHostGet("")), true));
}
// 删除冲突项 及 已下线机器
function main()
{
global $zbxAPI;
$conflict = array();
$obsoleteids = array();
$obsolete = getObsoleteServer();
// 先一次性取出zabbix中所有的host,并组装成key为sn的数组
$zbxServers = zabbixAllHostGet();
$zbxAll = array();
foreach($zbxServers as $server)
{
$sn = $server['inventory']['asset_tag'];
// sn未成功录入inventory的忽略
if($sn == "")
{
continue;
}
$hostid = $server['hostid'];
if(in_array($sn, $obsolete)) {
$obsoleteids[] = $hostid;
}
if(array_key_exists($sn, $zbxAll))
{
array_push($conflict, $hostid, $zbxAll[$sn]['hostid']);
}else
{
$zbxAll[$sn] = $server;
}
}
$ret = array();
$ret['zabbix-count'] = count($zbxServers);
foreach($conflict as $host)
{
$param = array($host);
try{
$ret[$host] = $zbxAPI->hostDelete($param);
} catch(Exceptioin $e) {
$ret[$host] = "failed";
}
}
try {
if($obsoleteids) {
$ret['obsolete'] = $zbxAPI->hostDelete($obsoleteids);
}
} catch(Exceptioin $e) {
$ret['obsolete'] = "failed";
}
return($ret);
}
后记
实测发现如果 zabbix-agent
未重启,则注册的主机名不会更新。因此 zabbix-agent
需要定时重启。
(全文完)
发表回复