應用場景
由於朋友所在公司對安全性要求較高,zabbix所在的網絡環境不能上外網,因此不能通過zabbix將告警直接發送至一些即時通訊工具,這就需要將報警消息發送至一些中間件,並通過中間件轉發出去,這裏選擇使用了kafka,當然kafka中不只有報警信息,也有其他需要發送的數據,這裏就不過多透漏
基礎環境配置
kafka集羣已部署好,這裏不介紹安裝細節
vim /etc/hosts
192.168.179.133 kafka3
192.168.179.132 kafka2
192.168.179.131 kafka1
啓動zookeeper以及kafka
爲了能讓消費者均勻消費broker裏的數據,這裏我設置了6分區三副本
啓動zookeeper
cd /root/kafka_2.12-2.4.1
nohup bin/zookeeper-server-start.sh config/zookeeper.properties & >> zookeeper.log &
啓動kafka
nohup bin/kafka-server-start.sh config/server.properties & >> kafka.log &
創建topics
bin/kafka-topics.sh --create --zookeeper kafka1:2181,kafka2:2181,kafka3:2181 --replication-factor 3 --partitions 6 --topic zabbix-alert
bin/kafka-topics.sh --list --bootstrap-server 192.168.179.132:9092
編寫腳本將報警信息發送至kafka中
vim /usr/lib/zabbix/alertscripts/alert_kafka.py
chmod +x /usr/lib/zabbix/alertscripts/alert_kafka.py
#!/usr/bin/python
#coding=utf-8
from kafka import KafkaProducer
import json,sys
receive=sys.argv[1]
message=sys.argv[2]
producer = KafkaProducer(
value_serializer=lambda v: json.dumps(v).encode('utf-8'),
bootstrap_servers=['192.168.179.132:9092','192.168.179.133:9092','192.168.179.134:9092']
)
data={"receive":receive,"alert":message}
producer.send('zabbix-alert', data)
producer.close()
編寫腳本接收報警信息併發送至企業微信
vim /usr/lib/zabbix/alertscripts/receive.py
#!/usr/bin/python
#coding=utf-8
from kafka import KafkaConsumer
import json,requests
import sys
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
reload(sys)
sys.setdefaultencoding('utf-8')
corpid='ww95f3a6ffd22fee8b8'
secret='iJjHQxTCjIMyW7ZjziaULcxqA7Hg2fjcLM2ssdvwY1Zc'
agentid='1000002'
'''
消費zabbix-alert主題中的數據
注意事項:如需以json格式讀取數據需加上value_deserializer參數
'''
consumer = KafkaConsumer('zabbix-alert',group_id="zabbix-alert",
bootstrap_servers=['192.168.179.132:9092','192.168.179.133:9092','192.168.179.134:9092'],
auto_offset_reset='earliest',value_deserializer=json.loads
)
def gettoken():
tokenurl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
data = {"corpid": corpid,
"corpsecret": secret}
r = requests.get(url=tokenurl, params=data, verify=False)
token = r.json()['access_token']
return token
def sendweixin(token):
wechaturl="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s"%token
data={"touser" : messages['receive'],
"msgtype" : "text",
"agentid" : agentid,
"text" : {"content" : messages['alert']},
"safe": "0"}
headers = {'content-type': 'application/json'}
req = requests.post(url=wechaturl,headers=headers,json=data, verify=False)
print(req.text)
return req
for message in consumer:
token=gettoken()
#messages=json.dumps(message.value,ensure_ascii=False)
messages=message.value
sendweixin(token)
將此腳本放入後臺持續運行
nohup python alert_receive.py & >> alert.log &
ZABBIX動作配置
創建報警媒介
配置用戶告警媒介
收件人爲企業微信的用戶id
配置動作
配置完成後觸發告警進行測試
效果如下
歡迎關注個人公號“運維開發故事”