CMDB服务器管理系统【s5day88】:兼容的实现

比较麻烦的实现方式

类的继承方式

目录结构如下:

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

测试模式

详细的扑捉错误信息

猜你喜欢

转载自www.cnblogs.com/luoahong/p/9320611.html