硬件资产管理系统总结

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

资产采集:

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

后台管理

posted @ 2017-10-17 23:25  背着石头的小蚂蚁  阅读(848)  评论(0编辑  收藏  举报