客户端批量执行实例-伪代码
客户端demo2代码梳理1-获取执行参数
客户端demo2代码梳理2-请求salt-api
客户端批量执行实例-伪代码
demo_run.py
代码
#!/usr/bin/env python
\# _\*_ coding:utf-8 _\*_
import importlib
import os,sys
\# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(\_\_file\_\_))))
BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(\_\_file\_\_)))
sys.path.append(BASEDIR) 通过sys.path加入当前路径来引入settings.set
from settings.set import Host\_func\_dic,host_li
from settings.set import host_li
#调用salt-api
for host in host_li:
path=Host\_func\_dic.get(host)
module\_path,class\_name = path.rsplit('.',maxsplit=1)
module = importlib.import\_module(module\_path)
# from func_demo.hosts import disk
# disk_class=getattr(disk,'Disk')
disk\_class=getattr(module,class\_name)
JG=disk_class()
JG.run()
代码
#!/usr/bin/env python
\# _\*_ coding:utf-8 _\*_
import importlib
import os,sys
\# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(\_\_file\_\_))))
\# BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(\_\_file\_\_)))
\# sys.path.append(BASEDIR)
Host\_func\_dic = {
'disk':'func_demo.hosts.disk.Disk',
'mem':'func_demo.hosts.mem.Mem',
'cpu':'func_demo.hosts.cpu.Cpu',
'os':'func_demo.hosts.os.Os',
'ip':'func_demo.hosts.ip.Ip',
}
host_li=\['cpu','mem','ip'\]
调用动作单独拿出来,成一个方法或一个类
代码
class Mem(object):
pass
def run(self):
ret_li=\['cmd.run','free -m'\]
return ret_li
客户端demo2代码梳理1-获取执行参数
demo02/run.py
代码
#!/usr/bin/env python
\# _\*_ coding:utf-8 _\*_
import importlib
import os,sys
\# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(\_\_file\_\_))))
BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(\_\_file\_\_)))
sys.path.append(BASEDIR)
from conf.settings import HOST\_FUNC\_DIC
from conf.settings import HOST\_FUNC\_LI
from func.task.get\_data import send\_main
#调用salt-api
for host in HOST\_FUNC\_LI:
path=HOST\_FUNC\_DIC.get(host)
module\_path,class\_name = path.rsplit('.',maxsplit=1)
module = importlib.import\_module(module\_path)
# from func_demo.hosts import disk
# disk_class=getattr(disk,'Disk')
disk\_class=getattr(module,class\_name)
JG=disk_class()
func=JG.run()
# print(func)
JG=send_main(func)
_#已经做了的_
_#区分cpu,mem,disk 的参数_
_#将不同参数传递给salt-api,并获取结果_
_#客户端没做的_
_#拿到的结果 需要再进行格式化_
_#拿到格式化之后的结果, 就可以向 CMDB 发送请求 进行验证存储了_
_#服务端没做的_
_#调用客户端的操作_
_#接受客户端发送数据的接口_
demo02/task/get_data.py
#!/usr/bin/env python
\# _\*_ coding:utf-8 _\*_
import requests
import json
try:
import cookielib
except:
import http.cookiejar as cookielib
\# 使用urllib2请求https出错,做的设置
import ssl
context = ssl.\_create\_unverified_context()
from func.task.salt_client import SaltApi
from conf.settings import SALT\_API\_CON
\# 使用requests请求https出现警告,做的设置
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def send_main(params):
# print ('==================')
# print ('同步执行命令')
print(params)
salt = SaltApi(SALT\_API\_CON,params)
# salt\_client = 'jenkins\_test'
# salt_client = \['*'\]
# salt_test = 'grains.items'
# salt_test = 'test.ping'
# salt_method = 'grains.get'
# salt_method = 'cmd.run'
# salt_method = 'disk.usage'
# salt_method = 'svn.update'
# salt\_params = \['ip\_interfaces', \]
# salt\_params = \['ip\_interfaces','hwaddr_interfaces'\]
# salt_params = 'free -m'
# salt_params = \['free -m',\]
# salt_params = \['/','/mnt/www','root','liang','liang'\]
# print salt.salt\_command(salt\_client, salt\_method, salt\_params)
# 下面只是为了打印结果好看点
result1 = salt.salt_command()
# result2 = salt.salt\_command(salt\_client, salt\_method, salt\_params)
#disk
# for host,dic in result2.items():
# print (host)
#
# for disk,value in dic.items():
# font_size=str(round(int(value\['1K-blocks'\]) /1024 /1024,2)) +('G')
# print('目录',disk,'磁盘大小',font_size)
if \_\_name\_\_ == '\_\_main\_\_':
send\_main({'client': 'local', 'fun': 'jenkins\_test', 'tgt': 'test.ping', }) ##调用不会运行此段代码,只有直接执行才会运行
demo02/task/salt_client.py
代码
#!/usr/bin/python
\# -*- coding:utf-8 -*-
#make in LA
import json
import requests
from conf.settings import SALT\_API\_CON
from conf.settings import SALT_USERNAME
from conf.settings import SALT_PASSWORD
class SaltApi:
def \_\_init\_\_(self, url , params):
self.url = url
self.username = SALT_USERNAME
self.password = SALT_PASSWORD
self.params = params
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.36",
"Content-type": "application/json"
}
# self.params = {'client': 'local', 'fun': '', 'tgt': ''}
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.login_params)\['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):
"""远程执行命令,相当于salt 'client1' cmd.run 'free -m'"""
# print ('命令参数: ', params)
result = self.get_data(self.url, self.params)
return result
demo02/conf/settings.py
代码
#!/usr/bin/python
\# -*- coding:utf-8 -*-
HOST\_FUNC\_DIC = {
'disk':'func.hosts.disk.Disk',
'mem':'func.hosts.mem.Mem',
'cpu':'func.hosts.cpu.Cpu',
'os':'func.hosts.os.Os',
'ip':'func.hosts.ip.Ip',
}
HOST\_FUNC\_LI=\['mem'\]
SALT\_API\_CON = "https://192.168.78.128:8001/"
SALT_USERNAME = "saltapi"
SALT_PASSWORD = "Freeme123"
demo02/func/hosts/mem.py
代码
from func.hosts.main import Base
class Mem(Base):
def run(self):
self.method='cmd.run'
self.tgt='linux02'
self.arg='free -m'
return {'client': 'local', 'fun': self.method, 'tgt': self.tgt, 'arg':self.arg }
#salt 'jenkins_test' cmd.run 'free -m'
客户端demo2代码梳理2-请求salt-api
demo02/run.py
代码
#!/usr/bin/env python
\# _\*_ coding:utf-8 _\*_
import importlib
import os,sys
\# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(\_\_file\_\_))))
BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(\_\_file\_\_)))
sys.path.append(BASEDIR)
from conf.settings import HOST\_FUNC\_DIC
from conf.settings import HOST\_FUNC\_LI
from func.task.get\_data import send\_main
#调用salt-api
for host in HOST\_FUNC\_LI:
path=HOST\_FUNC\_DIC.get(host)
module\_path,class\_name = path.rsplit('.',maxsplit=1)
module = importlib.import\_module(module\_path)
# from func_demo.hosts import disk
# disk_class=getattr(disk,'Disk')
disk\_class=getattr(module,class\_name)
JG=disk_class()
func=JG.run()
# print(func)
JG=send_main(func)
demo02/task/get_data.py
#!/usr/bin/env python
\# _\*_ coding:utf-8 _\*_
import requests
import json
try:
import cookielib
except:
import http.cookiejar as cookielib
\# 使用urllib2请求https出错,做的设置
import ssl
context = ssl.\_create\_unverified_context()
from func.task.salt_client import SaltApi
from conf.settings import SALT\_API\_CON
\# 使用requests请求https出现警告,做的设置
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def send_main(params):
# print ('==================')
# print ('同步执行命令')
print(params)
salt = SaltApi(SALT\_API\_CON,params)
# salt\_client = 'jenkins\_test'
# salt_client = \['*'\]
# salt_test = 'grains.items'
# salt_test = 'test.ping'
# salt_method = 'grains.get'
# salt_method = 'cmd.run'
# salt_method = 'disk.usage'
# salt_method = 'svn.update'
# salt\_params = \['ip\_interfaces', \]
# salt\_params = \['ip\_interfaces','hwaddr_interfaces'\]
# salt_params = 'free -m'
# salt_params = \['free -m',\]
# salt_params = \['/','/mnt/www','root','liang','liang'\]
# print salt.salt\_command(salt\_client, salt\_method, salt\_params)
# 下面只是为了打印结果好看点
result1 = salt.salt_command()
# result2 = salt.salt\_command(salt\_client, salt\_method, salt\_params)
#disk
# for host,dic in result2.items():
# print (host)
#
# for disk,value in dic.items():
# font_size=str(round(int(value\['1K-blocks'\]) /1024 /1024,2)) +('G')
# print('目录',disk,'磁盘大小',font_size)
if \_\_name\_\_ == '\_\_main\_\_':
send\_main({'client': 'local', 'fun': 'jenkins\_test', 'tgt': 'test.ping', }) ##调用不会运行此段代码,只有直接执行才会运行
demo02/task/salt_client.py
代码
#!/usr/bin/python
\# -*- coding:utf-8 -*-
#make in LA
import json
import requests
from conf.settings import SALT\_API\_CON
from conf.settings import SALT_USERNAME
from conf.settings import SALT_PASSWORD
class SaltApi:
def \_\_init\_\_(self, url , params):
self.url = url
self.username = SALT_USERNAME
self.password = SALT_PASSWORD
self.params = params
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.36",
"Content-type": "application/json"
}
# self.params = {'client': 'local', 'fun': '', 'tgt': ''}
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.login_params)\['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):
"""远程执行命令,相当于salt 'client1' cmd.run 'free -m'"""
# print ('命令参数: ', params)
result = self.get_data(self.url, self.params)
return result
demo02/conf/settings.py
代码
#!/usr/bin/python
\# -*- coding:utf-8 -*-
HOST\_FUNC\_DIC = {
'disk':'func.hosts.disk.Disk',
'mem':'func.hosts.mem.Mem',
'cpu':'func.hosts.cpu.Cpu',
'os':'func.hosts.os.Os',
'ip':'func.hosts.ip.Ip',
}
HOST\_FUNC\_LI=\['mem'\]
SALT\_API\_CON = "[https://192.168.78.128:8001/](https://192.168.78.128:8001/)"
SALT_USERNAME = "saltapi"
SALT_PASSWORD = "Freeme123"
demo02/func/hosts/mem.py
代码
from func.hosts.main import Base
class Mem(Base): (统一继承一个类Base)
def run(self):
self.method='cmd.run'
self.tgt='linux02'
self.arg='free -m'
return {'client': 'local', 'fun': self.method, 'tgt': self.tgt, 'arg':self.arg }
#salt 'jenkins_test' cmd.run 'free -m'
demo02/func/hosts/mail.py
代码
#!/usr/bin/python
\# -*- coding:utf-8 -*-
#make in LA
class Base(object):
def \_\_init\_\_(self):
self.method=''
self.tgt=''
self.arg=''
def run(self):
raise NotImplementedError('Not run')
没有写run 方法,就会到Base类里去执行,提示报错