硬件资产管理系统分三块:
资产采集:
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
后台管理