比较麻烦的实现方式
类的继承方式
目录结构如下:
auto_client\bin\run.py
import sys import os import importlib import requests BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASEDIR) os.environ['AUTO_CLIENT_SETTINGS'] = "conf.settings" from src.plugins import PluginManager if __name__ == '__main__': obj = PluginManager() server_dict = obj.exec_plugin() print(server_dict)
auto_client\conf\settings.py
PLUGIN_ITEMS = { "nic": "src.plugins.nic.Nic", "disk": "src.plugins.disk.Disk", } API = "http://127.0.0.1:8000/api/server.html" TEST = False MODE = "ANGET" # AGENT/SSH/SALT
auto_client\lib\config\__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): if item.isupper(): k = item v = getattr(global_settings,item) setattr(self,k,v) 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()
auto_client\lib\config\global_settings.py
TEST = True NAME = "GAOXU"
auto_client\src\plugins\__init__.py
import importlib import requests from lib.config import settings class PluginManager(object): def __init__(self): pass def exec_plugin(self): server_info = {} for k,v in settings.PLUGIN_ITEMS.items(): # 找到v字符串:src.plugins.nic.Nic,src.plugins.disk.Disk module_path,cls_name = v.rsplit('.',maxsplit=1) module = importlib.import_module(module_path) cls = getattr(module,cls_name) if hasattr(cls,'initial'): obj = cls.initial() else: obj = cls() ret = obj.process() server_info[k] = ret return server_info
auto_client\src\plugins\base.py
from lib.config import settings class BasePlugin(object): def __init__(self): pass def exec_cmd(self,cmd): if settings.MODE == "AGENT": import subprocess result = subprocess.getoutput(cmd) elif settings.MODE == "SSH": 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(cmd) result = stdout.read() ssh.close() elif settings.MODE == "SALT": import subprocess result = subprocess.getoutput('salt "c1.com" cmd.run "%s"' %cmd) else: raise Exception("模式选择错误:AGENT,SSH,SALT") return result
auto_client\src\plugins\disk.py
from .base import BasePlugin class Disk(BasePlugin): def process(self): result = self.exec_cmd("dir") return 'disk info'
auzo_client\src\plugins\memory.py
from .base import BasePlugin class Memory(BasePlugin): def process(self): return "xxx"
auto_client\src\plugins\nic.py
from .base import BasePlugin class Nic(BasePlugin): def process(self): return 'nic info'
auto_client\src\plugins\board.py
from .base import BasePlugin class Board(BasePlugin): def process(self): pass
auto_client\src\plugins\basic.py
from .base import BasePlugin class Basic(BasePlugin): @classmethod def initial(cls): return cls() def process(self): pass
传参方式
目录结构如下:
auto_client\bin\run.py
import sys import os import importlib import requests BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASEDIR) os.environ['AUTO_CLIENT_SETTINGS'] = "conf.settings" from src.plugins import PluginManager if __name__ == '__main__': obj = PluginManager() server_dict = obj.exec_plugin() print(server_dict)
auto_client\conf\settings.py
PLUGIN_ITEMS = { "nic": "src.plugins.nic.Nic", "disk": "src.plugins.disk.Disk", } API = "http://127.0.0.1:8000/api/server.html" TEST = False MODE = "ANGET" # AGENT/SSH/SALT
auto_client\lib\config\__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): if item.isupper(): k = item v = getattr(global_settings,item) setattr(self,k,v) 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()
auto_client\lib\config\global_settings.py
TEST = True NAME = "GAOXU"
auto_client\src\plugins\__init__.py
import importlib import requests from lib.config import settings class PluginManager(object): def __init__(self): pass def exec_plugin(self): server_info = {} for k,v in settings.PLUGIN_ITEMS.items(): # 找到v字符串:src.plugins.nic.Nic,src.plugins.disk.Disk module_path,cls_name = v.rsplit('.',maxsplit=1) module = importlib.import_module(module_path) cls = getattr(module,cls_name) if hasattr(cls,'initial'): obj = cls.initial() else: obj = cls() ret = obj.process() server_info[k] = ret return server_info
auto_client\src\plugins\base.py
from lib.config import settings class BasePlugin(object): def __init__(self): pass def exec_cmd(self,cmd): if settings.MODE == "AGENT": import subprocess result = subprocess.getoutput(cmd) elif settings.MODE == "SSH": 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(cmd) result = stdout.read() ssh.close() elif settings.MODE == "SALT": import subprocess result = subprocess.getoutput('salt "c1.com" cmd.run "%s"' %cmd) else: raise Exception("模式选择错误:AGENT,SSH,SALT") return result
auto_client\src\plugins\disk.py
from .base import BasePlugin class Disk(BasePlugin): def process(self): result = self.exec_cmd("dir") return 'disk info'
auzo_client\src\plugins\memory.py
from .base import BasePlugin class Memory(BasePlugin): def process(self): return "xxx"
auto_client\src\plugins\nic.py
from .base import BasePlugin class Nic(BasePlugin): def process(self): return 'nic info'
auto_client\src\plugins\board.py
from .base import BasePlugin class Board(BasePlugin): def process(self): pass
auto_client\src\plugins\basic.py
from .base import BasePlugin class Basic(BasePlugin): @classmethod def initial(cls): return cls() def process(self): pass