docker部署python工程获取财务服务器是否宕机

14 篇文章 0 订阅
3 篇文章 0 订阅
前言

实时获取财务服务器的状态,如若宕机,及时进行处理,避免影响日常业务运转

python工程代码
目录结构
tree -aCg .
.
├── [root    ]  docker-compose.yml
├── [root    ]  root
└── [root    ]  data
    ├── [root    ]  config.py
    ├── [root    ]  finance_db.py
    ├── [root    ]  monitor.py
    └── [root    ]  setup.py

1 directories, 6 files
python与sqlite3数据库的代码
cat > /data/finance_db.py <<-EOF
#!/usr/bin/env python3

import sqlite3


class CreateDb():

    def __init__(self, physical_machine_ip=None, virtual_machine_ip=None, database_filename=None, database_table=None, create_table=None, insert_table_data=None, update_table_data=None, select_table_data=None, get_table_data_method=None):
        self.physical_machine_ip = physical_machine_ip
        self.virtual_machine_ip = virtual_machine_ip
        self.database_filename = database_filename
        self.database_table = database_table
        self.create_table = create_table
        self.insert_table_data = insert_table_data
        self.update_table_data = update_table_data
        self.select_table_data = select_table_data
        self.get_table_data_method = get_table_data_method
        self.conn = sqlite3.connect(database_filename)
        self.cur = self.conn.cursor()

    def createTable(self):
        self.cur.execute(self.create_table)
        self.conn.commit()

    def insertTableData(self):
        self.cur.execute(self.insert_table_data)
        self.conn.commit()

    def updateTableData(self):
        self.cur.execute(self.update_table_data)
        self.conn.commit()

    def selectTableData(self):
        self.cur.execute(self.select_table_data)
        self.conn.commit()
        get_table_data = self.cur.fetchall()
        return get_table_data     

    def closeDatabase(self):
        self.cur.close()
        self.conn.close()
EOF
配置文件

自行从钉钉上获取机器人的Webhook的url

cat > /data/config.py <<-EOF
post_url="https://oapi.dingtalk.com/robot/send?access_token=xxx"
physical_machine_ip = "192.168.5.9"
virtual_machine_ip = "null"
database_filename = "/data/monitor_finance_machine.db" 
database_table = "monitor_finance_machine" 
create_table = "create table {0} (id int not null, physical_machine_ip char(20), virtual_machine_ip char(20), status char(10), record_time datetime, content varchar(95));" 
EOF
编辑监控py文件
cat > /data/monitor.py <<-EOF
#!/usr/bin/env python3

import sh
import re
import requests
import json
import sys
import sqlite3
import subprocess
import time
from finance_db import CreateDb
import config as cfg

class Monitor():

    def excuteCommand(self, command):
        subp = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        if subp.poll() != 0:
            return subp.stdout.read().decode("gbk").encode("utf-8")
        else:
            return "failure"

    def __init__(self):
        self.post_url = cfg.post_url
        self.physical_machine_ip = cfg.physical_machine_ip
        self.virtual_machine_ip= cfg.virtual_machine_ip
        self.database_filename = cfg.database_filename
        self.database_table = cfg.database_table
        self.create_table = cfg.create_table
        self.server_start_status = "start"
        self.server_stop_status = "stop"
        self.server_content_start = "0% packet loss"
        self.server_content_stop = "packet loss"
        self.server_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

    def createTable(self):
        create_table_sql = self.create_table.format(self.database_table)
        create_table = CreateDb(database_filename=self.database_filename, create_table=create_table_sql)
        create_table.createTable()
        create_table.closeDatabase()

    def getPingInfo(self):
        ping_command = "ping -c 4 {0}".format(self.physical_machine_ip)
        get_ping_info = Monitor().excuteCommand(ping_command)
        return str(get_ping_info, encoding="utf8")

    def selectTableData(self):
        select_table_data_sql = "select * from {0}".format(self.database_table)
        select_table = CreateDb(database_filename=self.database_filename, select_table_data=select_table_data_sql)
        select_table_data = select_table.selectTableData()
        select_table.closeDatabase()  
        return select_table_data

    def insertTableData(self, insert_table_data):
        insert_table = CreateDb(database_filename=self.database_filename, insert_table_data=insert_table_data)
        insert_table.insertTableData()
        insert_table.closeDatabase()        

    def excuteInsertTableData(self, server_status, server_content, server_time):
        select_table_data = Monitor().selectTableData()
        current_server_status = server_status
        get_db_final_server_status = ''
        if select_table_data != []:
            get_db_final_server_status = select_table_data[-1][3]
        insert_table_data= "insert into {0} values({1}, '{2}', '{3}', '{4}', '{5}', '{6}')".format(self.database_table, len(select_table_data) + 1, self.physical_machine_ip, self.virtual_machine_ip, server_status, server_time, server_content)
        if (select_table_data == []) or (current_server_status != get_db_final_server_status):
            Monitor().insertTableData(insert_table_data)
            Monitor().sendMonitorToDingding(current_server_status)

    def sendMonitorToDingding(self, server_status):
        headers = {'Content-Type': 'application/json'}
        sendData = "财务服务器的状态为: {0}".format(server_status)
        data = {
            "msgtype": "text",
            "text": {
                "content": sendData
            }
        }
        requests.post(self.post_url, data=json.dumps(data), headers=headers)   

    def excuteInsertAndMonitorJob(self):
        get_ping_info = Monitor().getPingInfo()
        server_status, server_content = '', ''
        server_time=self.server_time
        if "0 packets received, 100% packet loss" in get_ping_info:
            server_status = self.server_start_status
            server_content = self.server_content_start
        else:
            server_status = self.server_stop_status
            server_content = self.server_content_stop
        try:
            Monitor().createTable()
        except:
            pass
        Monitor().excuteInsertTableData(server_status, server_content, server_time)
EOF
执行监控程序文件
cat > /data/setup.py <<-EOF
#!/usr/bin/env python3

from monitor import Monitor


if __name__ == "__main__":
    monitor = Monitor()
    monitor.excuteInsertAndMonitorJob()
EOF
定时任务
cat > root <<-EOF
# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*/15    *       *       *       *       run-parts /etc/periodic/15min
0       *       *       *       *       run-parts /etc/periodic/hourly
0       2       *       *       *       run-parts /etc/periodic/daily
0       3       *       *       6       run-parts /etc/periodic/weekly
0       5       1       *       *       run-parts /etc/periodic/monthly
*/1       *       *       *       *       /data/setup.py &> /dev/null
EOF
docker-compose启动应用服务文件
cat > docker-compose.yml <<-EOF
version: "3.5"
services:
  monitor:
    image: techsharearea/apline:python3.8
    container_name: monitor
    hostname: monitor
    volumes:
      - ./data:/data:Z
      - ./root:/etc/crontabs/root:ro
    restart: always
    tty: true
 EOF
部署服务
chmod +x /data/*
docker-compose up -d
docker exec monitor crond
结语

… …

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值