werew 发表于 2014-9-3 08:57:37

zabbix应用之discovery批量添加主机并实现自定义主机名

利用zabbix的discovery功能可以实现自动批量添加主机的功能。    下面以自动监控172.16.4.240-250网段的Linux主机为例,步骤如下:
一、客户端安装agent
    为网段内的Linux主机安装好zabbix agent,zabbix_agentd.conf正确配置server的IP和端口,启动agent服务。
    如果你的操作系统为RHEL或者CentOS推荐使用yum安装方式。
    参考官方资料:https://www.zabbix.com/documenta ... stall_from_packages
    以CentOS6系统安装2.2版本的zabbix-agent为例:

1
2
3
4
5
6
7
8
9
shell# rpm -ivh http://repo.zabbix.com/zabbix/2. ... .2-1.el6.noarch.rpm
shell# yum install zabbix-agent -y
shell# server=xx.xx.xx.xx
shell# sed -i "/^Server=/cServer=$server" /etc/zabbix/zabbix_agentd.conf
shell# sed -i "/^ServerActive=/cServerActive=$server:10051" /etc/zabbix/zabbix_agentd.conf
shell# sed -i "/^Hostname=/c#Hostname=Zabbix server" /etc/zabbix/zabbix_agentd.conf
shell# iptables -I INPUT -s $server -p tcp --dport 10050 -j ACCEPT
shell# service iptables save
shell# chkconfig zabbix-agent on




二、创建Discovery规则
    选择【Configuration】->【Discovery】,创建发现规则。

    Name:      为发现规则起个名字
    IP range:    客户端所属的IP网段
    Delay:       发现周期,单位秒

    Checks:      选择“Zabbix agent”检测类型、端口10050、Key填写“system.uname”
    查看自动发现结果,下图结果显示了有三台主机正确安装了zabbix agent。


三、创建Action规则
    选择【Configuration】->【Actions】,在右边“Event source”选择“Discovery”,然后创建Action规则如下图所示:


Conditions
过滤条件

Discovery rule = discovery agent
选择创建好的Discovery规则
Received value like Linux
限制客户端类型为Linux系统

Discovery status = Up

客户端状态为UP


Operations
为符合条件的结果执行操作,
包括创建主机、分配主机组、
链接模板、激活主机

Add host
Add to host groups: Linux servers
Link to templates: Template OS Linux
Enable host
四、查看最后的结果
    稍等一段时间,到主机列表里可以看到三个客户端已经自动创建好了,监控状态也是正常的。


五、实现自定义主机名
    添加的客户端主机的Host name是以IP地址命名的,不够人性化。我们从底层C代码探究一下为什么是这样,该怎么解决:

1
2
                /* for host uniqueness purposes */
                host = zbx_strdup(host, '' != *row ? row : row);




    在zabbix-2.2.5srczabbix_serveroperations.c源文件的add_discovered_host函数里,发现主机名host是从数据库dservices表的dns字段和ip字段取得的,如果dns不为空的话,host就是dns,否则就是ip。上面row是dservices.dns,row是dservices.ip。
    我们再找找dservices.dns是从哪里来的,怎么让它有值呢,最后找到了zbx_gethost_by_ip函数,在zabbix-2.2.5srclibszbxcommscomms.c源文件里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void    zbx_gethost_by_ip(const char *ip, char *host, size_t hostlen)
{
    struct in_addr    addr;
    struct hostent*hst;

    assert(ip);

    if (0 == inet_aton(ip, &addr))
    {
      host = '';
      return;
    }

    if (NULL == (hst = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET)))
    {
      host = '';
      return;
    }

    zbx_strlcpy(host, hst->h_name, hostlen);
}




    我们发现host的值是通过gethostbyaddr获取的。gethostbyaddr是通过IP地址来获取主机的名称(域名),所以我们要为客户端主机的主机名解析到IP地址。可以搭建DNS服务器,也可以直接在zabbix server端的/etc/hosts文件里添加客户端主机名和IP。
    继续以上面的实验为例,在/etc/hosts添加客户端的主机名和IP:

    然后删除刚才发现的三个主机,让zabbix server再重新创建一遍,结果如下:

    我们发现主机名不再是单纯的IP地址了。



页: [1]
查看完整版本: zabbix应用之discovery批量添加主机并实现自定义主机名