根据上一篇博文,把其中配置相关代码单独放到另一个文件中,作为程序的一个配置文件来使用
目录结构如下
创建一个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!”。