1. 程式人生 > >Zabbix配置動作執行遠程命令和發送郵件

Zabbix配置動作執行遠程命令和發送郵件

watermark asd pat cdc sea pytho 轉換 間隔 請求

當有事件發生,我們可以根據事件來執行相應的動作,根據事件來源可以分為觸發器動作,自動發現動作,自動註冊動作,內部事件動作,自動發現動作在之前的自動發現那裏講過了,這裏介紹一下觸發器動作,當觸發器事件達到執行動作的必要條件,會執行相應的動作

1.配置郵件告警動作

首先創建一個觸發器動作,觸發報警會發送郵件
技術分享圖片
定義動作觸發條件
技術分享圖片
定義動作執行的操作,這裏是執行發送消息的操作,步驟1-5表示會發送5次消息,默認每次的間隔是30分鐘
技術分享圖片
這裏我們定義了1-5步執行的操作,就是每隔30分鐘,將消息通過‘zabbix_send.py’這個腳本發送給Admin用戶
技術分享圖片
如果問題兩個小時之內沒有確認,則會將在兩個小時之後每隔十五分鐘一次通知zabbix管理組,共發送兩次消息

技術分享圖片
這裏看到兩個操作的步驟五重疊了,這裏較短的自定義步驟持續時間為10分鐘的會覆蓋較長的步驟持續時間,也就是說第二個操作的5步驟會覆蓋第一個操作的5步驟
技術分享圖片
定義恢復操作,問題解決之後會發送消息給Admin用戶
技術分享圖片
定義更新操作,當其他用戶更新問題時收到通知,比如問題被關閉,或者問題嚴重程度發生變化
技術分享圖片
到這裏動作部分就完成了,如果要讓其成功發送郵件,還需要配置用戶和報警媒介

配置用戶

技術分享圖片
配置用戶報警媒介
技術分享圖片
配置用戶的收件人等信息
技術分享圖片

創建報警媒介類型

技術分享圖片
配置報警媒介類型,傳入的三個參數分別為收件人,郵件主題,郵件內容
技術分享圖片
zabbix郵件報警的web界面配置完成了,還需要修改zabbix_server的配置文件,來支持使用腳本
vim /etc/zabbix/zabbix_server.conf

AlertScriptsPath=/usr/lib/zabbix/alertscripts
修改完成後重啟zabbix-server
在/usr/lib/zabbix/alertscripts目錄下添加要使用的報警腳本
並給郵件授予執行權限
chmod +x zabbix_send.py
創建一個graph目錄,並授予權限
mkdir graph chmod 777 -R graph
技術分享圖片

郵件內容及詳細註釋如下:

#!/usr/bin/python
#coding=utf-8
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplib,sys,os,time,re,requests
from smtplib import SMTP

user=‘Admin‘    #定義zabbix用戶名
password=‘zabbix‘    #定義zabbix用戶密碼
graph_path=‘/usr/lib/zabbix/alertscripts/graph‘   #定義圖片存儲路徑
graph_url=‘http://192.168.179.132/chart.php‘     #定義圖表的url
#api_url ="http://10.127.0.119/api_jsonrpc.php"    #定義api的url
#header = {"Content-Type":"application/json" }     #定義api的headers
loginurl="http://192.168.179.132/index.php"          #定義登錄的url
host=‘192.168.179.132‘
to_email=sys.argv[1]    #傳入的第一個參數為收件人郵箱
subject=sys.argv[2]  #傳入的第二個參數為郵件主題   
subject=subject.decode(‘utf-8‘)
smtp_host = ‘smtp.163.com‘  #定義smtp主機地址
from_email = ‘[email protected]‘     #定義發件人地址
mail_pass = ‘asd1234‘       #發件人郵箱校驗碼

def get_itemid():
    #獲取報警的itemid
    itemid=re.search(r‘ITEM ID:(\d+)‘,sys.argv[3]).group(1)
    return itemid

def get_graph(itemid):
    #獲取報警的圖表並保存
    session=requests.Session()   #創建一個session會話
    try:
        loginheaders={            
        "Host":host,            
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
        }
        #定義請求消息頭

        payload = {            
        "name":user,
        "password":password,  
        "autologin":"1",            
        "enter":"Sign in",
        }
        #定義傳入的data
        login=session.post(url=loginurl,headers=loginheaders,data=payload)
        #進行登錄
        graph_params={
            "from" :"now-10m",
            "to" : "now",           
            "itemids" : itemid,                       
            "width" : "400",
        }
        #定義獲取圖片的參數
        graph_req=session.get(url=graph_url,params=graph_params)
        #發送get請求獲取圖片數據
        time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())
        graph_name=‘baojing_‘+time_tag+‘.png‘
        #用報警時間來作為圖片名進行保存
        graph_name = os.path.join(graph_path, graph_name)
        #使用絕對路徑保存圖片
        with open(graph_name,‘wb‘) as f:
            f.write(graph_req.content)
            #將獲取到的圖片數據寫入到文件中去
        return graph_name

    except Exception as e:        
        print e        
        return False
def text_to_html(text):
    #將郵件內容text字段轉換成HTML格式
    d=text.splitlines()   
    #將郵件內容以每行作為一個列表元素存儲在列表中
    html_text=‘‘
    for i in d:
        i=‘‘ + i + ‘<br>‘
        html_text+=i + ‘\n‘
    #為列表的每個元素後加上html的換行標簽
    return html_text

def send_mail(graph_name):
    #將html和圖片封裝成郵件進行發送
    msg = MIMEMultipart(‘related‘)  #創建內嵌資源的實例

    with open(graph_name,‘rb‘) as f:
        #讀取圖片文件
        graph=MIMEImage(f.read())  #讀取圖片賦值一個圖片對象
    graph.add_header(‘Content-ID‘,‘imgid1‘)  #為圖片對象添加標題字段和值
    text=text_to_html(sys.argv[3])
    html="""
    <html> 
      <body>
      %s  <br><img src="cid:imgid1">
      </body>
    </html>
    """ % text
    html=MIMEText(html,‘html‘,‘utf-8‘)  #創建HTML格式的郵件體
    msg.attach(html)   #使用attach方法將HTML添加到msg實例中
    msg.attach(graph)  #使用attach方法將圖片添加到msg實例中
    msg[‘Subject‘] = subject
    msg[‘From‘] = from_email
    try:
        server=SMTP(smtp_host,"25")   #創建一個smtp對象
        server.starttls()    #啟用安全傳輸模式
        server.login(from_email,mail_pass)  #郵箱賬號登錄
        server.sendmail(from_email,to_email,msg.as_string())  #發送郵件  
        server.quit()   #斷開smtp連接
    except smtplib.SMTPException as a:
        print a

def run():
    itemid=get_itemid()
    graph_name=get_graph(itemid)
    send_mail(graph_name)

if __name__ ==‘__main__‘:
    run()

2.配置執行遠程命令的動作

當觸發器達到閾值報警時,我們可以根據相關的報警來執行相關的命令使故障達到自我恢復的效果
這裏我舉一個ssh端口關閉並執行重啟ssh的例子

在系統上配置

在zabbix客戶端配置文件中取消註釋下面語句,以支持zabbix客戶端執行遠程命令
vim /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1
zabbix執行遠程命令使用的是zabbix用戶,確保‘zabbix‘用戶具有已配置命令的執行權限。
vim /etc/sudoers
Defaults !requiretty #不需要提示終端登錄 zabbix ALL=(ALL) NOPASSWD: ALL #允許‘zabbix‘用戶在沒有密碼的情況下運行所有命令。
配置完成後,使用zabbix-get測試是否可以運行遠程命令,如果返回數據,則表示遠程命令可用
zabbix_get -s 192.168.179.132 -k "system.run[sudo df -h]"
技術分享圖片

配置腳本

vim /restart_ssh.sh

#/bin/bash 
systemctl restart sshd

對腳本授予可執行權限
chmod +x /restart_sshd.sh

創建ssh的監控項

技術分享圖片

創建觸發器

技術分享圖片
技術分享圖片

配置動作

創建動作
技術分享圖片
配置動作觸發條件
技術分享圖片
配置動作執行的命令,這裏為了方便查看效果,延遲兩分鐘執行
技術分享圖片

觸發報警

這裏關閉ssh服務,使報警觸發
systemctl stop sshd

報警觸發,兩分鐘後執行腳本

這裏可以使用zabbix-get來獲取監控的值。來查看是否成功執行命令
zabbix_get -s 192.168.179.132 -k net.tcp.port[192.168.179.132,22]
可以看到,zabbix已經成功執行腳本,重啟ssh
技術分享圖片


歡迎各位關註我的微信公眾號“沒有故事的陳師傅”

技術分享圖片

Zabbix配置動作執行遠程命令和發送郵件