|
|
|
|
移动端

2.5.4 Django的配置(5)

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

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

技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战

2.5.4 Django的配置(5)

以上程序可以过滤Facter中我们想要得到的Agent数据,运行facter_message.py程序,结果输出如下:

  1. $ python facter_message.py  
  2. {'puppetclient.domain.com':  
  3. {'status': '',  
  4. 'name': 'puppetclient.domain.com',  
  5. 'mem': '1.83 GB',  
  6. 'memo': '',  
  7. 'idc': '',  
  8. 'public_ip': '',  
  9. 'admin': '',  
  10. 'mac': 'eth0:00:1A:4A:25:E2:12 eth1:00:1A:4A:25:E2:13',  
  11. 'role': '',  
  12. 'private_ip': '10.20.122.111',  
  13. 'disk': 'vda:20G vdb:30G',  
  14. 'os': 'CentOS 6.5 x86_64',  
  15. 'cpu': '2 Intel Core 2 Duo P9xxx (Penryn Class Core 2)',  
  16. 'SN': ''}  

到这里,我们能够看到facter_message.py得到的数据字段和models.py中数据结构的字段正好一样,下一步我们就可以直接将facter_message.py的数据导入到数据库中了,具体程序如下:

  1. # 检测用户是否登录  
  2. @login_required  
  3. # 定义一个views,用来处理导入信息  
  4. def import_data(request, model):  
  5.     # 导入计数器  
  6.     import_num = 0 
  7.     # 查看model是否存在于定义的模板中  
  8.     if model in BASE_ADMIN:  
  9.         # 获取tag名称  
  10.         tag_name = BASE_ADMIN[model]['name']  
  11.         # 获取model名称  
  12.         model_name = BASE_ADMIN[model]['model']  
  13.         # 这里只处理server_device的导入信息  
  14.         if model == 'server_device':  
  15.             server_device_data = get_all_host_facter_message()  
  16.             # 进行数据入库处理  
  17.             for hostname, facter_message in server_device_data.items():  
  18.                 # 主机名处理,判断facter_message中name key是否有值,  
  19.                 if facter_message['name']:  
  20.                     # 如果有值,name就使用该值  
  21.                     name = facter_message['name']  
  22.                 # 如果没有这个值  
  23.                 else:  
  24.                     # 就使用hostname  
  25.                     name = hostname 
  26.                 # 对于IDC信息、User信息、项目角色信息的处理都需要自己去写Facter插件,不  
  27.                        写的都为空,然后进行处理  
  28.                 # IDC关联处理,如果facter_message中的idc key有值  
  29.                 if facter_message['idc']:  
  30.                     # idc_name就为该值  
  31.                     idc_name = facter_message['idc']  
  32.                     # 同时处理该IDC信息是否存在于IDC表中,如果有则取出ID  
  33.                     if IDC.objects.filter(name=idc_name):  
  34.                         idc_id = IDC.objects.get(name=idc_name).id  
  35.                     # 如果没有,则进行保存,然后取出ID  
  36.                     else:  
  37.                         idc_sql = IDC(name=idc_name)  
  38.                         try:  
  39.                             idc_sql.save()  
  40.                             # 取出ID  
  41.                             idc_id = IDC.objects.get(name=idc_name).id  
  42.                         except Exception, e:  
  43.                             return e  
  44.                 # 如果idc key没有值,则为None  
  45.                 else:  
  46.                     idc_id = None 
  47.                 # 管理员信息关联处理,如果用户存在则关联,不存在则跳过  
  48.                 if facter_message['admin']:  
  49.                     admin_name = facter_message['admin']  
  50.                     # 如果用户存在User表中则取ID,若没有则为空  
  51.                     if User.objects.filter(username=admin_name):  
  52.                         user_id = User.objects.get(username=admin_name).id  
  53.                     else:  
  54.                         user_id = None 
  55.                 # 没有就为空  
  56.                 else:  
  57.                     user_id = None 
  58.                 # 这里还有一个角色多对多关系的处理,由于这里没有定义机器角色,因此此处不处理  
  59.                       角色信息  
  60.                 # 判断主机是否存在于server_device表中,如果不存在则添加  
  61.                 if not model_name.objects.filter(namename=name):  
  62.                     import_sql = model_name(namename=name,  
  63.                                             sn=facter_message['sn'],  
  64.                                             public_ip=facter_message['public_ip'],  
  65.                                             private_ip=facter_message['private_ip'],  
  66.                                             mac=facter_message['mac'],  
  67.                                             idc=idc_id,  
  68.                                             os=facter_message['os'],  
  69.                                             disk=facter_message['disk'],  
  70.                                             mem=facter_message['mem'],  
  71.                                             cpu=facter_message['cpu'],  
  72.                                             admin=user_id,  
  73.                                             memo=facter_message['memo'],  
  74.                     )  
  75.                     try:  
  76.                         # 保存  
  77.                         import_sql.save()  
  78.                     except Exception, e:  
  79.                         return e  
  80.                 # 如果有了,则查询数据,若信息不对则更新  
  81.                 elif not model_name.objects.filter(namename=name,  
  82.                     sn=facter_message['sn'],  
  83.                     public_ip=facter_message['public_ip'],  
  84.                     private_ip=facter_message['private_ip'],  
  85.                     mac=facter_message['mac'],  
  86.                     os=facter_message['os'],  
  87.                     disk=facter_message['disk'],  
  88.                     mem=facter_message['mem'],  
  89.                     cpu=facter_message['cpu'],  
  90.                     memo=facter_message['memo']):  
  91.                     try:  
  92.                         # 更新数据库  
  93.                             model_name.objects.filter(namename=name).update(sn=  
  94.                             facter_message['sn'],  
  95.                             public_ip=facter_message['public_ip'],  
  96.                             private_ip=facter_message['private_ip'],  
  97.                             mac=facter_message['mac'],  
  98.                             os=facter_message['os'],  
  99.                             disk=facter_message['disk'],  
  100.                             mem=facter_message['mem'],  
  101.                             cpu=facter_message['cpu'],  
  102.                             memo=facter_message['memo'],  
  103.                         )  
  104.                     except Exception, e:  
  105.                         return e  
  106.                 # 如果有了,且信息ok,则跳过  
  107.                 else:  
  108.                     continue  
  109.         return HttpResponseRedirect('/cmdb/%s/show/' % model)  
  110.  
  111.     return render_to_response('all_data_show.html', locals(), context_instance=RequestContext(request)) 

重新登录CMDB之后的页面,有一个导入主机的按钮,点击导入主机按钮,就可以自动导入通过Facter获取的Agent主机信息了,如图2-13所示。

我们还可以通过添加的方式来维护CMDB的内容,到目前为止我们已经完成了使用Python和Puppet来构建一个小型的、简单的CMDB系统。

CMDB是需要我们定期进行维护和更新的,因此它还需要提供历史查看、API等更实用的功能,为此在2.6节中我们将介绍一下Django提供的几个好用的功能模块。


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

51CTO读书频道二维码


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

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

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

读 书 +更多

Linux命令、编辑器与Shell编程

本书是目前所能找到的最实用、最全面的Linux指南和参考手册,也是唯一一本提供以下全部内容的书籍: 更好更实用的示例覆盖了实际工作中需...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊