本文介绍Python和R从zabbix的API接口取数方法,同时针对运维人员和设备管理人员提供一种通用的获取系统层数据的方法。

python编程与数据分析基础(Python和R获取多台主机硬件配置信息和系统运行监测数据)(1)

数据源与数据接入

一、运行监测数据

获取运行监测数据可以借助一些成熟的监测工具,常见的如Zabbix, Nagios,配置好agent,搜集存储数据,然后直接从数据库取数。如果没有数据库权限,则申请页面查看账号,借助监测工具提供的API取数,可以获取所有主机的监测数据。用Python和R提取zabbix数据,以下为示例脚本,设置定时执行任务即可:

Python - pyzabbix

from pyzabbix.api import ZabbixAPI zapi = ZabbixAPI(url='http://127.0.0.1/zabbix/', user='root', password='root') # 遍历所有的HOSTID,HOST host_item=zapi.host.get(monitored_hosts=1, output='extend') # 获取系统相关监测项 sys_item = zapi.item.get( host=eval(host1), search={ 'key_':'system' # system,vm,vfs,icmp }, output='extend' )

R - RZabbix包

# 加载包 library("RZabbix") url = 'http://127.0.0.1:8088' # 授权 auth <- ZabbixAPI(url, body = list(method = "user.login", params = jsonlite::unbox( data.frame(user = root password = root) ## get_item item_get <- ZabbixAPI(url, body = list(method = "item.get", params = jsonlite::unbox( data.frame( output = "extend", hostids = "host1 sortfield = "name" )), auth = auth))

二、硬件配置信息

获取硬件配置信息的源头是使用命令行得到配置参数。针对1台主机,自不必说。当有20,30台以上设备时,如何配置命令行呢?一种方法是配置Zabbix脚本,分发到各个agent执行返回结果。另一种方法:在Python和R执行shell命令

第一步是要连接主机,这一步用到paramiko模块,通过SSHClient方法,需要提供每台主机的以下信息:

hostname = '192.168.0.158', port = 22, username = 'root', password = 'root'

接下来循环执行shell脚本,把执行结果汇总即可。

import paramiko import pandas as pd # 定义hosts列表 # eg, hosts = pd.DataFrame({'id':0,'hostname':'192.168.56.158','port':22,'username':'root','password':'root'},index=[0]) for i in range(0,20): s = paramiko.SSHClient() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) df = hosts[hosts['id'] == i] # 循环处理 lst = df.values.tolist() s.connect(hostname = lst[0][1], port = lst[0][2], username = lst[0][3], password = lst[0][4]) sshcmd = “cat /proc/cpuinfo | grep 'model name' |uniq'”# 查看CPU型号 stdin, stdout, stderr = s.exec_command(sshcmd) print(stdout.read()) print(stderr.read()) s.close()

R语言则使用system函数,但R脚本只限于当前环境执行。

# 获取CPU使用率,去%号 grep_out0 <- system(paste0("ps -A -o ","%","cpu | awk ","\'","{","s =$1","}"," END ","{","print s","}","\'"),intern = T) # 获取内存使用率,去%号 grep_out3 <- system(paste0("free -m | sed -n ","\'","2p","\'"," | awk ","\'","{","print ","$3/$2","}","\'"),intern = T)

(本文为数据处理阶段,接下来将介绍主机运行评价、主机性能评价等内容。)

,