君子恥其言而過其行 論語
首次開通短信套餐包的騰訊雲每月會贈送100條的免費短信數量,我們可以拿這100條短信進行測試
開通之後需要添加一個應用

進入建立好的應用
這裡需要記住應用的ID還有key,後面接入的時候需要用到
建立應用簽名以及模闆
單擊建立簽名
首先騰訊雲隻支援以下類型的簽名,個人用的話可以使用自己已經備案的網站或者自己注冊一個公衆号,這裡再說一下,阿裡雲的是不支援個人公衆号的隻能是企業号,由于我的網站還沒備案,這裡就隻能使用公衆号來認證了,使用公衆号證明材料隻需要公衆号的背景截圖就可以了,比其他類型的要友善,申請說明要寫公衆号的名字。不然稽核不通過
建立應用模闆
模闆内容使用{}作為變量,建立完模闆之後會生成一個模闆ID,這個後面接入的時候也會用到,由于個人使用者單個模闆變量最大長度不超過12個字元,是以需要多定義幾個變量,最後用正則取出
注意:模闆變量之間使用,分隔的話,那麼在觸發器裡名字就不要包含,了,否則會發生轉義,導緻由于變量太長而發送短信失敗
開始接入騰訊雲短信服務
騰訊雲支援多種語言的SDK和api,使用SDK會更加的友善一點,騰訊雲的python SDK為qcloudsms_py,可以直接使用pip安裝,騰訊雲的SDK文檔位址為:https://cloud.tencent.com/document/product/382/11672 ,是以我選擇了使用api來接入,
由于騰訊的模闆單個變量長度最長不能超過12個字元,且模闆變量之間不能有空字元,是以我們需要在傳入模闆之前進行文本處理
實作思路:
-
将擷取到的資訊前五行進行正則比對,因為前五行的内容比較短,友善處理,将”:
”與換行符之間的内容進行比對,并添加到清單中
- 将擷取到的資訊最後一行也就是事件資訊進行正則比對,由于内容比較長,是以需要将字元串分成五組,每組長度不超過十二個字元,并存放在清單中,将兩個清單進行相加,并作為模闆參數傳給短信服務的api
- 将傳入清單中的元素作為參數post請求給api,平台發送短信
代碼如下:
#!/usr/bin/python3#coding=utf-8#author:wangerimport requests,reimport time,sys,json,hashlib,randomrand=random.randint(100000,999999)mobile=sys.argv[1]message=sys.argv[2]message="""%s""" %messagetimes=time.time()times=int(times)tpl_id=225686appkey='f545bc772b396c41df6da4c4442ce085'raw_text="appkey={}&random={}&time={}&mobile={}".format(appkey,rand,times,mobile)sig=hashlib.sha256(raw_text.encode('utf-8')).hexdigest()def rest(message): #擷取報警内容,友善後續調試 with open('/tmp/message','w',encoding='utf-8') as f: s=json.dump(message,f,ensure_ascii=False) res=re.findall(r':(.*)\r\n',message,re.M) hostname=res[0] ip1=re.match(r'(\d+\.\d+)\.(.*)',res[1]).group(1) ip2=re.match(r'(\d+\.\d+)\.(.*)',res[1]).group(2) date1=re.match(r'(.*)-(.*)',res[2]).group(1) time1=re.match(r'(.*)-(.*)',res[2]).group(2) level=res[3] id1=res[4] alert=[hostname,ip1,ip2,date1,time1,level,id1] #擷取處理後的前五行内容,友善調試 with open('tmp/messages','a',encoding='utf-8') as f: for i in alert: f.write(i) return alertdef remes(alert,message): res=re.search('報警資訊:(.*)$',message).group(1) event=[] a,b=0,11 for i in range(5): s1=res[a:b] if len(s1)==0: s1='\r' event.append(s1) a,b=a+11,b+11 var=alert+event #擷取處理後的報警資訊,友善調試 with open('/tmp/messages1','a',encoding='utf-8') as f: for i in event: s=json.dump(i,f,ensure_ascii=False) return var #print(sig)def sendsms(remes): url='https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=1400238944&random={}'.format(rand) header={"Content-Type": "application/json"} data={ "ext": "123", "extend": "", "params": [ remes[0], remes[1], remes[2], remes[3], remes[4], remes[5], remes[6], remes[7], remes[8], remes[9], remes[10], remes[11] ], "sig": sig, "sign": "沒有故事的陳師傅", "tel": { "mobile": mobile, "nationcode": "86" }, "time": times, "tpl_id": tpl_id } request=requests.post(url=url,headers=header,json=data) return json.loads(request.content)rest=rest(message)remes=remes(rest,message)sendsms(remes)
接入zabbix報警
将腳本放到/usr/lib/zabbix/alertscripts/目錄下,并授予腳本操作權限,然後在zabbix頁面進行配置
定義報警媒介類型
配置使用者接收的手機号
添加動作
消息内容的順序不能亂,因為是與短信模闆進行比對的
進行zabbix報警測試
停止zabbix-agent,使其産生報警
systemctl stop zabbix-agent
可以看到報警短信已經收到
如果要檢視短信的報錯資訊,可以在騰訊雲短信服務的統計分析中檢視
踩過的坑
- 盡量使用python3,python2在Linux環境下比對資料可能會存在問題
- 短信模闆中變量的分隔符盡量不要出現在觸發器中,否則會造成轉義
- 騰訊雲同一手機号的發送短信頻率為30秒内發送短信條數不超過1條,1小時内發送短信條數不超過5條,1個自然日内發送短信條數不超過10條,是以以後可以試試其他廠商的産品或者進行企業認證
- 傳入的模闆變量不能為空字元,可以先将空字元串轉為”\r”,模闆變量之間也不能用空字元分隔
歡迎各位一起交流,對腳本的改進意見可在下方留言