zoukankan      html  css  js  c++  java
  • 硬件资产管理系统总结

    硬件资产管理系统分三块:

    资产采集:

    CMDB资产采集方案:

      Agent

      SSH

      SaltSTATIC

    如何实现自动采集?

      1. Agent方式

        API:Django接收数据并入库

        程序:放置在每台服务器

      应用场景:机器多的时候

      每台服务器都有程序,程序实现采集数据(执行:import subprocess  ,  result = subprocess.getoutput(cmd)),然后把数据result发送给API

      2. SSH方式

        API:Django接收数据并存入库

        程序:放在中控机上(需要导入paramiko库)

        中控机:远程连接服务器,执行,结果返回中控机,然后由中控机发送给API

    用户名和密码方式:
     import paramiko
     ssh = paramiko.SSHClient()
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     ssh.connect(hostname='192.168.16.72',port=22,username='root',password='redhat')
     stdin, stdout, stderr = ssh.exec_command('ifconfig')
     result = stdout.read()
     ssh.close()
     print(result)

    公钥和私钥方式:

    # import paramiko
    # private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
    # ssh = paramiko.SSHClient()
    # ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', pkey=private_key)
    # stdin, stdout, stderr = ssh.exec_command('df')
    # result = stdout.read()
    # ssh.close()

     

      3. SaltSTATIC方式

        API:Django接收数据并存入库

        程序:放在master上

    采集完数据发送给API:import  requests模块 -----> requests.post( url, json = 采集的数据)  : 这种格式做了两个工作:1. 字典序列化,2. 带请求头:content-type: application/json

    三种模式:

      - Agent:每天执行一次(不用向API获取今日未采集数据)

      - SSH: 

        - 根据API获取今日未采集的主机列表(import requests requests.get( url ))

        - 循环所有的主机:每台主机连接上执行命令

        - API发送数据到服务端入库

      - SaltSTATIC:

        - 根据API获取今日未采集的主机列表

        - 循环所有的主机:每台主机链接上执行命名

        - API发送数据到服务端入库

    线程池的使用:

      在SSH模式和SaltSTATIC模式下,首先会向AIP发请求得到今日所有未采集的主机名,得到之后对每台主机进行资源采集,然后通过API入库,如果服务器的数量庞大的话,效率就会显得很低,所以我们用线程池来解决这个问题,线程池中开多个线程,让这些线程并发的去采集数据入库,这样效率会明显的提高。

      需要导入模块ThreadPoolExecutor , 

        

    from concurrent.futures import ThreadPoolExecutor
    
    pool = ThreadPoolExecutor(10)  # 开10个线程
    
    for  host  in  host_list: # host_list 指的是所有的主机列表
        pool.submit(资产采集并发送API入库的函数名,host主机名)

    setting配置文件(参考的是DJango配置):目标---> 把默认的配置文件和程序员自定义的配置文件合并,若同名,那么自定义的配置文件的优先级高。合并后,程序员修改自定义的配置文件就相当于修改合并后的配置文件。

      

    步骤:
      1. 在run.py运行文件中: os.environ['AUTO_SETTINGS'] = "conf.settings" conf:文件夹 settings:自定义的配置文件.py
      2. 再新建一个lib文件夹,then 创建一个config文件夹,
       *********************************
        - lib
          - config
            - __init__.py
            - global_settings.py
       ***********************************
      3. 在__init__.py文件中写入一下代码:
        
    
    
    import os
    import importlib
    from . import global_settings

    class
    Settings(object): """ global_settings,配置获取 settings.py,配置获取 """ def __init__(self): for item in dir(global_settings): # dir(global_settings) 指的是global_settings中的所有属性和方法 if item.isupper(): k = item v = getattr(global_settings,item) setattr(self,k,v) # setattr(object, name, values)给对象的属性赋值,若属性不存在,先创建再赋值。 setting_path = os.environ.get('AUTO_CLIENT_SETTINGS') md_settings = importlib.import_module(setting_path) # 导入字符串格式的模块,导入自定义的配置文件中的属性, # 这里是后导入自定义的配置文件,所以优先级高 for item in dir(md_settings): if item.isupper(): k = item v = getattr(md_settings,item)
              setattr(self,k,v)
     settings = Settings()  # 单例模式

    注意:在导入一个包时,实际上导入了它的__init__.py文件。在导入配置文件时,可以统一写成:from lib.config import settings


        

    API

    后台管理

  • 相关阅读:
    洛谷 P2872 [USACO07DEC]道路建设Building Roads
    cogs 29. 公路建设
    cogs 7. 通信线路
    cogs 2478. [HZOI 2016]简单的最近公共祖先
    洛谷 P1342 请柬
    洛谷 P1186 玛丽卡
    洛谷 P1491 集合位置
    启动、停止、重启服务
    洛谷——P1025 数的划分
    洛谷——P3368 【模板】树状数组 2
  • 原文地址:https://www.cnblogs.com/guomeina/p/7682553.html
Copyright © 2011-2022 走看看