新钛云服已为您服务1060天
在日常运维中,当你遇到每天邮件发出当天服务器的监控状态等这些类似需求时,你还在每天下午快下班的时候打开zabbix截图、发邮件......日复一日的手动处理吗?如果是,这篇干货将为您解放双手。
文档说明
本文档主要介绍利用python脚本,指定主机名,自动获取zabbix监控图,下载到本地,形成word文档。
总体思路:先通过zabbix API获取auth;通过主机名获取host ID;通过host ID获取graph ID;再利用爬虫代码将图片下载到本地;通过python的docx 模块插入至word文档(本文zabbix的版本是5.0,python是3.8)。
一、自动获取zabbix监控图保存至本地
首先,获取zabbix的auth ID,通过zabbix API获取主机id,graph ID等信息。打印出auth ID之后,保存下来,之后获取host ID需要用到:
#获取authkey
ZABBIX_URL = 'https://www.zabbix.cn'
ZABBIX_USERNAME = "user"
ZABBIX_PASSWORD = "password"
url = "{}/api_jsonrpc.php".format(ZABBIX_URL)
header = {"Content-Type": "application/json"}
# auth user and password
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": ZABBIX_USERNAME,
"password": ZABBIX_PASSWORD
},
"id": 1,
}
# 由于API接收的是json字符串,故需要转化一下
value = json.dumps(data).encode('utf-8')
# 对请求进行包装
req = request.Request(url, headers=header, data=value)
# 验证并获取Auth ID
try:
# 打开包装过的url
result = request.urlopen(req)
except Exception as e:
print("Auth Failed, Please Check Your Name And Password:", e)
else:
response = result.read()
# 上面获取的是bytes类型数据,故需要decode转化成字符串
page = response.decode('utf-8')
# 将此json字符串转化为python字典
page = json.loads(page)
result.close()
print("Auth Successful. The Auth ID Is: {}".format(page.get('result')))
变量hostname即是需要查询的主机名,通过主机名查询到host ID。当然也可以使用input函数做交互,实现动态查询。
#获取hostid
data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"auth": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX", #这里的auth的值就是上文获取到的auth
"id": 2
}
r = requests.post(url, headers=header, data=json.dumps(data))
hostname = abc123
with open(hostname_txt,'r') as f:
tmp_list = [x.strip("\n") for x in f.readlines()]
for hostname in tmp_list:
if r.json().get('result'):
for i in r.json()['result']:
if i['host'] == hostname:
hostids = i['hostid']
使用host ID查询到graph ID,并保存到本地;
value传入的值,from和to这两个key决定了获取监控图的监控时间段,本例设置的是一个月;
v