分散式監控系統Zabbix--完整安裝記錄-批量新增主機和自動發現埠

散盡浮華發表於2016-10-27

 

一、Zabbix-3.0.3批量新增主機的配置如下:

0)被監控機上要安裝zabbix_agent,並配置好zabbix_agentd.conf (如下172.29.8.50是zabbix_server機器的ip地址)

可批量修改zabbix_agentd.conf,如下:
sed -i 's/Server=127.0.0.1/Server=172.29.8.50/g' /etc/zabbix/zabbix_agentd.conf
sed -i 's/ServerActive=127.0.0.1/ServerActive=172.29.8.50/g' /etc/zabbix/zabbix_agentd.conf
grep "Server" /etc/zabbix/zabbix_agentd.conf | grep -v '^#'
service zabbix-agent restart

1)建立自動發現規則。"配置"->"自動發現"->"建立自動發現"

如下“檢查”的配置為:選擇“Zabbix agent”檢測型別、埠10050、Key填寫“system.uname”  (ip範圍可以多種方式填寫,比如:172.29.8.21-27,172.29.33.21-29,172.29.34.34)

2)建立Action動作(事件源是“自動發現”)

上面“操作”裡的“預設接收人”和“預設資訊”都是預設的配置,不用修改,只需要新增下面的操作即可

3)等一會兒,就會發現已批量新增了上面配置的網段的機器

上面採用"自動發現"批量新增主機後,顯示的名稱是主機的ip地址。即新增的客戶端主機的Host name是以IP地址命名的,不夠人性化。
要想實現自定義主機名,方法是:
在zabbix_server主機的/etc/hosts裡面做好客戶端的主機名和IP對映

[root@IDC-Admin-02 ~]# cat /etc/hosts
......
LX-DB-8_21-172.29.8.21    172.29.8.21
LX-DB-8_21-172.29.8.23    172.29.8.23
LX-DB-8_21-172.29.8.24    172.29.8.24
LX-DB-8_21-172.29.8.25    172.29.8.25
LX-DB-8_21-172.29.8.26    172.29.8.26
LX-DB-8_21-172.29.8.27    172.29.8.27

如上配置後,刪除首次"自動發現"批量建立的主機,再次建立後,批量建立的主機的顯示名稱就是其主機名了。

------------------------------------批量新增主機到zabbix監控中---------------------------------
將新上線的172.29.32.0/24網段的伺服器新增到zabbix監控中,zabbix_agent一鍵安裝指令碼為:https://pan.baidu.com/s/1o8wpFpo     提取密碼:7qsi

操作步驟記錄(下面是在zabbix server端操作的):
[root@zabbix ~]# nmap -sn 172.29.32.0/24

Starting Nmap 5.51 ( http://nmap.org ) at 2017-09-05 09:29 CST
Nmap scan report for 172.29.32.1
Host is up (0.0020s latency).
Nmap scan report for 172.29.32.2
Host is up (0.00071s latency).
Nmap scan report for 172.29.32.3
Host is up (0.00092s latency).
Nmap scan report for usercenter01.WANG.cn (172.29.32.21)
Host is up (0.00064s latency).
Nmap scan report for usercenter02.WANG.cn (172.29.32.22)
Host is up (0.00042s latency).
Nmap scan report for passport01.WANG.cn (172.29.32.23)
Host is up (0.00061s latency).
Nmap scan report for passport02.WANG.cn (172.29.32.24)
Host is up (0.00068s latency).
..........

[root@zabbix ~]# nmap -sn 172.29.32.0/24|grep 172.29.32|awk '{print $6}'|cut -d"(" -f2|cut -d ")" -f1



172.29.32.21
172.29.32.22
172.29.32.23
172.29.32.24
172.29.32.25
172.29.32.26
172.29.32.27
172.29.32.28

172.29.32.30
172.29.32.31
172.29.32.32
172.29.32.33
172.29.32.34
........

將ip讀取到一個列表檔案中/mnt/a.txt
[root@zabbix ~]# nmap -sn 172.29.32.0/24|grep 172.29.32|awk '{print $6}'|cut -d"(" -f2|cut -d ")" -f1 > /mnt/a.txt 
[root@zabbix ~]# cat /mnt/a.txt
--------------------------------------------------------------------------------------------------------------------
或者這裡也可以使用造數命令:
[root@localhost ~]# for i in `seq 21 64`;do echo 172.29.32.$i >> /mnt/a.txt;done 
[root@localhost ~]# cat /mnt/a.txt  
--------------------------------------------------------------------------------------------------------------------

參考http://www.cnblogs.com/kevingrace/p/5900303.html,配置到這些被監控主機的信任關係

安裝expect步驟這裡省略~
[root@zabbix ~]# cd /mnt/
[root@zabbix mnt]# ls
a.txt  noscp.exp sshkey.exp  sshkey.sh

這些被監控主機的ssh埠都是22222,密碼都是預設的WANG-@@@-12345(如果埠和密碼是其他的,就按照實際情況進行指令碼修改)
[root@zabbix mnt]# cat noscp.exp
#!/usr/bin/expect

#noscp.exp

if {$argc<4} {
puts stderr "Usage: $argv0 localfile remotefile user passwd "
exit 1
}

set localfile [ lindex $argv 0 ]
set remotefile [ lindex $argv 1 ]
set user [ lindex $argv 2 ]
set pwd [ lindex $argv 3 ]

set timeout 30

spawn scp -P 22222 ${localfile} ${user}@${remotefile}

expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$pwd\r" }
}

expect eof

[root@zabbix mnt]# cat sshkey.exp
#!/usr/bin/expect

#sshkey.exp

if {$argc<3} {
puts stderr "Usage: $argv0 host user passwd "
exit 1
}

set host [ lindex $argv 0 ]
set user [ lindex $argv 1 ]
set pwd [ lindex $argv 2 ]

set timeout 30

#spawn ssh ${user}@${host} "rm -rf ~/.ssh/id_rsa*"
#
#expect {
# "*yes/no" { send "yes\r"; exp_continue }
# "*password:" { send "$pwd\r"; exp_continue }
#}

spawn ssh -p22222 ${user}@${host} "ssh-keygen -t rsa"

expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$pwd\r"; exp_continue }
"Enter file in which to save the key*" { send "\n\r"; exp_continue }
"Overwrite*" { send "y\n"; exp_continue } 
"Enter passphrase (empty for no passphrase):" { send "\n\r"; exp_continue }
"Enter same passphrase again:" { send "\n\r" }
}

spawn ssh -p22222 ${user}@${host} "cat ~/.ssh/id_rsa.pub"

expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$pwd\r" }
}

expect eof

[root@zabbix mnt]# cat sshkey.sh 
#!/bin/bash
for ip in `cat /mnt/a.txt`
do
/mnt/sshkey.exp $ip root WANG-@@@-12345 |grep ssh-rsa >> ~/.ssh/authorized_keys
/mnt/noscp.exp ~/.ssh/authorized_keys $ip:~/.ssh root WANG-@@@-12345
done

接著直接執行指令碼進行信任關係設定:
[root@zabbix mnt]# sh -x sshkey.sh 

執行完之後,驗證下ssh無密碼信任關係是否都成功設定了:
[root@zabbix mnt]# for i in `cat /mnt/a.txt`;do echo $i;ssh -p22222 $i "hostname";done

然後批量進行被監控主機的zabbix_agent安裝及設定(使用zabbix_agent一鍵指令碼)。
線上的話,我是把一鍵安裝指令碼放到內網下載地址裡的
[root@zabbix mnt]# for i in `cat /mnt/a.txt`;do echo $i;ssh -p22222 $i "wget http://yum.wang-inc.com/software/zabbix_agentd_install.sh && sh -x zabbix_agentd_install.sh";done
[root@zabbix mnt]# for i in `cat /mnt/a.txt`;do echo $i;ssh -p22222 $i "lsof -i:10050";done

接著就可以在zabbix的web介面裡批量新增主機了(自動發現)。為了自動發現後能識別出主機名,先提前在zabbix server端做host。
[root@zabbix mnt]# for i in `cat /mnt/a.txt`;do echo $i >> /opt/ip.list;done
[root@zabbix mnt]# for i in `cat /mnt/a.txt`;do ssh -p22222 $i "hostname" >> /opt/hostname.list;done
[root@zabbix mnt]# paste /opt/ip.list /opt/hostname.list >> /etc/hosts

最後就安裝上面"自動發現"實現批量新增主機.......

二、Zabbix-3.0.3自動發現埠的配置如下:

1)編寫自動發現埠的指令碼discovertcpport.sh。配置如下:

[root@IDC-Admin-02 ~]# cd /data/zabbix/monitor_scripts/
[root@IDC-Admin-02 monitor_scripts]# cat discovertcpport.sh 
#!/bin/bash
portarray=(`sudo netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
length=${#portarray[@]}
printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$length;i++))
  do
     printf '\n\t\t{'
     printf "\"{#TCP_PORT}\":\"${portarray[$i]}\"}"
     if [ $i -lt $[$length-1] ];then
                printf ','
     fi
  done
printf  "\n\t]\n"
printf "}\n"

指令碼說明:
使用netstat命令輸出埠號;-tnlp=Tcp協議+不顯示別名+listen狀態+顯示程式名稱;$1~$9表示輸出的第幾個引數;
awk {'print $4'}表示輸出第4個引數(如0.0.0.0:80);awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}
表示擷取冒號後面的值,且只能是0~9的數字;|sort|uniq表示排序和去重。

[root@IDC-Admin-02 monitor_scripts]# chmod 755 discovertcpport.sh
[root@IDC-Admin-02 monitor_scripts]# cd /data/zabbix/etc/zabbix_agentd.conf.d/ 
[root@IDC-Admin-02 zabbix_agentd.conf.d]# cat discovertcp.conf 
UserParameter=tcpportlisten,/bin/bash /data/zabbix/monitor_scripts/discovertcpport.sh "$1"

[root@IDC-Admin-02 zabbix_agentd.conf.d]# /etc/init.d/zabbix_agentd restart

==========在埠自動發現指令碼中,也可以自定義發現哪些應用埠,如下===========

[root@IDC-Admin-02 monitor_scripts]# cat discovertcpport.sh
#!/bin/bash
portarray=(`sudo netstat -tnlp|egrep -i "tns|java|php|httpd|xen|mysqld"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
length=${#portarray[@]}
printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$length;i++))
  do
     printf '\n\t\t{'
     printf "\"{#TCP_PORT}\":\"${portarray[$i]}\"}"
     if [ $i -lt $[$length-1] ];then
                printf ','
     fi
  done
printf  "\n\t]\n"
printf "}\n"

===============================================================

2)服務端測試,如下測試的返回結果是正常的

[root@zabbix_server ~]# /data/zabbix/bin/zabbix_get -s 172.29.16.22 -p10050 -k "tcpportlisten"     //其中的172.20.16.22是被監控機的ip
{
   "data":[
      {"{#TCP_PORT}":"10050"},
      {"{#TCP_PORT}":"22222"},
      {"{#TCP_PORT}":"3306"},
      {"{#TCP_PORT}":"443"},
      {"{#TCP_PORT}":"80"}
   ]
}

3)在zabbix監控介面中建立埠自動發現規則

 

注意下面的“鍵值”要和被監控主機裡的監控指令碼定義的一致!

接著建立Item監控項原型

接著建立觸發器原型:

注意上面“新增”裡面的選擇項如下

最後就是建立影象原型

檢視自動發現的埠監控情況

到此,自動發現埠的監控設定已經完成。下面說下可能遇到的問題:
新增完自動發現規則之後,發現在對應主機的監控圖裡沒有顯示埠的監控項,然後發現自動發現規則的後面有問題提示:Value should be a JSON object
這個錯誤的解決辦法如下:
解決辦法是 vim /etc/sudoers
zabbix ALL=(ALL) NOPASSWD: ALL
#Defaults requiretty                                                                //如果有這個配置項,那麼就註釋掉這個。如果沒有,就忽略

-----------------------------------------------------------------------------------------------------------------------------

順便說下開啟zabbix監控介面裡報警聲音的功能

--------------------------------------------------------------------------定製化自動發現埠-----------------------------------------------------------------
上面在自動發現埠的時候,都是預設發現被監控機上所有開啟的埠。如果我們要對埠進行過濾發現,即只發現我們想要的埠,配置如下:

如下,只發現mysql、java、php-fpm、httpd、redis、mongo、oracle、node、zookeeper這些程式埠

[test@ ~]$ cat /data/zabbix/monitor_scripts/discovertcpport.sh
#!/bin/bash
portarray=(`sudo netstat -tnlp|egrep -i "mysql|java|php-fpm|httpd|redis|mongo|oracle|node|zookeeper"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
length=${#portarray[@]}
printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$length;i++))
  do
     printf '\n\t\t{'
     printf "\"{#TCP_PORT}\":\"${portarray[$i]}\"}"
     if [ $i -lt $[$length-1] ];then
                printf ','
     fi
  done
printf  "\n\t]\n"
printf "}\n"


[test@ ~]$ cat /data/zabbix/etc/zabbix_agentd.conf.d/discovertcp.conf 
UserParameter=tcpportlisten[*],/data/zabbix/monitor_scripts/discovertcpport.sh "$1"


在zabbix server端進行檢查(192.168.1.30是被監控機)。
如下說明該被監控機在定製的自動發現埠中只有3829和3830埠在其中
[root@zabbix ~]# /data/zabbix/bin/zabbix_get -s 192.168.1.30 -p10050 -k "tcpportlisten"
{
        "data":[
                {"{#TCP_PORT}":"3829"},
                {"{#TCP_PORT}":"3830"}
        ]
}

然後在zabbix 的web介面裡新增監控配置,配置和上面一模一樣!這樣就能按照我們自己定製的埠進行自動發現了!

相關文章