zabbix 自動發現批量添加主機並且自定義主機名


利用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/documentation/2.2/manual/installation/install_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/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm
shell # yum install zabbix-agent -y
shell # server=xx.xx.xx.xx
shell # sed -i "/^Server=/c\Server=$server" /etc/zabbix/zabbix_agentd.conf
shell # sed -i "/^ServerActive=/c\ServerActive=$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】,創建發現規則。

wKiom1QFZUCjIhpuAALq-t4ct54520.jpg

    Name:        為發現規則起個名字

    IP range:    客戶端所屬的IP網段

    Delay:       發現周期,單位秒

    Checks:      選擇“Zabbix agent”檢測類型、端口10050、Key填寫“system.uname”

    查看自動發現結果,下圖結果顯示了有三台主機正確安裝了zabbix agent。

wKioL1QFVaPCgYStAAKZaGWn218261.jpg

三、創建Action規則

    選擇【Configuration】->【Actions】,在右邊“Event source”選擇“Discovery”,然后創建Action規則如下圖所示:

wKiom1QFVivCwFl_AAKYGIZO4EY409.jpg

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

四、查看最后的結果

    稍等一段時間,到主機列表里可以看到三個客戶端已經自動創建好了,監控狀態也是正常的。

wKiom1QFWYXRxgEWAAO8OQtbdTs331.jpg

五、實現自定義主機名

    添加的客戶端主機的Host name是以IP地址命名的,不夠人性化。我們從底層C代碼探究一下為什么是這樣,該怎么解決:

1
2
                 /* for host uniqueness purposes */
                 host = zbx_strdup(host,  '\0'  != *row[3] ? row[3] : row[2]);

    在zabbix-2.2.5\src\zabbix_server\operations.c源文件的add_discovered_host函數里,發現主機名host是從數據庫dservices表的dns字段和ip字段取得的,如果dns不為空的話,host就是dns,否則就是ip。上面row[3]是dservices.dns,row[2]是dservices.ip。

    我們再找找dservices.dns是從哪里來的,怎么讓它有值呢,最后找到了zbx_gethost_by_ip函數,在zabbix-2.2.5\src\libs\zbxcomms\comms.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[0] =  '\0' ;
         return ;
     }
 
     if  (NULL == (hst = gethostbyaddr(( char  *)&addr,  sizeof (addr), AF_INET)))
     {
         host[0] =  '\0' ;
         return ;
     }
 
     zbx_strlcpy(host, hst->h_name, hostlen);
}

    我們發現host的值(dservices.dns)是通過gethostbyaddr獲取的。gethostbyaddr是通過IP地址來獲取主機的名稱(域名),所以我們要為客戶端主機的主機名解析到IP地址。可以搭建DNS服務器,也可以直接在zabbix server端的/etc/hosts文件里添加客戶端主機名和IP。

    繼續以上面的實驗為例,在/etc/hosts添加客戶端的主機名和IP:

wKiom1QFYgHziBHGAAElE0xNSpE353.jpg

    然后刪除剛才發現的三個主機,讓zabbix server再重新創建一遍,結果如下:

wKioL1QFY26CxjBHAAOdlkIHsd0786.jpg

    我們發現主機名不再是單純的IP地址了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM