资产管理 cmdb之ansible 获取服务器硬件、软件等信息
cmdb抓取服务信息的方式有很多种,可以使用自动化工具saltstack、ansible、puppet,或者使用其它模块直接ssh远程连接抓取服务器信息。这里记录一下用ansible的API接口调用setup模块抓取。
实验使用两台机器
| IP | 系统 | 软件 | 
| 192.168.93.137 | centos6.5_x64 | ansible 1.9.4 | 
| 192.168.93.128 | centos6.5_x64 | 无 | 
两台机器建立好ssh信任后在192.168.93.137上执行
ansible 192.168.93.128 -m setup

几乎可以获取到所有想要的信息,直接处理这些字符串很让人想砸电脑,调用ansible的API接口就方便多了,其实就是用ansible的runner模块调用setup模块来获取结果,返回的是dict字典,处理起来就方便多了。(注意:ansible1.x版本有runner模块,ansible2.x以上就没有runner接口模块,需要看官网)

将其封装成函数保存为test.py,(此处封装借鉴的一位高手,可惜忘了博客地址)
里面的参数根据各自的系统可适当修改
# -*- coding: UTF-8 -*- import ansible.runner def get_info(ip):
data = {}
runner = ansible.runner.Runner(module_name='setup', module_args='', pattern='all', forks=2)
datastructure = runner.run()
sn = datastructure['contacted'][ip]['ansible_facts']['ansible_product_serial']
host_name = datastructure['contacted'][ip]['ansible_facts']['ansible_hostname'] description = datastructure['contacted'][ip]['ansible_facts']['ansible_lsb']['description']
ansible_machine = datastructure['contacted'][ip]['ansible_facts']['ansible_machine']
sysinfo = '%s %s' % (description, ansible_machine) os_kernel = datastructure['contacted'][ip]['ansible_facts']['ansible_kernel'] cpu = datastructure['contacted'][ip]['ansible_facts']['ansible_processor'][1]
cpu_count = datastructure['contacted'][ip]['ansible_facts']['ansible_processor_count']
cpu_cores = datastructure['contacted'][ip]['ansible_facts']['ansible_processor_cores']
mem = datastructure['contacted'][ip]['ansible_facts']['ansible_memtotal_mb'] ipadd_in = datastructure['contacted'][ip]['ansible_facts']['ansible_all_ipv4_addresses'][0]
disk = datastructure['contacted'][ip]['ansible_facts']['ansible_devices']['sda']['size']
# print sysinfo
data['sn'] = sn
data['sysinfo'] = sysinfo
data['cpu'] = cpu
data['cpu_count'] = cpu_count
data['cpu_cores'] = cpu_cores
data['mem'] = mem
data['disk'] = disk
data['ipadd_in'] = ipadd_in
data['os_kernel'] = os_kernel
data['host_name'] = host_name return data if __name__ == '__main__':
data = get_info('') import pprint
pprint.pprint(data)
在192.168.93.137上执行test.py获取192.168.93.128的服务器信息

接着就是结合资产管理平台存入数据库中了
方法、套路有很多:
写成脚本用crontab定期执行,脚本读取IP列表文件将信息存入数据库(借鉴燕郊大神春哥)
通过运维平台主动调用脚本写入数据库(借鉴老司机戴总[戴如峰])
此处用第二种,点击“更新”按钮,获取到服务器信息后写入数据库

运维平台展示服务器信息

原理:
点击更新按钮之后触发ajax,然后将服务器的id号以post方式提交给“/cmdb/postmachineinfo/”接口,此id是服务器在数据库表中的id号,
运维平台接口收到请求后拿该id号去数据库中查询服务器的ip,再调用封装有
ansible API接口的脚本查询服务器信息,然后写入数据库,最后给前端返回
“成功”的信息。
前端更新按钮:
<button type="button" id="server_update_{{server.id}}" class="btn btn-xs btn-primary">更新</button>

按钮的id值最后一位就是192.168.93.128在数据库表中的id号

ajax提交信息到“/cmdb/postmachineinfo/”
/*
*更新机器信息
*/
$("table tbody tr td button[id^='server_update']").click(function(){
var id_val = $(this).attr('id'); //获取更新按钮id值
var id = id_val.split('_')[2]; //获取id值的最后一位
var data = {"id":id};
data = JSON.stringify(data);
var url = "/cmdb/postmachineinfo/"; $.get(url,{data:data},function(msg){
ajax_callback(msg);
});
}); /*
*ajax get callback
*/
function ajax_callback(msg){
var msg = $.parseJSON(msg);
var index = layer.alert(msg, { //layer控件提示信息
skin: 'layui-layer-molv' //样式类名
},function(){
if (msg == '成功'){
window.location="/cmdb/server_list/";
}
else{
layer.close(index)
}
});
}
后端接口“/cmdb/postmachineinfo/”
@login_required
def postmachineinfo(request):
# 提交服务器信息
response = HttpResponse()
data = json.loads(request.GET.get('data', ''))
id = int(data['id'])
print 'update--->'
server = Server.objects.get(pk=id)
data = get_info(server.in_ip)
server.os_version = data['sysinfo']
server.host_name = data['host_name']
server.os_kernel = data['os_kernel']
server.cpu_model = data['cpu']
server.cpu_count = data['cpu_count']
server.cpu_cores = data['cpu_cores']
server.mem = data['mem']
server.disk = data['disk']
server.status = True
server.max_open_files = get_ulimit(server.in_ip)
server.uptime = get_uptime(server.in_ip)
server.save() # set_service_port(server) # 设置服务端口信息
response.write(json.dumps(u'成功'))
return response
192.168.93.128上的服务和端口信息,原理一样,通过ansible API远程执行netstat -ntpl命令,
获取信息存入数据库

资产管理 cmdb之ansible 获取服务器硬件、软件等信息的更多相关文章
- (部署新java程序,程序报错,需copy的一个包)——java使用siger 获取服务器硬件信息
		
mcat-siger.sh 查看是否安装siger rsync -aPuv /usr/lib64/libsigar-amd64-linux.so $i:/usr/lib64/ java使用siger ...
 - 用python获取服务器硬件信息[转]
		
#!/usr/bin/env python # -*- coding: utf-8 -*- import rlcompleter, readline readline.parse_and_bind(' ...
 - android获取当前软件版本号号和版本号名称
		
<span style="font-size:18px;">/** * 获取本地软件版本号 */ public static int getLocalVersion(C ...
 - dotnet 通过 WMI 获取系统安装软件
		
本文告诉大家如何通过 WMI 获取系统安装的软件,这个方法不能获取全部的软件 通过 Win32_Product 可以获取系统安装的软件 var mc = "Win32_Product&quo ...
 - C# 获取操作系统相关的信息
		
本文通过一个Demo,讲解如何通过C#获取操作系统相关的信息,如内存大小,CPU大小,机器名,环境变量等操作系统软件.硬件相关信息,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点: Envir ...
 - C#获取当前主机硬件信息
		
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
 - Android开发之获取手机SIM卡信息
		
TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设 ...
 - ubuntu下升级特定软件与查看软件版本信息
		
ubuntu 升级软件: sudo apt-get update 更新源 sudo apt-get upgrade 更新已安装的包 sudo apt-get dist-upgrade 升级系统 ubu ...
 - 调用手机在线API获取手机号码归属地信息
		
手机在线(www.showji.com)始创于2001年,发展至今已拥有国内最准确.号段容量最大的手机号码归属地数据库系统, 目前号段容量将近33万条,每月保持两次以上规模数据更新,合作伙伴包括:百度 ...
 
随机推荐
- UIScollView
			
NSArray 类定义的方法 1. makeObjectsPerformSelector:@select(aMethod) 简介:让数组中的每个元素 都调用 aMethod 2. makeO ...
 - Qt的安装和使用中的常见问题(详细版)
			
对于太长不看的朋友,可参考Qt的安装和使用中的常见问题(简略版). 目录 1.引入 2.Qt简介 3.Qt版本 3.1 查看安装的Qt版本 3.2 查看当前项目使用的Qt版本 3.3 查看当前项目使用 ...
 - C语言字符编码处理
			
一.字符编码识别 1.简介 uchardet是一个开源的用于文本编码检测的C语言库,其功能模块是用C++实现的,通过一定数量的字符样本独立的分析出文本的编码,当前已经支持UTF-8/GB13080/B ...
 - Linux之chmod使用
			
Linux文件分三种身份和四中权限. u:文件的拥有者 g:文件所属的群组 o:其他用户 对于每个身份,又有四种权限,分别为: r:读取文件的权限(read) w:写入文件的权限(write) x:执 ...
 - PHP性能之语言性能优化:安装VLD扩展——检测性能
			
使用Linux命令安装 //下载安装包 wget http://pecl.php.net/get/vld-0.14.0.tgz //解压包 tar zxvf vld-0.14.0.tgz //进入编译 ...
 - 使用jedis2.8.0连接redis
			
下载了最新的jedis客户端jedis2.8.0,在网上找了找jedis使用连接池的工具类,拿来发现都是低版本的jedis写法: returnResource(); returnBrokenResou ...
 - iconv用法解读
			
iconv是一个字符集转换函数,原型为: size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, ...
 - swift UITabelVIew - 纯代码自定义tabelViewCell
			
// // CustomTableViewCell.swift // tab // // Created by su on 15/12/7. // Copyright © 2015年 tian ...
 - Java动态代理(二)CGLIB动态代理应用
			
JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口 .如果想代理没有实现接口的类可以使用CGLIB包. CGLI ...
 - (1)-使用json所要用到的jar包下载
			
json是个非常重要的数据结构,在web开发中应用十分广泛.我觉得每个人都应该好好的去研究一下json的底层实现,需要准备下面的六个jar包:commons-lang-1.0.4.jar common ...