A-A+

运维开发:使用ansible setup模块获取服务器硬件、软件信息

2016年01月21日 自动化运维 评论 9 条 阅读 22,691 views 次

开发CMDB,除了要记录服务器的帐号密码之外,还需要记录服务器硬件和软件的一些信息,如果使用人工记录,如果服务器量大的话,那工作量就比较大了,所以,我需要能自动获取这些信息的方法,我采用了ansible来获取,ansible自带了setup模块,可以获取到服务器的这些信息,然后再从这些信息里筛选出我需要的信息,入库即可。

我大概需要以下几个信息:

物理内存容量

虚拟内容容量

CPU型号

CPU核心数

操作系统类型

硬盘总容量

硬盘挂载名及容量

服务器型号

服务器主机名

操作系统内核型号

服务器ipv4地址

 

我在运维工具中,整合了这个自动获取信息的功能,只需要鼠标点一下“更新”,就会去获取信息了,然后把这些信息写入数据库。前端模板展示:

运维开发:CDMB前端模板

运维开发:CDMB前端模板

 

更新成功之后(获取到的这些信息,前端暂末显示,后期我在“详情”按钮点击后进行展示):

运维开发:CMDB前端更新成功

运维开发:CMDB前端更新成功

 

看下数据库获取到的信息:

  1. mysql> select * from yw_device \G;
  2. *************************** 1. row ***************************
  3.          id: 1
  4.        name: APP2
  5.        line: 电信
  6.         wip: 192.168.1.6
  7.         nip: 192.168.1.6
  8.    username: root
  9.    password: xxxxxxxx
  10.        port: 22
  11.    key_path:
  12.     room_id: 1
  13.     type_id: 1
  14.      status: 0
  15.   mem_total: 32058
  16.  swap_total: 4095
  17.    cpu_type: Intel(R) Xeon(R) CPU E5-2407 v2 @ 2.40GHz
  18.   cpu_total: 4
  19.     os_type: CentOS 6.4
  20.  disk_total: 1820
  21.  disk_mount: [{'mount': '/', 'size': 1917}, {'mount': '/boot', 'size': 0}, {'mount': '/home/postgres/archive', 'size': 1917}]
  22. server_type: PowerEdge R420
  23.   host_name: dywl
  24.   os_kernel: 2.6.32-504.12.2.el6.x86_64
  25.        ipv4: ['192.168.1.6', '192.168.1.9', '192.168.1.12', '10.8.0.1']
  26. *************************** 2. row ***************************

 

点击详细看到的内容:

CMDB硬件信息详情

CMDB硬件信息详情

 

原理:

前端点击“更新”后,用ajax方法,把该服务器的IP,帐号,密码,端口用post方式访问我的/api/getmachineinfo/接口,这个接口收到请求后,拿这些服务器信息调用ansible api,然后再从ansible返回来的信息中进行获取要的信息,然后写入数据库,再返回“操作成功”信息。

 

前端相关的HTML代码:

  1. '<a href="#" onclick="refresh(\'' + row['id'] + '\')" class="btn-sm">',
  2.     '<i class="fa fa-refresh"> 更新</i>',
  3. '</a>'

 

前端相关的ajax代码

  1. function refresh(id){
  2.      var data = $('#myLoadTable').bootstrapTable('getRowByUniqueId',id);
  3.      $.ajax({
  4.         type: 'post',
  5.         dataType: 'json',
  6.         url:"/api/getmachineinfo/",
  7.         //提交的数据
  8.         data:{
  9.           "username":data['username'],
  10.           "password":data['password'],
  11.           "wip":data['wip'],
  12.           "port":data['port'],
  13.           "key_path":data['key_path']
  14.         },
  15.         //
  16.         beforeSend:function(){
  17.           layer.load(1, {
  18.               shade: [0.1,'#222'] //0.1透明度的白色背景
  19.           });
  20.         },
  21.         //成功返回之后调用的函数
  22.         success:function(data){
  23.           var message = data['resmsg'];
  24.           if (data['resid'] == '0') {
  25.             //刷新数据
  26.             layer.msg(message, {icon: 1, time: 1000});
  27.           } else {
  28.             layer.msg(message, {icon: 2, time: 1500});
  29.           }
  30.         },
  31.         //调用执行后调用的函数
  32.         complete: function(){
  33.           layer.closeAll('loading');
  34.         }
  35.      });
  36.   }

 

后端代码(/api/getmachineinfo/)

  1. #!/usr/bin/evn python
  2. # coding=utf-8
  3. __author__ = '戴儒锋'
  4. import logging
  5. from bottle import post
  6. from controller.core import ansible_api, reMsg, checkArgs
  7. from controller.db import writeDb
  8. @post('/api/getmachineinfo/')
  9. def callback():
  10.     """
  11.     用ansible的setup模块获取服务器相关的信息,如硬件信息,操作系统信息等
  12.     """
  13.     r_ip = checkArgs("wip", "公网IP")
  14.     r_user = checkArgs("username", "服务器帐号")
  15.     r_pass = checkArgs("password", "服务器密码")
  16.     r_port = checkArgs("port", "远程端口")
  17.     key_path = checkArgs("key_path", "服务器密钥", False)
  18.     r_name = "setup"  # 使用ansible的模块名
  19.     r_argv = ""  # 传递给ansible api的命令参数,因为这里用setup,不需给setup传递参数了
  20.     # 调用ansible api去远程获取数据
  21.     data = ansible_api(r_name, r_argv, r_ip, r_user, r_pass, r_port, key_path, forks_num=1)
  22.     try:
  23.         data = data["ansible_facts"]
  24.     except Exception, e:
  25.         logging.error('ansible setup模块获取数据失败:%s' % e)
  26.         return reMsg(-1, "远程服务器获取信息失败")
  27.     # 物理内存容量
  28.     try:
  29.         mem_total = data["ansible_memtotal_mb"]
  30.     except Exception, e:
  31.         logging.error('ansible setup模块获取物理内存容量数据失败:%s' % e)
  32.         mem_total = 0
  33.     # 虚拟内容容量
  34.     try:
  35.         swap_total = data["ansible_memory_mb"]["swap"]["total"]
  36.     except Exception, e:
  37.         logging.error('ansible setup模块获取虚拟内容容量数据失败:%s' % e)
  38.         swap_total = 0
  39.     # CPU型号
  40.     try:
  41.         cpu_type = data["ansible_processor"][-1]
  42.     except Exception, e:
  43.         logging.error('ansible setup模块获取CPU型号数据失败:%s' % e)
  44.         cpu_type = "未知"
  45.     # CPU核心数
  46.     try:
  47.         cpu_total = data["ansible_processor_vcpus"]
  48.     except Exception, e:
  49.         logging.error('ansible setup模块获取CPU核心数数据失败:%s' % e)
  50.         cpu_total = 0
  51.     # 操作系统类型
  52.     try:
  53.         os_type = " ".join((data["ansible_distribution"], data["ansible_distribution_version"]))
  54.     except Exception, e:
  55.         logging.error('ansible setup模块获取操作系统类型数据失败:%s' % e)
  56.         os_type = "未知"
  57.     # 硬盘总容量
  58.     try:
  59.         disk_total = sum([int(data["ansible_devices"][i]["sectors"]) * \
  60.                           int(data["ansible_devices"][i]["sectorsize"]) / 1024 / 1024 / 1024 \
  61.                           for i in data["ansible_devices"] if i[0:2] in ("sd", "ss")])
  62.     except Exception, e:
  63.         logging.error('ansible setup模块获取硬盘总容量数据失败:%s' % e)
  64.         disk_total = 0
  65.     # 硬盘挂载名及容量
  66.     try:
  67.         disk_mount = str(
  68.             [{"mount": i["mount"], "size": i["size_total"] / 1024 / 1024 / 1024} for i in data["ansible_mounts"]])
  69.     except Exception, e:
  70.         logging.error('ansible setup模块获取硬盘挂载名及容量数据失败:%s' % e)
  71.         disk_mount = "未知"
  72.     # 服务器型号
  73.     try:
  74.         server_type = data["ansible_product_name"]
  75.     except Exception, e:
  76.         logging.error('ansible setup模块获取服务器型号数据失败:%s' % e)
  77.         server_type = "未知"
  78.     # 服务器主机名
  79.     try:
  80.         host_name = data["ansible_hostname"]
  81.     except Exception, e:
  82.         logging.error('ansible setup模块获取服务器主机名数据失败:%s' % e)
  83.         host_name = "未知"
  84.     # 操作系统内核型号
  85.     try:
  86.         os_kernel = data["ansible_kernel"]
  87.     except Exception, e:
  88.         logging.error('ansible setup模块获取操作系统内核型号数据失败:%s' % e)
  89.         os_kernel = "未知"
  90.     # 服务器ipv4地址
  91.     try:
  92.         ipv4 = str(data["ansible_all_ipv4_addresses"])
  93.     except Exception, e:
  94.         logging.error('ansible setup模块获取服务器ipv4地址数据失败:%s' % e)
  95.         ipv4 = "未知"
  96.     # 更新数据库
  97.     sql = "UPDATE yw_device SET mem_total=%s,swap_total=%s,cpu_type=%s,cpu_total=%s,os_type=%s,disk_total=%s,disk_mount=%s,\
  98.           server_type=%s,host_name=%s,os_kernel=%s,ipv4=%s WHERE wip=%s"
  99.     data = (
  100.         mem_total, swap_total, cpu_type, cpu_total, os_type, disk_total, disk_mount, server_type, host_name, os_kernel,
  101.         ipv4, r_ip)
  102.     result = writeDb(sql, data)
  103.     # 判断操作数据库是否成功,并返回信息
  104.     if result:
  105.         return reMsg(0, "更新成功")
  106.     return reMsg(-1, "更新失败")

 

 

9 条留言  访客:7 条  博主:2 条

  1. avatar 123

    纠正一下获取磁盘总容量那里 直接size获取就好!

  2. avatar Peter

    求一份代码。

  3. avatar carson

    博主问一下这个项目开源吗

    • avatar 戴儒锋

      这个就是写着玩的项目,无所谓开不开源哈

  4. avatar Carson

    博主能提供一下github地址吗

  5. avatar Alex

    老戴牛逼啊。

  6. avatar BB保你大

    博主可以麻烦一下做个requirements.txt文件,有些找不到的模块,可以提供下地址吗?

  7. avatar 技术一流

    看了这篇文章,有种莫名的激动!感谢博主的指引~ 应该可以参照写个读日志、分析日志、入库的日志分析系统

给我留言

Copyright © linux系统运维 保留所有权利.   Theme  Ality 粤ICP备13023035号-1

用户登录

分享到: