天天看點

zabbix應用之discovery批量添加主機并實作自定義主機名

  利用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】-&gt;【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】-&gt;【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, &amp;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>*)&amp;addr, </code><code>sizeof</code><code>(addr), AF_INET)))</code>

<code>    </code><code>zbx_strlcpy(host, hst-&gt;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