服务器资产自动收集,资产管理 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

c639b17b908a82a2e2655c33c1fa710a.png

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

b0dec1f044d21bc7a9627fa43c941565.png

将其封装成函数保存为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的服务器信息

c2452af03ddc5153c32fb4e310c7280f.png

接着就是结合资产管理平台存入数据库中了

方法、套路有很多:

写成脚本用crontab定期执行,脚本读取IP列表文件将信息存入数据库(借鉴燕郊大神春哥)

通过运维平台主动调用脚本写入数据库(借鉴老司机戴总[戴如峰])

此处用第二种,点击“更新”按钮,获取到服务器信息后写入数据库

39c4458a012e9e2f9fceb3a5d6569d9c.png

运维平台展示服务器信息

e0303733333caaf13bd4662a525ae5af.png

原理:

点击更新按钮之后触发ajax,然后将服务器的id号以post方式提交给“/cmdb/postmachineinfo/”接口,此id是服务器在数据库表中的id号,

运维平台接口收到请求后拿该id号去数据库中查询服务器的ip,再调用封装有

ansible API接口的脚本查询服务器信息,然后写入数据库,最后给前端返回

“成功”的信息。

前端更新按钮:

更新

17afe983d99479bc5f6701c5d61ff340.png

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

1c9c41ca78de6974a20c70a9ce215907.png

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命令,

获取信息存入数据库

4a9a9b48777f83ed21226b3c9661ef09.png

(部署新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获取当前软件版本号号和版本号名称

/** * 获取本地软件版本号 */ 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万条,每月保持两次以上规模数据更新,合作伙伴包括:百度 ...

随机推荐

WebSocket异常 通常每个套接字地址(协议/网络地址/端口)只允许使用一次

websocket的实例:http://blog.csdn.net/for_cxc/article/details/51500185 问题: 新建一个连接通信没有问题,但是如果关闭再建立就会报错:通常 ...

widows和Linux java加密注意事项

/** * @Title: EncrypAES.java * @Package com.weidinghuo.payment.util * @Description: TODO(用一句话描述该文件做什 ...

使用ssh连接gitHub

github每次pull/push代码时要求推送代码的用户是合法的,所以每次推送时候都要输入账号密码用以验证用户是否为合法用户,而ssh是一种安全的传输模式,可以代替用户的这一"输入账号密码 ...

(原)String类两种实例化的区别

String有两种实例化方式,一种是通过直接赋值的方式,另外一种是使用标准的new调用构造方法完成实例化. public class StringDemo { public static void m ...

为 Macbook 安装 enca 命令

enca 是个查看.转换编码的开源软件, 地址: http://dl.cihar.com/enca/ 安装的步骤比安装 wget 简单多了: 1.用 wget 获取最新的enca 的 tar.gz 的 ...

c#中的委托和事件(转)

引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

初始Hibernate框架技术

hibernate: 定义:ORM:Object Relational Mapping 对象 关系 映射 使用hibernate时几个必要的: 1.实体类 2.映射文件(类  -数据库表,属性-字段) ...

android listview 加载图片错乱(错位)

写道 今天晚上一个朋友介绍我看了一篇文章,也是解决android中listview在加载图片错位的问题,看了之后,感觉写的很好,自己也遇到这个问题,但是又不知道从何下手,看到这篇文章后,我的问题 ...

agile学习

https://www.flickr.com/photos/codingthearchitecture/sets/

SUSE linux升级perl及openssl

一.perl安装: 1.下载并解压软件:tar zxvf perl-5.24.0.tar.gz 2.运行./configure.gnu -help查看帮助,运行./configure.gnu -des ...

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值