通过Python利用saltstack进行生成服务器资产清单

简介:

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

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

    

    saltstack快速入门,可参考:http://youerning.blog.51cto.com/10513771/1708964

    

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

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

wKioL1bUA0vyz7jLAAAyER8kKtQ523.png spacer.gif

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

获取主机名

1
salt H-T-4 grains.item host

获取IP地址

1
salt zabbix grains.item ipv4

获取CPU核数

1
salt \* grains.item num_cpus

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

     

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

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

  wKioL1bUA6qDqgZaAABQAUvjze8699.png

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

    

最终脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#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  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  in  app_name:
             if  in  hostname.lower():
                 app  =   j
                 break
             else :
                 app  =  "undefined"
         =  ","
         
         ###连接并写入
         line  =  hostname  +  +  ipv4  +  +  str (mem)  +  +  str (num_cpu)  +  +  str (OS)  +  +  str (disk_data)  +  +  project  +  +  app
         ret_file.write(line  +  "\n" )
except  Exception,e:
     print  "Exception:\n" ,e
finally :
     ret_file.close()

用记事本打开应该是这样

wKiom1bUBSLCcFkDAAFuacqW6Ao882.png

用Excel打开应该是这样

wKioL1bUBaaQ9w7xAADq1H32mGk828.png


本文转自 youerning 51CTO博客,原文链接:http://blog.51cto.com/youerning/1746075

相关文章
|
15天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
1月前
|
Linux 网络安全 Python
如何在服务器上运行python文件
如何在服务器上运行python文件
|
3天前
|
Linux 网络安全 开发工具
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
10 0
|
19天前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。
|
1月前
|
Linux Docker Python
如何将本地的python项目部署到linux服务器中
如何将本地的python项目部署到linux服务器中
95 1
|
1月前
|
机器学习/深度学习 Python
Python基础:构建一个简单的Web服务器
Python基础:构建一个简单的Web服务器
57 1
|
3月前
|
Python
用 Python 实现一个简单的 Web 服务器
用 Python 实现一个简单的 Web 服务器
144 1