通过Python使用saltstack生成服务器资产清单


Posted in Python onMarch 01, 2016

SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func。SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。

通过部署SaltStack环境,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。

前言:人工去对每一台服务器的硬件信息并记录早已经过去了,无论通过脚本还是自动化工具都是可以进行一次编写到处抓取的,本文主要使用saltstack作为使用工具,然后利用其提供的APi编写所需的Python脚本~~

需求如下:生成服务器主机名,IP地址,内存,CPU核数,操作系统,数据盘配额,主要运行服务

saltstack快速入门,可参考:Saltstack快速入门简单汇总

这里主要用到saltstack的grains,就是saltstack minion端生成的一些静态信息,比如CPU,内存,主机名什么的,而这些就是我们所需要的

执行salt \* grains.items,会打印一大堆的默认抓取的信息,其中一部分,如下

通过Python使用saltstack生成服务器资产清单

我们当然只挑我们需要的,操作如下

获取主机名

salt H-T-4 grains.item host

获取IP地址

salt zabbix grains.item ipv4

获取CPU核数

salt \* grains.item num_cpus

以此类推,根据自己所需,提取~~~

值得注意的是,grains信息里面并没有硬盘信息,所以还需通过disk.usage这个选项,得到我们所需的硬盘信息

执行salt zabbix disk.usage,得到结果如下

通过Python使用saltstack生成服务器资产清单

其中1K-blocks即我们所需的硬盘信息,根据需求只需要数据盘/data,所以后面就会计算这个盘的配额

最终脚本如下

#coding=utf-8
import salt.client as sc
import json
###salt调用
local = sc.LocalClient()
###目标主机指定
tgt = "*"
###获取grains,disk信息
grains = local.cmd(tgt,"grains.items")
diskusage = local.cmd(tgt,"disk.usage")
###主要应用列表即文件开头
app_name = ["tomcat","zookeeper","redis","mysql","nginx"]
cols = "主机名,IP地址,内存(GB),CPU核数,操作系统,数据盘/data(GB),所属项目,主要应用"
###打开一个.csv文件,以便写入
ret_file = open("ret.csv","w")
###首先写入开头,有点字段名的意思
ret_file.write(cols + "\n")
try:
for i in grains.keys():
###打印信息可注释掉
print grains[i]["nodename"]
print "ipv4" + ":" ,grains[i]["ipv4"]
print "mem_total" + ":" , grains[i]["mem_total"] / 1024 + 1
print "num_cpus" + ":" , grains[i]["num_cpus"]
print "osfullname" + ":" , grains[i]["osfullname"]
print "release" + ":" , grains[i]["lsb_distrib_release"]
###可能一些主机没有/data数据盘1048576是1024x1024
if "/data" not in diskusage[i]:
print "diskusage" + ":" + "have no /data disk"
else:
data_vol = int(diskusage[i]["/data"]["1K-blocks"])
print "diskusage" + ":" , data_vol / 1048576 
###去掉127.0.0.1这个地址
ipv4 = str(grains[i]["ipv4"]).replace(", '127.0.0.1'","")
###因为一些历史遗留问题,这里取得不是主机名,而是salt-minion的id名,用以判断主要应用
hostname = grains[i]["id"]
ipv4 = str(grains[i]["ipv4"]).replace(", '127.0.0.1'","")
ipv4 = ipv4.replace(",","and")
mem = grains[i]["mem_total"] / 1024 + 1
num_cpu = grains[i]["num_cpus"]
OS = grains[i]["osfullname"] + grains[i]["lsb_distrib_release"]
if "/data" not in diskusage[i]:
disk_data = "None"
else:
disk_data = data_vol / 1048576
###项目名为空
project = ""
###通过minion ID名来判断主要运行服务,比如xx-mysql-1,则运行mysql
for j in app_name:
if j in hostname.lower():
app = j
break
else:
app = "undefined"
c = ","
###连接并写入
line = hostname + c + ipv4 + c + str(mem) + c + str(num_cpu) + c + str(OS) + c + str(disk_data) + c + project + c + app
ret_file.write(line + "\n")
except Exception,e:
print "Exception:\n",e
finally:
ret_file.close()

用记事本打开应该是这样

通过Python使用saltstack生成服务器资产清单

以上内容是小编给大家介绍的通过Python使用saltstack生成服务器资产清单的全部叙述,希望对大家有所帮助!

Python 相关文章推荐
python获取beautifulphoto随机某图片代码实例
Dec 18 Python
EM算法的python实现的方法步骤
Jan 02 Python
简述Python2与Python3的不同点
Jan 21 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
对Python函数设计规范详解
Jul 19 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
python实现数字炸弹游戏程序
Jul 17 Python
python 调整图片亮度的示例
Dec 03 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 Python
Python 数据可视化工具 Pyecharts 安装及应用
Apr 20 Python
Python解析json文件相关知识学习
Mar 01 #Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 #Python
Python文件处理
Feb 29 #Python
python 默认参数问题的陷阱
Feb 29 #Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 #Python
Python中time模块和datetime模块的用法示例
Feb 28 #Python
python 写的一个爬虫程序源码
Feb 28 #Python
You might like
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
vue中axios处理http发送请求的示例(Post和get)
2017/10/13 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
十分钟教你上手ES2020新特性
2020/02/12 Javascript
用JS实现选项卡
2020/03/23 Javascript
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
Python决策树分类算法学习
2017/12/22 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
使用python绘制温度变化雷达图
2019/10/18 Python
快速查找Python安装路径方法
2020/02/06 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
欧尚俄罗斯网上超市:Auchan俄罗斯
2018/05/03 全球购物
积极分子思想汇报
2014/01/04 职场文书
中学生运动会入场词
2014/02/12 职场文书
经典商业广告词
2014/03/13 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
英语教育专业自荐信
2014/05/29 职场文书
医院保洁服务方案
2014/06/11 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
教导主任个人总结
2015/03/03 职场文书