配置文件的设置

大体思路:

  1,通过开始文件将用户配置信息的文件放置到环境变量中。

  2,在lib文件中的config文件中,从环境变量中获取到用户的配置,通过importlib模块导入用户配置文件,通过dir方法获取到文件內的配置信息加载到本Settings类中。

  3,默认配置方式同上。

  1. import os
  2.  
  3. os.environ["USER_SETTINGS"] = "config.settings"
  4.  
  5. from lib.conf.config import settings
  6.  
  7. print(settings.USER)
  8. print(settings.EMAIL)

./bin/start

  1. """
  2. 用户自定义配置
  3. """
  4.  
  5. USER = "root"
  6. EMAIL = "chenrun@163.com"

./config/settings

默认配置信息

  1. """
  2. 全局配置文件
  3. """
  4. import os
  5. import importlib
  6. from . import global_settings
  7.  
  8. class Settings(object):
  9. def __init__(self):
  10. # 找到默认配置
  11. for name in dir(global_settings):
  12. value = getattr(global_settings, name)
  13. setattr(self, name, value)
  14.  
  15. # 找到自定义配置
  16. settings_module = os.environ.get("USER_SETTINGS")
  17. # 根据字符串导入模块
  18. if settings_module:
  19. m = importlib.import_module(settings_module)
  20. for name in dir(m):
  21. if name.isupper():
  22. value = getattr(m, name)
  23. setattr(self, name, value)
  24.  
  25. settings = Settings()

./lib/conf/config

执行流程的大体思路:

basic.py

  1. class Basic(object):
  2. def process(self):
  3. return "123123123"

  

init.py文件

从配置文件中获取到所有需要采集的硬件信息,通过importlib导入,并执行每个类里的process方法。

  1. import importlib
  2. from lib.conf.config import settings
  3.  
  4. class PluginManager(object):
  5. def __init__(self, hostname=None):
  6. self.hostname = hostname
  7. self.plugin_dict = settings.PLUGINS_DICT
  8.  
  9. def exec_plugin(self):
  10. """
  11. 获取所有的插件,并执行获取插件的返回值
  12. :return:
  13. """
  14. response = {}
  15. for k, v in self.plugin_dict.items():
  16. # 'basic': "src.plugins.basic.Basic"
  17. prefix, class_module = v.rsplit(".", 1)
  18. m = importlib.import_module(prefix)
  19. cls = getattr(m, class_module)
  20. result = cls().process()
  21. response[k] = result
  22.  
  23. return response

  

start.py文件

通过sys.path.append() 导入根目录,方便导入src中的模块

  1. import os
  2.  
  3. os.environ["USER_SETTINGS"] = "config.settings"
  4. import sys
  5.  
  6. BASEDIR = os.path.dirname(os.path.abspath(__file__))
  7. sys.path.append(BASEDIR)
  8.  
  9. from src.plugins import PluginManager
  10.  
  11. if __name__ == '__main__':
  12. server_info = PluginManager().exec_plugin()
  13. print(server_info)

  

后续在init中执行分别定义不同的连接方式,agent,paramiko,saltstack。

src下创建client与script文件

client处理发送API,获取资产信息,获取ssh

  1. import json
  2.  
  3. import requests
  4.  
  5. from src.plugins import PluginManager
  6. from lib.conf.config import settings
  7.  
  8. class Base(object):
  9. def post_asset(self, server_info):
  10. requests.post(settings.API, json=server_info)
  11.  
  12. class Agent(Base):
  13.  
  14. def execute(self):
  15. server_info = PluginManager().exec_plugin()
  16. self.post_asset(server_info)
  17.  
  18. class SSHSALT(Base):
  19. def get_host(self):
  20. # 获取未采集的主机列表
  21. response = requests.get(settings.API)
  22. result = json.loads(response.text)
  23. if not result["status"]:
  24. return
  25. return result["data"]
  26.  
  27. def execute(self):
  28. host_list = self.get_host()
  29. for host in host_list:
  30. server_info = PluginManager(host).exec_plugin()
  31. self.post_asset(server_info)

./src/client

script.py文件对不同的模式进行判断返回obj对象

  1. from . import client
  2. from lib.conf.config import settings
  3.  
  4. def run():
  5. if settings.MODE == "AGENT":
  6. obj = client.Agent()
  7. else:
  8. obj = client.SSHSALT()
  9.  
  10. obj.execute()

./src/script.py

CMDB-客户端的更多相关文章

  1. cmdb客户端代码完善2

    目录: 1.面试提问 2.完善采集端代码 3.唯一标识的问题 4.API的验证 1.面试会问到的问题: # 1. 为啥要做CMDB?# - 实现运维自动化, 而CMDB是实现运维自动化的基石# - 之 ...

  2. cmdb客户端服务器信息采集一

    #cmdb脚本程序一 #!/usr/bin/python # coding:utf-8 """ 采集机器自身信息 1 主机名 2 内存 3 ip与mac地址 4 cpu信 ...

  3. cmdb客户端采集数据的完善

    file文件自己去拷贝(这里不提供) custom_settings.py import os BASEDIR = os.path.dirname(os.path.dirname(os.path.ab ...

  4. cmdb 配置

    cmdb客户端文件夹创建 客户端:client:-bin:启动文件-src:源文件(核心代码)-conf:配置文件-lib:全局的一些方法 和配置-test:测试文件

  5. python自动化运维之CMDB篇-大米哥

    python自动化运维之CMDB篇 视频地址:复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1Oj_sglTi2P1CMjfMkYKwCQ  ...

  6. CMDB资产管理系统开发【day25】:windows客户端开发

    1.目录结构 PS Y:\MadkingClient> tree /f 卷 netgame 的文件夹 PATH 列表 卷序列号为 ACE3-896E Y:. ├─bin │ NedStark.p ...

  7. CMDB资产管理系统开发【day26】:linux客户端开发

    客户端疑难点及获取流程 1.linux客户端支持2就可以,python3就是很麻烦 难道你要求所有的客户端都上pytho3吗? 现在从bin的入口进去 HouseStark.ArgvHandler(s ...

  8. CMDB学习之六 --客户端请求测试,服务端api优化

    客户端使用agent 请求测试,agent使用的POST 请求,使用requests模块 本地采集,汇报服务端 #!/usr/bin/env python # -*- coding:utf-8 -*- ...

  9. Django项目:CMDB(服务器硬件资产自动采集系统)--04--04CMDB本地(Agent)模式客户端唯一标识(ID)

    # client.py # ————————01CMDB获取服务器基本信息———————— from src import plugins #__init__.py from lib.serializ ...

  10. Python之路【第二十二篇】CMDB项目

    浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...

随机推荐

  1. shell编写总结

    变量引用 $(VAR): 会将VAR当做一条命令来执行 '$VAR': 单引号中包含的变量, 不会被引用, 仍然输出$VAR "$VAR": 双引号中包含的变量, 会被引用成$VA ...

  2. django gunicorn 各worker class简单性能测试

    版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/564871723/ ====================== ...

  3. UVA12716 GCD XOR 数论数学构造

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010682557/article/details/36204645 题目给你一个N,让你求 两个数 ...

  4. 微信开发 api 需要 https 服务器

    微信开发 api 需要 https 服务器 先建一个环境,本地的 https 服务器. 以下这篇不错,很完整. https://zhuanlan.zhihu.com/p/23640321

  5. 深入理解java虚拟机-第二章:java内存区域与内存泄露异常

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  6. 在AWS EMR上运行Map Reduce的Java示例程序 及 操作小计

    下面的代码中AffairClient类中包含了三个内之类,分别对应于Hadoop Mapreduce程序运行所需的Mapper类,Reducer类,和主类.AffairClient类中其余方法用于配置 ...

  7. caffemodel的读取与修改

    直接撸代码~ import caffe import numpy as np caffe.set_mode_cpu() net = caffe.Net('myprototxt.prototxt', ' ...

  8. C# WMP 视频播放

    1. C#播放器控件常用的方法介绍 右击工具箱->选择项(I)... -> 显示"选择工具箱项" -> COM组件 -> Windows Media Pla ...

  9. 老齐python-基础9(函数)

    继续上篇 函数 多参数: >>> def foo(x,y,z,*args,**kargs): ... print(x) ... print(y) ... print(z) ... p ...

  10. 数组与指针的区别,以及在STL中传递数组/指针

    数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = ...