|
|
|
|
移动端

2.5.4 Django的配置(4)

《运维前线:一线运维专家的运维方法、技巧与实践》第2章利用Facter和Django快速构建CMDB,本章将会详细讲解,如何利用开源软件Facter和Django快速构建一个小型的CMDB系统。界面与功能不算复杂,这也是它轻量的体现,本章更多的是提供一种思路,以达到抛砖引玉的作用,仅供大家参考。本节为大家介绍Django的配置。

作者:云技术社区来源:机械工业出版社|2017-04-23 12:40

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


2.5.4 Django的配置(4)

我们先来具体看一下facter_message.py程序(Python程序处理Facter数据),完整代码如下:

  1. #!/usr/bin/env python  
  2. # encoding: utf8  
  3. __authors__ = ['liuyu', 'chenlijun']  
  4. __version__ = 1.0  
  5. __date__ = '2015-09-06 14:58:23' 
  6. __licence__ = 'GPL licence' 
  7.  
  8. # 导入模块  
  9. import yaml  
  10. import os  
  11. # IPy主要用来判断IP类型,IPy.IP('ip').iptype()  
  12. import IPy  
  13.  
  14. # yaml文件目录  
  15. yaml_dir = '/var/lib/puppet/yaml/facts' 
  16.  
  17. # 结果集,结果集的格式{'cmdb_agent':()}  
  18. all_host_facter_message = {}  
  19.  
  20. # 结果列表  
  21. result_list = ['name',  
  22.                'SN',  
  23.                'public_ip',  
  24.                'private_ip',  
  25.                'mac',  
  26.                'os',  
  27.                'disk',  
  28.                'mem',  
  29.                'cpu',  
  30.                'idc',  
  31.                'role',  
  32.                'status',  
  33.                'admin',  
  34.                'memo']  
  35.  
  36. # db对应的Facter字段,需要获取其他的字段时可以一一对应  
  37. list_field = {'name': 'fqdn',  
  38.               'public_ip': 'ipaddress__interfaces',  
  39.               'private_ip': 'ipaddress__interfaces',  
  40.               'mac': 'macaddress__interfaces',  
  41.               'os': ['operatingsystem', 'operatingsystemrelease', 'hardwaremodel'],  
  42.               'disk': 'blockdevice__blockdevices',  
  43.               'mem': 'memorysize',  
  44.               'cpu': ['processorcount', 'processor0']}  
  45.  
  46. # ruby objectobjectconstruct  
  47. def construct_ruby_object(loader, suffix, node):  
  48.     return loader.construct_yaml_map(node)  
  49.  
  50. def construct_ruby_sym(loader, node):  
  51.     return loader.construct_yaml_str(node)  
  52.  
  53. # 读取数据  
  54. def yaml_file_handle(filename):  
  55.     stream = open(filename)  
  56.     mydata = yaml.load(stream)  
  57.     return mydata  
  58.  
  59. # 获取IP的类型  
  60. def get_ip_type(ip):  
  61.     try:  
  62.         return IPy.IP(ip).iptype().lower()  
  63.     except Exception, e:  
  64.         print e  
  65.  
  66. # 处理单个Agent的数据  
  67. def handle_facter_message(data):  
  68.     # 定义一个结果字典,字段和db一样,处理完的结果和db中的一样  
  69.     result_dict = {}  
  70.     # 对结果进行处理  
  71.     for db_field in result_list:  
  72.         # 定义一个字段结果字符  
  73.         value = '' 
  74.         # result_list中的字段是否存在于我们需要的Facter取值列表中,如果存在  
  75.         if db_field in list_field:  
  76.             facter_field = list_field[db_field]  
  77.             # 先判断facter_field的类型,然后进行处理  
  78.             if type(facter_field) == type([]):  
  79.                 for tag in facter_field:  
  80.                     if data.get(tag):  
  81.                         value += data[tag] + ' '  
  82.             else:  
  83.                 # 由于disk、IP等需要进一步处理,所以用了一个__来分隔,然后再进行处理  
  84.                 field_tmp = facter_field.split("__")  
  85.                 if len(field_tmp) == 2:  
  86.                     if db_field == 'disk':  
  87.                         for tag in data[field_tmp[1]].split(","):  
  88.                             # 对磁盘进行处理, 由于磁盘的字段为blockdevice_type_size,  
  89.                                   所以需要单独进行处理  
  90.                             f = field_tmp[0] + '_' + tag + '_' + 'size'  
  91.                             if data.get(f):  
  92.                                 # 去除sr0 tag的字段  
  93.                                 if tag != 'sr0':  
  94.                                     # 结果字符串  
  95.                                     value += tag + ':' + str(int(data[f]) / 1024 /  
  96.                                     1024 / 1024) + 'G' + ' '  
  97.                     # 对外网IP进行处理  
  98.                     elif db_field == 'public_ip':  
  99.                         for tag in data[field_tmp[1]].split(","):  
  100.                             f = field_tmp[0] + '_' + tag  
  101.                             if data.get(f):  
  102.                                 # 去除lo tag的字段  
  103.                                 if tag != 'lo':  
  104.                                     if get_ip_type(data[f]) == 'public':  
  105.                                         # 结果字符串  
  106.                                         value += data[f] + ' '  
  107.                     # 对内外IP进行处理  
  108.                     elif db_field == 'private_ip':  
  109.                         for tag in data[field_tmp[1]].split(","):  
  110.                             f = field_tmp[0] + '_' + tag  
  111.                             if data.get(f):  
  112.                                 # 去除lo tag的字段  
  113.                                 if tag != 'lo':  
  114.                                     if get_ip_type(data[f]) == 'private':  
  115.                                         # 结果字符串  
  116.                                         value += data[f] + ' '  
  117.                     else:  
  118.                         # 其他的字段直接就处理了  
  119.                         for tag in data[field_tmp[1]].split(","):  
  120.                             f = field_tmp[0] + '_' + tag  
  121.                             if data.get(f):  
  122.                                 # 去除lo tag的字段  
  123.                                 if tag != 'lo':  
  124.                                     # 结果字符串  
  125.                                     value += tag + ':' + data[f] + ' '  
  126.                 else:  
  127.                     if data.get(facter_field):  
  128.                         # 结果字符串  
  129.                         value = data[facter_field]  
  130.             # 将结果添加到result列表中  
  131.             result_dict[db_field] = value.strip()  
  132.         # 如果不存在  
  133.         else:  
  134.             result_dict[db_field] = ''  
  135.     # 返回结果字典  
  136.     return result_dict  
  137.  
  138. # 定义获取facter的函数  
  139. def get_all_host_facter_message():  
  140.     # 由于Puppet的yaml文件是Ruby格式的,因此需要进行转换  
  141.     yaml.add_multi_constructor(u"!ruby/object:", construct_ruby_object)  
  142.     yaml.add_constructor(u"!ruby/sym", construct_ruby_sym)  
  143.     # 获取所有有Facter信息的主机文件名称  
  144.     for dirpath, dirnames, filenames in os.walk(yaml_dir):  
  145.         # 只需要处理yaml目录下以yaml结尾的文件  
  146.         if dirpath == yaml_dir:  
  147.             for file in filenames:  
  148.                 file_name, file_ext = os.path.splitext(file)  
  149.                 if file_ext == '.yaml':  
  150.                     host_yaml_path = yaml_dir + '/' + file  
  151.                     # 得到yaml文件的内容, 字典形式  
  152.                     host_yaml_result_dict = yaml_file_handle(host_yaml_path)  
  153.                     # 对单个Agent的数据进行处理  
  154.                     if host_yaml_result_dict:  
  155.                         # 由于有key为facts,所以可以直接查找facts key的值  
  156.                         if host_yaml_result_dict.has_key('facts'):  
  157.                             data_dict = host_yaml_result_dict['facts']['values']  
  158.                         # 没有的就直接取  
  159.                         else:  
  160.                             data_dict = host_yaml_result_dict['values']  
  161.  
  162.                     # 现在就可以对data进行处理,获取我们所需要的数据了  
  163.                     result_dict = handle_facter_message(data_dict)  
  164.                     all_host_facter_message[file_name] = result_dict  
  165.     #返回我们最终的数据结果集  
  166.     return all_host_facter_message 


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198


【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

软件架构设计

本书紧紧围绕“软件架构设计”这一主题,立足实践解析了软件架构的概念,阐述了切实可行的软件架构设计方法,提供了可操作性极强的完整的架...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊