利用zabbix的discovery功能可以實作自動批量添加主機的功能。
下面以自動監控172.16.4.240-250網段的Linux主機為例,步驟如下:
一、用戶端安裝agent
為網段内的Linux主機安裝好zabbix agent,zabbix_agentd.conf正确配置server的IP和端口,啟動agent服務。
如果你的作業系統為RHEL或者CentOS推薦使用yum安裝方式。
以CentOS6系統安裝2.2版本的zabbix-agent為例:
<code>shell</code><code># rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm</code>
<code>shell</code><code># yum install zabbix-agent -y</code>
<code>shell</code><code># server=xx.xx.xx.xx</code>
<code>shell</code><code># sed -i "/^Server=/c\Server=$server" /etc/zabbix/zabbix_agentd.conf</code>
<code>shell</code><code># sed -i "/^ServerActive=/c\ServerActive=$server:10051" /etc/zabbix/zabbix_agentd.conf</code>
<code>shell</code><code># sed -i "/^Hostname=/c\#Hostname=Zabbix server" /etc/zabbix/zabbix_agentd.conf</code>
<code>shell</code><code># iptables -I INPUT -s $server -p tcp --dport 10050 -j ACCEPT</code>
<code>shell</code><code># service iptables save</code>
<code>shell</code><code># chkconfig zabbix-agent on</code>
二、建立Discovery規則
選擇【Configuration】->【Discovery】,建立發現規則。
<a href="http://s3.51cto.com/wyfs02/M02/48/07/wKiom1QFZUCjIhpuAALq-t4ct54520.jpg" target="_blank"></a>
Name: 為發現規則起個名字
IP range: 用戶端所屬的IP網段
Delay: 發現周期,機關秒
Checks: 選擇“Zabbix agent”檢測類型、端口10050、Key填寫“system.uname”
檢視自動發現結果,下圖結果顯示了有三台主機正确安裝了zabbix agent。
<a href="http://s3.51cto.com/wyfs02/M02/48/04/wKioL1QFVaPCgYStAAKZaGWn218261.jpg" target="_blank"></a>
三、建立Action規則
選擇【Configuration】->【Actions】,在右邊“Event source”選擇“Discovery”,然後建立Action規則如下圖所示:
<a href="http://s3.51cto.com/wyfs02/M02/48/02/wKiom1QFVivCwFl_AAKYGIZO4EY409.jpg" target="_blank"></a>
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
四、檢視最後的結果
稍等一段時間,到主機清單裡可以看到三個用戶端已經自動建立好了,監控狀态也是正常的。
<a href="http://s3.51cto.com/wyfs02/M01/48/03/wKiom1QFWYXRxgEWAAO8OQtbdTs331.jpg" target="_blank"></a>
五、實作自定義主機名
添加的用戶端主機的Host name是以IP位址命名的,不夠人性化。我們從底層C代碼探究一下為什麼是這樣,該怎麼解決:
<code> </code><code>/* for host uniqueness purposes */</code>
<code> </code><code>host = zbx_strdup(host, </code><code>'\0'</code> <code>!= *row[3] ? row[3] : row[2]);</code>
在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源檔案裡。
<code>void</code> <code>zbx_gethost_by_ip(</code><code>const</code> <code>char</code> <code>*ip, </code><code>char</code> <code>*host, </code><code>size_t</code> <code>hostlen)</code>
<code>{</code>
<code> </code><code>struct</code> <code>in_addr addr;</code>
<code> </code><code>struct</code> <code>hostent *hst;</code>
<code> </code><code>assert</code><code>(ip);</code>
<code> </code><code>if</code> <code>(0 == inet_aton(ip, &addr))</code>
<code> </code><code>{</code>
<code> </code><code>host[0] = </code><code>'\0'</code><code>;</code>
<code> </code><code>return</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>if</code> <code>(NULL == (hst = gethostbyaddr((</code><code>char</code> <code>*)&addr, </code><code>sizeof</code><code>(addr), AF_INET)))</code>
<code> </code><code>zbx_strlcpy(host, hst->h_name, hostlen);</code>
<code>}</code>
我們發現host的值(dservices.dns)是通過gethostbyaddr擷取的。gethostbyaddr是通過IP位址來擷取主機的名稱(域名),是以我們要為用戶端主機的主機名解析到IP位址。可以搭建DNS伺服器,也可以直接在zabbix server端的/etc/hosts檔案裡添加用戶端主機名和IP。
繼續以上面的實驗為例,在/etc/hosts添加用戶端的主機名和IP:
<a href="http://s3.51cto.com/wyfs02/M02/48/07/wKiom1QFYgHziBHGAAElE0xNSpE353.jpg" target="_blank"></a>
然後删除剛才發現的三個主機,讓zabbix server再重新建立一遍,結果如下:
<a href="http://s3.51cto.com/wyfs02/M01/48/09/wKioL1QFY26CxjBHAAOdlkIHsd0786.jpg" target="_blank"></a>
我們發現主機名不再是單純的IP位址了。
本文轉自 張斌_青島 51CTO部落格,原文連結:http://blog.51cto.com/qicheng0211/1547852