利用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】,創建發現規則。
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,
'\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:
然后刪除剛才發現的三個主機,讓zabbix server再重新創建一遍,結果如下:
我們發現主機名不再是單純的IP地址了。






