運(yùn)維中有一句重要的話:不允許未監(jiān)控的服務(wù)上線。
成都創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元福建做網(wǎng)站,已為上家服務(wù),為福建各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
zabbix是一個(gè)基于web界面提供分布式系統(tǒng)監(jiān)控以及網(wǎng)絡(luò)監(jiān)控的第三方開源軟件,它主要由兩部分組成:zabbix-server、zabbix-agent。
zabbix具有多樣的特性:
1、支持網(wǎng)絡(luò)自動(dòng)發(fā)現(xiàn)機(jī)制。
2、支持自定義檢測機(jī)制UserParamenter
3、支持實(shí)時(shí)繪圖,把數(shù)據(jù)以圖形的方式顯示出來。
4、支持報(bào)警功能,能夠通過郵件、短信方式告警。
5、支持使用模板,當(dāng)有多個(gè)agent主機(jī)時(shí),具有很大的幫助。
本文實(shí)現(xiàn)的過程:
1、通過shell推送ansible,實(shí)現(xiàn)agent批量部署
2、實(shí)現(xiàn)zabbix-server自動(dòng)發(fā)現(xiàn)功能,批量添加被監(jiān)控端
3、調(diào)用模板并在模板中添加自動(dòng)發(fā)現(xiàn)規(guī)則,監(jiān)聽tcp所有端口
4、基于postfix實(shí)現(xiàn)郵件報(bào)警
5、基于中國網(wǎng)建的API實(shí)現(xiàn)短信報(bào)警
準(zhǔn)備環(huán)境
主機(jī)名 | Ip | 部署服務(wù) |
node1 | 192.168.1.22 | zabbix-server、zabbix-agent、ansible |
node2 | 192.168.1.23 | zabbix-agent |
node3 | 192.168.1.24 | zabbix-agent |
實(shí)現(xiàn)前提:LAMP環(huán)境
一、zabbix系統(tǒng)全程部署
1、yum安裝zabbix服務(wù)(node1)
###zabbix的yum源: [root@node1 ~]# yum install zabbix-server zabbix-server-MySQL zabbix-web zabbix-web-mysql zabbix-agent
2、讓mysql對其授權(quán)用戶,并導(dǎo)入zabbix的三個(gè)sql文件
[root@node1 ~]# mysql -e "create database zabbix charset='utf8'" [root@node1 ~]# mysql -e "grant all on *.* to 'zabbix'@'localhost' identified by 'zabbix'" [root@node1 ~]# mysql -e "grant all on *.* to 'zabbix'@'127.0.0.1' identified by 'zabbix'" [root@node1 ~]# mysql -uzabbix -h227.0.0.1 -p zabbix < /usr/share/doc/zabbix-server-mysql-2.4.8/create/schema.sql [root@node1 ~]# mysql -uzabbix -h227.0.0.1 -p zabbix < /usr/share/doc/zabbix-server-mysql-2.4.8/create/p_w_picpaths.sql [root@node1 ~]# mysql -uzabbix -h227.0.0.1 -p zabbix < /usr/share/doc/zabbix-server-mysql-2.4.8/create/data.sql ###導(dǎo)入完成后可查看mysql中的數(shù)據(jù)庫zabbix是否生成相關(guān)的表
3、修改zabbix-server配置文件,啟動(dòng)并安裝
[root@node1 zabbix]# pwd /etc/zabbix [root@node1 zabbix]# vim zabbix_server.conf DBhost=localhost ###指明數(shù)據(jù)庫地址 DBname:zabbix ###數(shù)據(jù)庫名稱 DBUser:zabbix ###數(shù)據(jù)庫用戶 DBpassword:zabbix ###數(shù)據(jù)庫用戶密碼 DBSocket=/var/lib/mysql/mysql.sock ###指明mysql數(shù)據(jù)庫的套接字文件,如果zabbix和mysql在不同主機(jī)上可不用修改 [root@node1 zabbix]# service zabbix-server start [root@node1 zabbix]# netstat -an | grep 10051 tcp 0 0 :::10051 :::* LISTEN [root@node1 ~]# service httpd start ##啟動(dòng)httpd服務(wù) ##訪問zabbix頁面進(jìn)行安裝:http://$IP/zabbix 注意:安裝時(shí)報(bào)的錯(cuò)"timezone"這個(gè)參數(shù)可在"/etc/php.ini"或者是"/etc/httpd/conf.d/zabbix.conf"文件中修改
4、修改zabbix-agent的配置文件并啟動(dòng),讓Server端監(jiān)控自己
[root@node1 zabbix]# pwd /etc/zabbix [root@node1 zabbix]# vim zabbix_agentd.conf Server=10.10.73.148 ##Agent端允許那個(gè)服務(wù)器過來拉取數(shù)據(jù) ServerActive=10.10.73.148 ##開啟Agent端的主動(dòng)模式,主動(dòng)向服務(wù)端傳輸數(shù)據(jù) [root@node1 zabbix]# service zabbix-agent start tcp 0 0 :::10050 :::* LISTEN
5、通過腳本實(shí)現(xiàn)agent端批量部署
#!/bin/bash #Author:wtc ##############[ Ansible Install ]############### if ! 'rpm -q ansible' &> /dev/null;then ##安裝ansible服務(wù) yum install ansible -y &> /dev/null [[ $? -eq 0 ]] && echo "Install Ansible Success" || echo "Install Ansible Failed" fi ##############[ Add Roles ] ################# cat > /etc/ansible/hosts ##在ansible的hosts中添加agent主機(jī)ip [zabbix] 192.168.1.23 192.168.1.24 END ##############[ Scp Zabbix.repo to Agent]########### ansible zabbix -m copy -a "src=/etc/yum.repos.d/zabbix.repo dest=/etc/yum.repos.d/" ##將zabbix的yum倉庫發(fā)送至agent端 ansible zabbix -m shell -a "yum clean all" ansible zabbix -m shell -a "yum repolist " #############[ Mkdir Zabbix Directorys ] Dir=/etc/ansible/roles/zabbix [[ -d $Dir ]] || mkdir -pv $Dir/{files,templetes,tasks,handles,vars,meta,default} ##創(chuàng)建zabbix角色相應(yīng)的目錄 cp /etc/zabbix/zabbix_agentd.conf /etc/ansible/roles/zabbix/templetes/zabbix_agentd.conf.j2 #############[ Zabbix taska/main.yml ] ######## cat /etc/ansible/roles/zabbix/tasks/main.yml ##編寫yml文件 - name: install zabbix yum: name=zabbix-agent state=present - name: conf file template: src=/etc/ansible/roles/zabbix/templetes/zabbix_agentd.conf.j2 dest=/etc/zabbix/zabbix_agentd.conf - name: service: name=zabbix-agent state=started enabled=true END #############[ yaml file ]################ cat /root/zabbix.yaml - hosts: all remote_user: root roles: - zabbix END ansible-playbook --check /root/zabbix.yaml ansible-playbook /root/zabbix.yaml
6、在zabbix的web界面定義自動(dòng)發(fā)現(xiàn)規(guī)則,自動(dòng)添加被監(jiān)控端
(a)Configuration--->Discovery--->Create discovery rule
(b)定義完成保存之后,等待幾秒,查看服務(wù)端是否自動(dòng)添加;Monitoring--->Discovery
###以上過程就是部署整個(gè)zabbix系統(tǒng),但是部署完成后還需要添加監(jiān)控項(xiàng)!
二、對監(jiān)控端定義監(jiān)控項(xiàng)
1、調(diào)用"Template OS Linux"模板
(a)Configuration--->Avtions--->Discovery--->Create action,定義Action以及conditions
(c)定義操作Operations
(e)以上操作完成之后,可查看agent端是否調(diào)用模板
2、在"Template OS Linux"中沒有監(jiān)聽tcp端口這一項(xiàng),此時(shí)我們需要在模板中自定義檢測機(jī)制"UserParamenter"
(a)編輯zabbix的配置文件,添加"UserParameter",并重啟zabbix-agent
[root@node1 zabbix]# pwd /etc/zabbix [root@node1 zabbix]# vim zabbix_agentd.conf ##添加以下兩行 UnsafeUserParameters=1 UserParameter=portlisten,/opt/app/zabbix/sbin/port.sh ##"portlisten"自定義的key,port.sh腳本是基于json格式篩選出所有的tcp端口 [root@node1 ~]# vim /opt/app/zabbix/sbin/port.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 "\\"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" [root@node1 sbin]# pwd /opt/app/zabbix/sbin [root@node1 sbin]# sh port.sh { "data":[ {"{#TCP_PORT}":"10050"}, {"{#TCP_PORT}":"10051"}, {"{#TCP_PORT}":"22"}, {"{#TCP_PORT}":"25"}, {"{#TCP_PORT}":"3306"}, {"{#TCP_PORT}":"80"} ] } ###注意:之所以使用"sudo netstat -tnlp"是因?yàn)?zabbix-server"服務(wù)是zabbix用戶在執(zhí)行 [root@node1 ~]# zabbix_get -s 192.168.1.22 -k portlisten ##在本機(jī)自行獲取數(shù)據(jù)是否成功! { "data":[ {"{#TCP_PORT}":"10050"}, {"{#TCP_PORT}":"10051"}, {"{#TCP_PORT}":"22"}, {"{#TCP_PORT}":"25"}, {"{#TCP_PORT}":"3306"}, {"{#TCP_PORT}":"80"} ] } ####使用zabbix_get獲取遠(yuǎn)程主機(jī)數(shù)據(jù)遇到的問題 sudo: sorry, you must have a tty to run sudo:編輯"/etc/sudoers",注釋"Defaults requiretty" sudo: no tty present and no askpass program specified:編輯"zabbix-agentd.conf",將"AllowRoot=0"改為"AllowRoot=1" [root@node1 sbin]# chown -R zabbix.zabbix /opt/ ##將port.sh腳本屬主、屬組改為zabbix [root@node1 sbin]# chmod -R +x /opt/ ##給腳本增加執(zhí)行權(quán)限 [root@node1 zabbix]# service zabbix-agent stop Shutting down Zabbix agent: [ OK ] [root@node1 zabbix]# service zabbix-agent start ##重啟node1的zabbix-agent Starting Zabbix agent: [ OK ] [root@node1 zabbix]# ansible zabbix -m shell -a "echo 'UnsafeUserParameters=1' &>> /etc/zabbix/zabbixagentd.conf" ##使用ansible遠(yuǎn)程追加 [root@node1 zabbix]# ansible zabbix -m shell -a "echo 'UserParameter=portlisten,/opt/app/zabbix/sbin/port.sh' &>> /etc/zabbix/zabbixagentd.conf" [root@node1 zabbix]# ansible zabbix -m shell -a "mkdir -p /opt/app/zabbix/sbin" [root@node1 sbin]# ansible zabbix -m copy -a "src=/opt/app/zabbix/sbin/port.sh dest=/opt/app/zabbix/sbin" [root@node1 sbin]# ansible zabbix -m shell -a "chown -R zabbix.zabbix /opt" [root@node1 sbin]# ansible zabbix -m shell -a "chmod -R +x /opt" [root@node1 ~]# ansible zabbix -m shell -a "sed -i '/AllowRoot=0/c \\AllowRoot=1' /etc/zabbix/zabbix_agentd.conf" ####ansible調(diào)用"zabbix"這個(gè)組在第一個(gè)腳本已定義! [root@node1 ~]# ansible zabbix -m shell -a "service zabbix-agent stop" [root@node1 ~]# ansible zabbix -m shell -a "service zabbix-agent start" ##重啟agent端服務(wù)
(b)在"Template OS Linux"中添加自動(dòng)發(fā)現(xiàn)規(guī)則
Configuration-->Templates-->Template OS Linux-->DIscovery-->Create discovery rule
(c)分別定義上圖中的1、2、3
Item_prototypes--->Create item protopyte
Trigger_prototypes--->Create trigger prototype
Graph prototypes--->Create graph prototype
(d)查看tcp端口是否添加
Configuration--->Hosts--->Items
三、實(shí)現(xiàn)觸發(fā)郵件報(bào)警
1、部署postfix服務(wù),并發(fā)送測試短信
[root@node1 ~]# yum install postfix -y ##在node1上安裝郵件服務(wù)器postfix [root@node1 ~]# vim /etc/postfix/main.cf ##編輯配置文件,添加以下幾行 myhostname = mail.umpay.com myorigin = umpay.com mydomain = umpay.com mydestination = localhost mynetworks = 127.0.0.0/8 [root@node1 ~]# echo "127.0.0.1 mail.umpay.com umpay.com" &>> /etc/hosts [root@node1 ~]# service postfix start [root@node1 ~]# echo "Hello, New World" | mail -s "wtc" 1362365xxxx@163.com ##發(fā)送測試短信 [root@node1 ~]# tialf /var/log/maillog
2、定義zabbix服務(wù)端媒介
Administration->->Media types-->Create media type
3、隨后定義Actions、Conditions、Operations
Configuration--->Actions--->Tirggers--->Create action
4、定義郵件收件人
Administration--->Users--->Zabbix administrators--->Users--->Admin--->Media
###以上操作完成后,郵箱報(bào)警完成
5、安裝nginx,監(jiān)聽tcp808端口,測試郵箱報(bào)警
[root@node1 nginx]# nginx [root@node1 nginx]# netstat -tnlp | grep nginx tcp 0 0 0.0.0.0:808 0.0.0.0:* LISTEN 16984/nginx ###出現(xiàn)新的tcp監(jiān)聽端口,zabbix會(huì)自動(dòng)添加至items,這里就不截圖了 [root@node1 nginx]# nginx -s stop
四、實(shí)現(xiàn)短信報(bào)警
1、在zabbix默認(rèn)調(diào)用腳本路徑下放置腳本
[root@node1 ~]# cat /etc/zabbix/zabbix_server.conf | grep AlertScriptsPath AlertScriptsPath=/usr/lib/zabbix/alertscripts [root@node1 ~]# vim /usr/lib/zabbix/alertscripts/sms.sh #!/bin/bash MOBILE_NUMBER=$1 # 手機(jī)號碼 MESSAGE_UTF8=$3 # 短信內(nèi)容 XXD="/usr/bin/xxd" CURL="/usr/bin/curl" TIMEOUT=5 MESSAGE_ENCODE=$(echo "$MESSAGE_UTF8" | ${XXD} -ps | sed 's/\(..\)/%\1/g' | tr -d '\n') #Uid="ch丶瘋子" Uid="聯(lián)動(dòng)優(yōu)勢" #Key="8c1604e2eb0d66dxxxxx" Key="cfcc13b087aaee114c8e" URL="http://utf8.sms.webchinese.cn/?Uid=${Uid}&Key=${Key}&smsMob=${MOBILE_NUMBER}&smsText=${MESSAGE_ENCODE}" set -x ${CURL} -s --connect-timeout ${TIMEOUT} "${URL}" [root@node1 ~]# chmod -R +x /usr/lib/zabbix/alertscripts/sms.sh [root@node1 ~]# chown -R zabbix.zabbix /usr/lib/zabbix/alertscripts/sms.sh
2、配置短信告警媒介
Administration--->Media types--->Create media types
3、配置短信Actions
Configuration--->Actions--->Tirggers--->Create action
(a)配置短信內(nèi)容
(b)配置告警條件
(c)定義告警接收人
4、配置短信接收人
Administration--->Users--->Zabbix administrators--->Users--->Admin--->Media
5、測試nginx短信tcp端口報(bào)警
[root@node1 alertscripts]# nginx -s stop
問題總結(jié):
1、在host中主機(jī)的Discover如果出現(xiàn)"value should not json project",解決辦法如下
[root@node1 ~]# ansible zabbix -m shell -a "sed -i '/Defaults requiretty/c \\#Defaults requiretty' /etc/sudoers" [root@node1 ~]# ansible zabbix -m shell -a "echo 'zabbix ALL=(ALL) ALL' &>> /etc/sudoers" [root@node1 ~]# ansible zabbix -m shell -a "sed -i '/AllowRoot=0/c \\AllowRoot=1' /etc/zabbix/zabbix_agentd.conf"