DevOps 、AIOps 这几年可谓是高频词汇,不断重复出现在IT大众眼前。
DevOps是一种软件开发方法,涉及软件在整个开发生命周期中的持续开发,持续测试,持续集成,持续部署和持续监控。
AIOps(Artificial Intelligence for IT Operations ),即智能运维,是将人工智能的能力与运维相结合,通过机器学习的方法来提升运维效率。
简单来说就是AI + 运维数据 + 自动化处理类似于AI + Devops。
虽然觉着目前大多数公司都做不到AIOps甚至是DevOps都没有落实到位,但是通过了解这些概念学习到了不少知识,自动化确实是未来运维发展方向,将重复的、机械性的工作自动化,不仅可以提高工作效率、减少出错率、提高员工满意度,也可以大大的缩减公司成本。
所以闲暇时间就做了一个小项目,开发语言是python,起初用的qqbot(这个库是Github上某大神写的)做了一个智能交互机器人(调用小i API接口),可以对QQ消息分析后并进行自动回复(并且可以处理日常系统运维问题),可以将一些信息定时发送的QQ或群提醒客户,例如业务信息、UAP中间监控告警信息等等,但是由于今年1月份鹅厂宣布不再提供Web qq服务后,GG。
最后只好利用了win32、seleinum、等一些模块,通过抓取句柄的方式进行QQ消息的推送。(单项推送,不具备交互功能)
这是一些学习相关的文档(部分是Devops所需),跟大家分享一下,网上也有很多帖子CSDN、Github社区都有。
(1)Zabbix (2)Prometheus (3)Grafana (4)K8s (5)Ansiable (6)Elastic (7)Jenkins (8)Python、ML、DM…
1.Zabbix监控官方文档,目前官网最新版本4.2
https://www.zabbix.com/manuals
2.Prometheus开源云监控官方文档,是CNCF上第二大开源项目,未来应该是云监控主流,目前最新版本2.12
https://prometheus.io/docs/introduction/overview/
3.Grafana开源数据可视化工具官方文档,目前支持大概30 data source,例如Graphite、InfluxDB 、Prometheus 、Elasticsearch、PostgreSQL、Myslq、Oracle
https://grafana.com/docs/
4.K8s是CNCF基于容器云Docker的第一大开源项目,有兴趣的可以看看,中文的文档
https://www.kubernetes.org.cn/k8s
5.Ansiable一个自动化运维工具,功能:系统安装(物理机、虚拟机) --> 程序包安装、配置、服务启动 --> 批量操作 --> 程序发布 --> 监控,这些都可以实现自动化一键部署
https://docs.ansible.com/ansible/latest/index.html
6.Elstic分布式多用户搜索引擎,基于Lucene,并提供RESTful web接口,可以对集群服务日志做收集分析,目前Save这边有几台集群,用作收集EDI集群服务日志
https://www.elastic.co/guide/index.html
7.Jenkins开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件, 这个可能更多和开发有关,有兴趣的可以看看了解下
https://jenkins.io/zh/doc/
8.Automate the boring stuff with python 一个python自动化的文档,将python语法结构
https://automatetheboringstuff.com/#toc
9.Kaggle数据挖掘、分析竞赛平台,冠军有奖金不过比较难
https://www.kaggle.com
10.Machine Learning文档,一个大神的学习笔记,很实用
https://createmomo.github.io/2018/01/23/Super-Machine-Learning-Revision-Notes/#tableofcontents
11.TensorFlow 用于研究和生产的开源机器学习库,目前应用场景:图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用,是目前最热门的机器学习框架
https://tensorflow.google.cn/tutorials/?hl=zh_cn
12.Apache 上相关的项目中文文档,大部分是ML书籍文档
https://docs.apachecn.org/bookmarks
13.The community for data mining
https://www.kdd.org
就分享这么多吧,欢迎交流。
废话扯多了,完整项目,欢迎访问:https://github.com/walkeradmin/Pub
| 部署 | 描述 |
|---|---|
| 开发语言 | python |
| SDK版本 | 3.6↑ |
| 涉及模块 | cx_Oracle、pymysql、win32、ctypes、pythoncom、logformat、requests、schedule、openpyxl、selenium、Pilow |
| 运行环境 | windows server 2016 |
文本、文件推送
文本消息直接复制到剪切板就可以了
文件需要用到pythoncom处理。这里参考https://www.programcreek.com/python/example/63206/pythoncom.TYMED_HGLOBAL
import win32gui
import win32api
from win32.lib import win32con
import win32clipboard as w
import time
from threading import Lock
import traceback
import ctypes
from ctypes import wintypes
import pythoncom
mutex = Lock()
def send(send_mess, group_name):
try:
mutex.acquire()
# TXGuiFoundation
win = win32gui.FindWindow(None, group_name) # 群组名称 or 人名
w.OpenClipboard()
w.EmptyClipboard()
if type(send_mess) == str:
# 文本消息
w.SetClipboardData(win32con.CF_UNICODETEXT, send_mess) # 需要发送的消息
w.CloseClipboard()
# time wait pywintypes.error: (1418, 'GetClipboardData',线程没有打开的剪贴板)
time.sleep(1)
win32gui.SendMessage(win, 770, 0, 0)
win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
elif type(send_mess) == bytes:
# 文件消息
w.SetClipboardData(w.CF_HDROP, send_mess)
time.sleep(1)
win32api.PostMessage(win, win32con.WM_PASTE, 0, 0)
time.sleep(1)
win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
mutex.release()
except Exception as e:
print(str(e))
print(traceback.format_exc())
class DROP(ctypes.Structure):
_fields_ = (('pFiles', wintypes.DWORD),
('pt', wintypes.POINT),
('fNC', wintypes.BOOL),
('fWide', wintypes.BOOL))
def clip_files(file_list, group_name):
try:
offset = ctypes.sizeof(DROP)
length = sum(len(p) + 1 for p in file_list) + 1
size = offset + length * ctypes.sizeof(ctypes.c_wchar)
buf = (ctypes.c_char * size)()
df = DROP.from_buffer(buf)
df.pFiles, df.fWide = offset, True
for path in file_list:
array_t = ctypes.c_wchar * (len(path) + 1)
path_buf = array_t.from_buffer(buf, offset)
path_buf.value = path
offset += ctypes.sizeof(path_buf)
stg = pythoncom.STGMEDIUM()
stg.set(pythoncom.TYMED_HGLOBAL, buf)
send(stg, group_name)
except Exception as e:
print(str(e))
print(traceback.format_exc())
clip_files("xx.txt", name)
截图发送
win32api.keybd_event(0x91, 0, 0, 0) # 0x91 --> win key
win32api.keybd_event(0x2C, 0, 0, 0) # 0x2C --> PRINT SCREEN key
win32api.keybd_event(0x91, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(0x2C, 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(1)
win32gui.SendMessage(win, 770, 0, 0)
win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
如果需要@指定人,SendMessaage时候睡一下就可以了
win = win32gui.FindWindow(None, group_name) # 群组名称 or 人名
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, str(mess)) # 需要发送的消息
w.CloseClipboard()
time.sleep(1)
win32gui.SendMessage(handle, 770, 0, 0)
if result.startswith('@'):
# 睡1s模拟人工@方式
time.sleep(1)
win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
time.sleep(1)
win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)