A-A+
运维开发:使用ansible setup模块获取服务器硬件、软件信息
开发CMDB,除了要记录服务器的帐号密码之外,还需要记录服务器硬件和软件的一些信息,如果使用人工记录,如果服务器量大的话,那工作量就比较大了,所以,我需要能自动获取这些信息的方法,我采用了ansible来获取,ansible自带了setup模块,可以获取到服务器的这些信息,然后再从这些信息里筛选出我需要的信息,入库即可。
我大概需要以下几个信息:
物理内存容量
虚拟内容容量
CPU型号
CPU核心数
操作系统类型
硬盘总容量
硬盘挂载名及容量
服务器型号
服务器主机名
操作系统内核型号
服务器ipv4地址
我在运维工具中,整合了这个自动获取信息的功能,只需要鼠标点一下“更新”,就会去获取信息了,然后把这些信息写入数据库。前端模板展示:
更新成功之后(获取到的这些信息,前端暂末显示,后期我在“详情”按钮点击后进行展示):
看下数据库获取到的信息:
- mysql> select * from yw_device \G;
- *************************** 1. row ***************************
- id: 1
- name: APP2
- line: 电信
- wip: 192.168.1.6
- nip: 192.168.1.6
- username: root
- password: xxxxxxxx
- port: 22
- key_path:
- room_id: 1
- type_id: 1
- status: 0
- mem_total: 32058
- swap_total: 4095
- cpu_type: Intel(R) Xeon(R) CPU E5-2407 v2 @ 2.40GHz
- cpu_total: 4
- os_type: CentOS 6.4
- disk_total: 1820
- disk_mount: [{'mount': '/', 'size': 1917}, {'mount': '/boot', 'size': 0}, {'mount': '/home/postgres/archive', 'size': 1917}]
- server_type: PowerEdge R420
- host_name: dywl
- os_kernel: 2.6.32-504.12.2.el6.x86_64
- ipv4: ['192.168.1.6', '192.168.1.9', '192.168.1.12', '10.8.0.1']
- *************************** 2. row ***************************
点击详细看到的内容:
原理:
前端点击“更新”后,用ajax方法,把该服务器的IP,帐号,密码,端口用post方式访问我的/api/getmachineinfo/接口,这个接口收到请求后,拿这些服务器信息调用ansible api,然后再从ansible返回来的信息中进行获取要的信息,然后写入数据库,再返回“操作成功”信息。
前端相关的HTML代码:
- '<a href="#" onclick="refresh(\'' + row['id'] + '\')" class="btn-sm">',
- '<i class="fa fa-refresh"> 更新</i>',
- '</a>'
前端相关的ajax代码
- function refresh(id){
- var data = $('#myLoadTable').bootstrapTable('getRowByUniqueId',id);
- $.ajax({
- type: 'post',
- dataType: 'json',
- url:"/api/getmachineinfo/",
- //提交的数据
- data:{
- "username":data['username'],
- "password":data['password'],
- "wip":data['wip'],
- "port":data['port'],
- "key_path":data['key_path']
- },
- //
- beforeSend:function(){
- layer.load(1, {
- shade: [0.1,'#222'] //0.1透明度的白色背景
- });
- },
- //成功返回之后调用的函数
- success:function(data){
- var message = data['resmsg'];
- if (data['resid'] == '0') {
- //刷新数据
- layer.msg(message, {icon: 1, time: 1000});
- } else {
- layer.msg(message, {icon: 2, time: 1500});
- }
- },
- //调用执行后调用的函数
- complete: function(){
- layer.closeAll('loading');
- }
- });
- }
后端代码(/api/getmachineinfo/)
- #!/usr/bin/evn python
- # coding=utf-8
- __author__ = '戴儒锋'
- import logging
- from bottle import post
- from controller.core import ansible_api, reMsg, checkArgs
- from controller.db import writeDb
- @post('/api/getmachineinfo/')
- def callback():
- """
- 用ansible的setup模块获取服务器相关的信息,如硬件信息,操作系统信息等
- """
- r_ip = checkArgs("wip", "公网IP")
- r_user = checkArgs("username", "服务器帐号")
- r_pass = checkArgs("password", "服务器密码")
- r_port = checkArgs("port", "远程端口")
- key_path = checkArgs("key_path", "服务器密钥", False)
- r_name = "setup" # 使用ansible的模块名
- r_argv = "" # 传递给ansible api的命令参数,因为这里用setup,不需给setup传递参数了
- # 调用ansible api去远程获取数据
- data = ansible_api(r_name, r_argv, r_ip, r_user, r_pass, r_port, key_path, forks_num=1)
- try:
- data = data["ansible_facts"]
- except Exception, e:
- logging.error('ansible setup模块获取数据失败:%s' % e)
- return reMsg(-1, "远程服务器获取信息失败")
- # 物理内存容量
- try:
- mem_total = data["ansible_memtotal_mb"]
- except Exception, e:
- logging.error('ansible setup模块获取物理内存容量数据失败:%s' % e)
- mem_total = 0
- # 虚拟内容容量
- try:
- swap_total = data["ansible_memory_mb"]["swap"]["total"]
- except Exception, e:
- logging.error('ansible setup模块获取虚拟内容容量数据失败:%s' % e)
- swap_total = 0
- # CPU型号
- try:
- cpu_type = data["ansible_processor"][-1]
- except Exception, e:
- logging.error('ansible setup模块获取CPU型号数据失败:%s' % e)
- cpu_type = "未知"
- # CPU核心数
- try:
- cpu_total = data["ansible_processor_vcpus"]
- except Exception, e:
- logging.error('ansible setup模块获取CPU核心数数据失败:%s' % e)
- cpu_total = 0
- # 操作系统类型
- try:
- os_type = " ".join((data["ansible_distribution"], data["ansible_distribution_version"]))
- except Exception, e:
- logging.error('ansible setup模块获取操作系统类型数据失败:%s' % e)
- os_type = "未知"
- # 硬盘总容量
- try:
- disk_total = sum([int(data["ansible_devices"][i]["sectors"]) * \
- int(data["ansible_devices"][i]["sectorsize"]) / 1024 / 1024 / 1024 \
- for i in data["ansible_devices"] if i[0:2] in ("sd", "ss")])
- except Exception, e:
- logging.error('ansible setup模块获取硬盘总容量数据失败:%s' % e)
- disk_total = 0
- # 硬盘挂载名及容量
- try:
- disk_mount = str(
- [{"mount": i["mount"], "size": i["size_total"] / 1024 / 1024 / 1024} for i in data["ansible_mounts"]])
- except Exception, e:
- logging.error('ansible setup模块获取硬盘挂载名及容量数据失败:%s' % e)
- disk_mount = "未知"
- # 服务器型号
- try:
- server_type = data["ansible_product_name"]
- except Exception, e:
- logging.error('ansible setup模块获取服务器型号数据失败:%s' % e)
- server_type = "未知"
- # 服务器主机名
- try:
- host_name = data["ansible_hostname"]
- except Exception, e:
- logging.error('ansible setup模块获取服务器主机名数据失败:%s' % e)
- host_name = "未知"
- # 操作系统内核型号
- try:
- os_kernel = data["ansible_kernel"]
- except Exception, e:
- logging.error('ansible setup模块获取操作系统内核型号数据失败:%s' % e)
- os_kernel = "未知"
- # 服务器ipv4地址
- try:
- ipv4 = str(data["ansible_all_ipv4_addresses"])
- except Exception, e:
- logging.error('ansible setup模块获取服务器ipv4地址数据失败:%s' % e)
- ipv4 = "未知"
- # 更新数据库
- 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,\
- server_type=%s,host_name=%s,os_kernel=%s,ipv4=%s WHERE wip=%s"
- data = (
- mem_total, swap_total, cpu_type, cpu_total, os_type, disk_total, disk_mount, server_type, host_name, os_kernel,
- ipv4, r_ip)
- result = writeDb(sql, data)
- # 判断操作数据库是否成功,并返回信息
- if result:
- return reMsg(0, "更新成功")
- return reMsg(-1, "更新失败")
纠正一下获取磁盘总容量那里 直接size获取就好!
求一份代码。
博主问一下这个项目开源吗
这个就是写着玩的项目,无所谓开不开源哈
博主能提供一下github地址吗
没啊
老戴牛逼啊。
博主可以麻烦一下做个requirements.txt文件,有些找不到的模块,可以提供下地址吗?
看了这篇文章,有种莫名的激动!感谢博主的指引~ 应该可以参照写个读日志、分析日志、入库的日志分析系统