资产管理 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的服务器信息

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

方法、套路有很多:

  1. 写成脚本用crontab定期执行,脚本读取IP列表文件将信息存入数据库(借鉴燕郊大神春哥)
  2. 通过运维平台主动调用脚本写入数据库(借鉴老司机戴总[戴如峰])

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

运维平台展示服务器信息

原理:

点击更新按钮之后触发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命令,

获取信息存入数据库

时间: 2024-10-03 22:16:38

资产管理 cmdb之ansible 获取服务器硬件、软件等信息的相关文章

android获取当前软件版本号号和版本号名称

<span style="font-size:18px;">/** * 获取本地软件版本号 */ public static int getLocalVersion(Context ctx) { int localVersion = 0; try { PackageInfo packageInfo = ctx.getApplicationContext() .getPackageManager() .getPackageInfo(ctx.getPackageName(),

Android开发之获取所有软件信息

程序运行效果图: 程序代码: /** * 获取所有软件信息 * 1.通过异步的方式显示系统中所有软件 * 2.单击打开指定软件 * 3.将所有软件的包名和activity名保存的本地SharedPreferences * @author jph * Date:2014.09.21 */ public class ScanPackage1 extends Activity { /**扫描成功**/ private final static int FLAG_LOAD_SUCCESS=0x10001

android获取当前软件版本号和版本名称

<span style="font-size:18px;">/** * 获取本地软件版本 */ public static int getLocalVersion(Context ctx) { int localVersion = 0; try { PackageInfo packageInfo = ctx.getApplicationContext() .getPackageManager() .getPackageInfo(ctx.getPackageName(), 0

Android_获取手机各种详细信息

TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取相关数据. TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法来获得,需要注意的是有些通讯信息的获取对应用程序的权限有一定的限制,在开发的时候需要为其添加相应的权限. 以下列出TelephonyM

如何在跨平台的情况下获取可执行文件的详细信息和属性

很多情况下我们需要获取到系统中一些可执行文件的版本号,以便做一些附加动作!其实可以使用jna获取,但是这将依赖人家,所以还是Java自己来吧!好啦,直接上代码吧 /** * @Description: * * @Title: FileInfoUtil.java * @Package com.joyce.util * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-5-12 下午03:46:32 * @versi

C# 获取操作系统相关的信息

本文通过一个Demo,讲解如何通过C#获取操作系统相关的信息,如内存大小,CPU大小,机器名,环境变量等操作系统软件.硬件相关信息. 涉及到知识点: Environment 提供有关当前环境和平台的信息以及操作它们的方法. ManagementClass 表示公共信息模型 (CIM) 管理类.管理类是一个 WMI 类,如 Win32_LogicalDisk 和 Win32_Process,前者表示磁盘驱动器,后者表示进程(如 Notepad.exe).通过该类的成员,可以使用特定的 WMI 类路

Windows批处理:自动开启远程桌面,并获取登录所需信息

公司办公场地分别在两个不同的楼层,处理问题要来回跑,所以思考使用远程访问的方式解决问题.同事大多对电脑不熟悉,使用「通讯软件」和「电话」教同事开启远程桌面沟通成本挺高,另外公司IP地址.账号密码都没统一管理,使用远程桌面的前提:①开启远程 ②获取IP地址 ③获取用户名密码.经过一番思考,发现使用批处理解决这些问题并不复杂. 当同事遇到问题时:我通过「通讯软件」将脚本发送给同事 > 同事执行 > 我使用远程桌面操作. 脚本先开启远程桌面服务,接下来获取当前用户名.让用户输入密码.获取IP,这些信

C#获取当前主机硬件信息

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; using System.Net;using System.Management;  //在项目->添加引用....里面引用System.Managementusing System.Runtime.InteropServices; namespace FileSplit{

Android开发之获取手机SIM卡信息

TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设备上的电话服务信息. 应用程序能够使用这个类的方法来确定电话服务和状态,以及訪问某些类型的用户信息.应用程序还能够注冊一个侦听器以接收的电话状态变化通知. 你不能直接实例化这个类;相反,你能够通过Context.getSystemService(Context.TELEPHONY_SERVICE)方