python自动化运行学习第三十六天--请求salt-api

根据上一篇博文,把其中配置相关代码单独放到另一个文件中,作为程序的一个配置文件来使用
目录结构如下
在这里插入图片描述
创建一个settings的目录,目录下新建一个config.py文件,内容如下

host_info = {
    "disk":"fun.hosts.disk.Disk",
    "cpu":"fun.hosts.cpu.Cpu",
    "mem":"fun.hosts.mem.Mem",
}

host_list = ["cpu","disk","mem"]

demo.py代码稍作修改

import importlib
import os,sys

basedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))    #获取当前路径
sys.path.append(basedir)
from settings.config import host_info,host_list

for item in host_list:
    path = host_info.get(item)
    module_path,class_name = path.rsplit(".",maxsplit=1)
    module_name = importlib.import_module(module_path)
    info_class = getattr(module_name,class_name)

    test = info_class()
    test.run()

执行时,代码回到config.py文件中读取配置信息,根据配置执行相应代码。
其中的run方法内可以返回一些salt-api获取主机信息的命令,如cmd.run、free -m等。执行代码就能获取到主机相关信息,经过处理得到想要的数据。

再次修改程序结构
在这里插入图片描述
run.py作为获取资源的主程序,代码如下

import importlib
import os,sys

basedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(basedir)
from demo1.settings.config import host_info,host_list
from fun.task.get_data import send_main

for item in host_list:
    path = host_info.get(item)
    module_path,class_name = path.rsplit(".",maxsplit=1)
    module_name = importlib.import_module(module_path)
    info_class = getattr(module_name,class_name)

    test = info_class()
    cmd = test.run()
    print(cmd)
    send_main(cmd)

get_data.py中的代码如下

try:
    import cookielib
except:
    import http.cookiejar as cookielib

import ssl
context = ssl._create_unverified_context()
from fun.task.salt_client import SaltApi
from settings.config import SALT_API_CON
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

def send_main(param):
    salt = SaltApi(SALT_API_CON,param)
    result1 = salt.salt_command()

if __name__ == '__main__':
    send_main({"client":"local", "fun":"test.ping", "tgt":"192.168.11.130"})

salt_client.py中的代码如下:

import json
import requests
from settings.config import SALT_API_CON
from settings.config import SALT_USERNAME
from settings.config import SALT_PASSWORD

class SaltApi:
    def __init__(self, url, params):
        self.url = url
        self.username = SALT_USERNAME
        self.password = SALT_PASSWORD
        self.headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.3",
            "Content-type":"application/json"
        }
        self.params = params
        self.login_url = SALT_API_CON + "login"
        self.login_params = {"username":self.username, "password":self.password, "eauth":"pam"}
        # self.token = self.get_data(self.login_url, self.params)["token"]
        self.token = self.get_data(self.login_url, self.login_params).get("token")
        self.headers["X-Auth-Token"] = self.token

    def get_data(self, url, params):
        send_data = json.dumps(params)
        request = requests.post(url, data=send_data, headers=self.headers, verify=False)
        response = request.json()
        result = dict(response)
        return result["return"][0]

    def salt_command(self):
        result = self.get_data(self.url, self.params)
        return result

config.py配置文件中的内容:

host_info = {
    "disk":"fun.hosts.disk.Disk",
    "cpu":"fun.hosts.cpu.Cpu",
    "mem":"fun.hosts.mem.Mem",
}

host_list = ["mem",]
# host_list = ["cpu","disk","mem"]

SALT_API_CON = "https://192.168.11.130:8001/"

SALT_USERNAME = "saltapi"
SALT_PASSWORD = "123456"

经过重新布局后,settings目录中存放配置文件,bin目录存放主程序,fun目录存放一些功能模块,host目录下是获取各个主机信息的salt相关命令,task目录下是通过salt获取主机信息的功能。

mem.py文件中的内容如下:

from fun.hosts.main import Base              #加载自定义的一个类

class Disk(Base):
    def run(self):
        self.method="cmd.run"
        self.tgt="*"
        self.arg="free -m"

        return {"client":"local", "fun":self.method, "tgt":self.tgt, "arg":self.arg}

mem.py是一个获取内存使用信息的脚本,其中定义了一个run方法让salt-api调用执行。上边的run.py文件中会有一个run方法就是调用该run方法。假如新添加一个获取系统信息的脚本,其中没有run方法就会导致程序运行报错,可以定义一个父类,在父类中处理没有run方法的情况,就是脚本中加载的main.py
main.py文件内容如下;

class Base(object):
    def __init__(self):
        self.method=""
        self.tgt=""
        self.arg=""

    def run(self):
        raise NotImplementedError("No run method!")

这样在脚本中如果没有定义run方法就会提示“No run method!”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值