Python巡检OGG并推送钉钉脚本

下面脚本主要根据网络WSN最初OGG检测脚本修改而来,增加了推送钉钉以及判断故障等情况。
主要功能如下:

  1. 监测ssh是否能正常连接,无法连接,推送告警。
  2. 监测OGG链路延迟,进程状态,异常或延迟达到阈值则推送消息。
  3. 可以巡检Linux、AIX、Solaris平台OGG,并将异常链路推送钉钉机器人消息。

如需使用,需要根据自己环境修改下面部分即可:

  1. hostlist中信息,如果有多个主机需要监测,则复制多个花括号中部分,逗号隔开即可。
  2. 钉钉webhook地址,根据自己申请钉钉机器人webhook地址修改即可。
  3. 钉钉机器人密钥,根据钉钉机器人配置界面启用密钥填写即可。
  4. 脚本自身监测以及多久监测一次,根据自己需要,修改second变量以及exec_cnt即可。
  5. 如果是内网环境,需要取消send_message函数中互联网代理设置,填写自己内网代理服务器地址。
#!/usr/bin/env python
# -*-coding: utf-8 -*-
# @Time:2020/7/13 9:47
# @Author: WSN
# @Time:2022/06/07 17:45
# @Modified CZH

import paramiko
import re
import datetime
import time
import os
import hmac
import hashlib
import urllib
import base64
import requests
import json

hostlist=[
{'host': 'IP地址', 'port': 'ssh端口', 'user': 'ogg操作系统用户', 'pwd': 'xxxx', 'oggdir': 'ogg安装目录','orahome': 'oracle_home目录'}
]

# 钉钉发送函数,输入markdown格式消息文本即可发送
def send_message(send_msg,warn_type):
    ### 钉钉配置 begin ###                                                                                                                              
    # 如果是内网,需要有互联网代理配置                                                                                                                  
    # proxies = {'http':'http://IP:PORT','https':'http://IP:PORT'}                                                                                      
    # os.environ["https_proxy"] = "http://IP:PORT"                                                                                            
    webhook="钉钉机器人webhook地址"                        
    timestamp = str(round(time.time() * 1000))                                                                                                          
    secret = '钉钉机器人加密密钥'                                                                      
    secret_enc = secret.encode('utf-8')                                                                                                                 
    string_to_sign = '{}\n{}'.format(timestamp, secret)                                                                                                 
    string_to_sign_enc = string_to_sign.encode('utf-8')                                                                                                 
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()                                                             
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))                                                                                         
    webhook = webhook + '&timestamp=' + timestamp + '&sign=' + sign
    # timestamp 与系统当前时间戳如果相差1小时以上,则认为是非法的请求,所以需要注意发送消息服务器时间不能与标准时间相差超过一小时                                                                         
    headers = {'Content-Type': 'application/json'}                                                                                                      
    user = "all"                                                                                                                                        
    ### 钉钉配置 end ### 
    data={                                                                                                                                          
        "msgtype": "markdown",                                                                                                                      
        "markdown": {                                                                                                                               
            "title": "数据库告警",                                                                                                                  
            "text": f"# <font face=\"华云彩绘\" color=\"#FF0000\" size=\"10\">{warn_type}</font> \n " + send_msg                                      
        },                                                                                                                                          
        "at": {                                                                                                                                     
            "atMobiles": [                                                                                                                          
                user                                                                                                                                
            ],                                                                                                                                      
            "isAtAll": False                                                                                                                        
        }                                                                                                                                           
    }                                                                                                                                               
    #print(data)                                                                                                                                    
    x=requests.post(url=webhook,data=json.dumps(data),headers=headers)                                                                              
    # 打印发送钉钉结果                                                                                                                              
    print('钉钉推送结果为: ' + str(x.json()) + '\n') 


def curtime():
    timenow = str(datetime.datetime.now()) + ' '
    return timenow

# 定义一个休眠循环,定期执行脚本
def sleeptime(hour, min, sec):
    return hour * 3600 + min * 60 + sec

class SshOgg:
    def __init__(self, host, port, username, pwd):
        self.host = host
        self.port = port
        self.username = username
        self.pwd = pwd
        self.orahome = orahome
        self.ssh = paramiko.SSHClient()
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            self.ssh.connect(self.host, self.port, self.username, self.pwd, timeout=5)
            self.sshinvalid = False
            print(self.sshinvalid)
        except:
            self.sshinvalid = True
            print(self.sshinvalid)

    def check_ogg_status(self,orahome,oggdir):
        if self.sshinvalid:
            send_msg = ('**告警时间:** ' + curtime()  + ' \\\n **告警主机:** ' + self.host )
            send_message(send_msg,warn_type='主机SSH无法连接')
        else:
            # 考虑AIX与Linux不同平台library path不同,所以一起设置,防止需要多判断处理不同平台
            cmd = 'export LD_LIBRARY_PATH=%s/lib:%s && export LD_LIBRARY_PATH=%s/lib:%s && echo "info all" |%s/ggsci' % (orahome,oggdir,orahome,oggdir,oggdir)
            # print(cmd)
            stdin, stdout, stderr = self.ssh.exec_command(cmd)
            # print(stdout.readlines)
            for i in stderr.readlines():
                send_msg = ('**告警时间:** ' + curtime()  + ' \\\n **告警主机:** ' + self.host + ' \\\n **告警内容:** ' + i )
                send_message(send_msg,warn_type='无法检测OGG')
                print(i)
            # print(stdout.readlines)
            for i in stdout.readlines():
                # 计数进程和,不为0再进行处理
                v_proc_cnt = i.count('MANAGER')
                v_proc_cnt = v_proc_cnt + i.count('EXTRACT')
                v_proc_cnt = v_proc_cnt + i.count('REPLICAT')
                while v_proc_cnt >= 1:
                    # 确定取到进程行再进行切片,方便判断取值
                    v_i = i.split()
                    print(v_i)
                    # 将进程与状态赋予变量,用于后面判断
                    if len(v_i) == 2:
                        v_proc_type = v_i[0]
                        v_proc_status = v_i[1]
                    elif len(v_i) >= 3:
                        # 进程类型
                        v_proc_type = v_i[0]
                        v_proc_status = v_i[1]
                        # 进程具体名称
                        v_proc_name = v_i[2]
                        # lag at chkpt,读取trail检查点延迟
                        v_lac = str(v_i[3]).split(':')
                        if len(v_lac) == 1:
                            lag_at_ckpt = v_lac[0]
                        else:
                            lag_at_ckpt = int(v_lac[0])*3600 + int(v_lac[1])*60 + int(v_lac[2])
                            print(lag_at_ckpt)
                        print(v_lac)
                        # 切片time since ckpt,然后计算延迟秒数
                        v_tsc = str(v_i[4]).split(':')
                        print(v_tsc)
                        time_since_ckpt = int(v_tsc[0])*3600 + int(v_tsc[1])*60 + int(v_tsc[2])
                        print(time_since_ckpt)
    
                    if v_proc_type == 'MANAGER':
                        print(curtime())
                        print(self.host)
                        print(v_proc_type)
                        print(v_proc_status)
                        send_msg = ('**告警时间:** ' + curtime() + ' \\\n **告警主机:** ' + self.host + ' \\\n **OGG进程:** ' + 
                        v_proc_type + ' \\\n **当前状态 :** ' + v_proc_status)
                    else:
                        send_msg = ('**告警时间:** ' + curtime() + ' \\\n **告警主机:** ' + self.host + ' \\\n **进程类型:** ' + 
                        v_proc_type + ' \\\n **进程名称 :**  ' + v_proc_name + ' \\\n **当前状态 :** ' + v_proc_status + ' \\\n **Lag at Chkpt:** ' + str(lag_at_ckpt) + 's' + ' \\\n **Time Since Chkpt:** ' + str(time_since_ckpt) + 's')
                    """
                    1.
    
                    """
                    if v_proc_type == 'MANAGER' and v_proc_status == 'RUNING':
                        send_message(send_msg,warn_type='OGG MGR正常')
                        time.sleep(3)
                    elif v_proc_type == 'MANAGER' and  v_proc_status != 'RUNNING':
                        send_message(send_msg,warn_type='OGG MGR异常')
                        time.sleep(3)
                    # 进程lag at chkpt如果状态为unknown则,len(v_lac)为1
                    elif len(v_lac) == 1:
                        send_message(send_msg,warn_type='OGG状态异常')
                        time.sleep(3)
                    elif len(v_lac) > 1 and v_proc_status == 'ABENDED':
                        send_message(send_msg,warn_type='OGG故障')
                        time.sleep(3)
                    elif len(v_lac) > 1 and v_proc_status == 'STOPPED':
                        send_message(send_msg,warn_type='OGG停止')
                        time.sleep(3)      
                    elif len(v_lac) > 1 and lag_at_ckpt >= 1800:
                        send_message(send_msg,warn_type='OGG队列读延迟')
                        time.sleep(3)
                    elif time_since_ckpt >= 1800:
                        send_message(send_msg,warn_type='OGG应用延迟')
                        time.sleep(3)
                    elif v_proc_type == 'EXTRACT' and v_proc_status != 'RUNNING':
                        send_message(send_msg,warn_type='OGG EXTRACT异常')
                        time.sleep(3)
                    elif v_proc_type == 'REPLICAT' and v_proc_status != 'RUNNING':
                        send_message(send_msg,warn_type='OGG应用异常')
                        time.sleep(3)
                    else:
                        send_message(send_msg,warn_type='其他情况')
                        time.sleep(3)
                    # while只执行一次即重新获取下一行进程信息判断,避免陷入死循环
                    break

    def closed(self):
        self.ssh.close()


# 定时格式为时,分,秒,间隔5分钟执行一次
second = sleeptime(0, 0, 10)
# 用于监测脚本本身,定时发送脚本运行邮件,防止脚本自身异常
exec_cnt = 0
while 1==1 :
    for con_info in hostlist:
        host = con_info['host']
        port = con_info['port']
        username = con_info['user']
        pwd = con_info['pwd']
        oggdir = con_info['oggdir']
        orahome = con_info['orahome']
        ssh = SshOgg(host, port, username, pwd)
        print('\n------------%s上ogg进程运行状态信息------------' % host)
        print(curtime() + '\n')
        ssh.check_ogg_status(orahome,oggdir)
        ssh.closed()
    print(curtime())
    exec_cnt = exec_cnt + 1
    print('Current execute count is :' + str(exec_cnt) + '\n')
    if exec_cnt == 10:
        send_message('This scripts is running!',warn_type='推送服务监测')
        exec_cnt = 0
    time.sleep(second)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为您提供一些建议: 1. 使用shell脚本调用钉钉API,将执行结果发送到钉钉群中。 2. 使用Python脚本模拟登录钉钉账号,将执行结果发送到钉钉群中。 3. 使用shell脚本执行结果,通过消息队列发送到钉钉群中。 4. 使用curl命令将shell脚本执行结果发送到钉钉群中。 ### 回答2: 编写一个shell脚本,将执行结果推送钉钉系统的消息群组中。实现这个目标,可以使用钉钉提供的开放API接口来发送消息。 首先,我们需要在钉钉开放平台上创建一个自定义机器人,并记录下钉钉提供的Webhook地址。 然后,在shell脚本中,我们可以使用curl命令来发送HTTP POST请求,将脚本执行结果作为消息内容发送到钉钉群组。 以下是一个示例shell脚本,其中将"your_webhook"替换为自己创建的机器人Webhook地址: ```shell #!/bin/bash # 执行命令,并将结果保存到变量中 result=$(your_command) # 组装要发送的消息内容 message="执行结果:${result}" # 发送HTTP POST请求到钉钉机器人 curl -H "Content-Type: application/json" -X POST \ -d '{"msgtype": "text", "text": {"content": "'"${message}"'"}}' \ https://oapi.dingtalk.com/robot/send?access_token=your_webhook ``` 这个脚本首先执行一个命令,将其结果保存到变量中。然后,将这个结果作为消息内容,使用curl命令发送HTTP POST请求到钉钉机器人的Webhook地址。发送的消息类型为文本。 当脚本执行后,它将发送执行结果到指定的钉钉群组中。你可以将命令替换为你想要执行的任何命令,以及自定义发送的消息内容。 请确保在执行脚本之前,在你的机器人设置中验证了你的Webhook地址,并在脚本中替换“your_webhook”为你自己的Webhook地址。 ### 回答3: 推送钉钉脚本可以用于将shell脚本执行结果发送到指定的钉钉群组或用户。下面是一个简单的脚本示例: ```shell #!/bin/bash # 设置钉钉机器人webhook地址 webhook="https://oapi.dingtalk.com/robot/send?access_token=your_access_token" # 获取shell脚本执行结果 result=$(command_to_execute) # 构建JSON数据 data="{\"msgtype\": \"text\", \"text\": {\"content\": \"$result\"}}" # 使用curl发送POST请求到钉钉机器人webhook地址 curl -H "Content-Type: application/json" -d "$data" $webhook ``` 在上面的示例中,首先需要设置钉钉机器人的webhook地址,将`your_access_token`替换为你的具体地址。然后,使用`command_to_execute`来替换为需要执行的shell命令,并将执行结果保存到`result`变量中。接下来,构建JSON数据,其中`content`字段为执行结果。最后,使用curl命令发送POST请求并将数据发送到钉钉机器人的webhook地址。 使用该脚本,你可以将shell脚本执行结果推送钉钉群组或用户中,方便实时查看执行情况和结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值