1 py2
1.1 部署微服务
# 由于salt的python包内没有pip,需要弄个额外的pip来装,
带pip的python2路径/pip install flask --target=/usr/lib64/python2.7/site-packages
# 运行微服务,服务详见3.1
nohup /usr/bin/python2.7 flask_salt.py>> /tmp/flask_salt.log 2>&1 &
1.2 高并发发起
# 脚本方式,详见3.2
/usr/bin/python2.7 salt_async_quick_base_py2.py -t self -c "ls -a" [-r no]
-t: 指定minion_id
-c: 指定命令
-r: 是否重置jid
# 请求方式
curl -H "Content-Type: application/json" -X POST -d '{"cmd": "pwd", "tgt":"*","reload_jid": true}' "http://127.0.0.1:31020/async/"
2 py3
2.1 部署微服务
/usr/bin/pip3 install flask
# 运行微服务,服务详见3.1
nohup /usr/bin/python3 flask_salt.py>> /tmp/flask_salt.log 2>&1 &
2.2 高并发发起
# 脚本方式,详见3.3
/usr/bin/python3 salt_async_quick_base_py3.py -t self -c "ls -a" [-r no]
-t: 指定minion_id
-c: 指定命令
-r: 是否重置jid
# 请求方式
curl -H "Content-Type: application/json" -X POST -d '{"cmd": "pwd", "tgt":"*","reload_jid": true}' "http://127.0.0.1:31020/async/"
3 脚本与文件
3.1 flask_salt.py
# -*- coding: utf-8 -*-
import salt.client
from flask import Flask, request
import random
import time
import json
import hashlib
app = Flask(__name__)
local = salt.client.LocalClient()
def make_md5(string):
"""生成md5"""
m = hashlib.md5()
b = string.encode()
m.update(b)
return m.hexdigest()
@app.route('/async/', methods=['POST'])
def salt_async():
data = request.get_data()
data = json.loads(data)
cmd = data['cmd']
tgt = data['tgt']
reload_jid = data['reload_jid']
if reload_jid:
jid = 'cmdb_{}'.format(
make_md5('{}{}{}{}'.format(time.time(), data['cmd'], tgt, random.randint(1, 10000))))
jid = local.cmd_async(tgt, 'cmd.run', [cmd], full_return=True, jid=jid)
else:
jid = local.cmd_async(tgt, 'cmd.run', [cmd], full_return=True)
if jid == 0:
return '请检查{}连通性'.format(tgt)
return jid
if __name__ == '__main__':
app.run(port=31020)
3.2 py2
# -*- coding: utf-8 -*-
import json
import argparse
import requests
def get_options():
usage = """
/usr/bin/python2.7 %(prog)s -t self -c "ls -a" [-r yes]
-t: 指定minion_id
-c: 指定命令
-r: 是否重置jid -yes 重置 -no 原有生成方式
"""
parser = argparse.ArgumentParser(usage=usage)
parser.add_argument('-t', '--tgt', dest='tgt', required=True)
parser.add_argument('-c', '--cmd', dest='cmd', required=True)
parser.add_argument('-r', '--reload_jid', choices=['yes', 'no'], dest='reload_jid', default='no')
option = parser.parse_args()
return option
def async_request(tgt, cmd, reload_jid):
"""
异步请求
:param tgt: 目标
:param cmd: 命令
:param reload_jid: 是否重置jid
:return:
"""
data = {
'tgt': tgt,
'cmd': cmd,
'reload_jid': True if reload_jid == 'yes' else False
}
try:
jid = requests.post("http://127.0.0.1:31020/async/", json.dumps(data)).content
print jid
except Exception as e:
print '请求发生问题:{}'.format(str(e))
def entry():
option = get_options()
async_request(option.tgt, option.cmd, option.reload_jid)
if __name__ == '__main__':
entry()
3.3 py3
# -*- coding: utf-8 -*-
import json
import argparse
import requests
def get_options():
usage = """
/usr/bin/python3 %(prog)s -t self -c "ls -a" [-p yes]
-t: 指定minion_id
-c: 指定命令
-r: 是否重置jid
"""
parser = argparse.ArgumentParser(usage=usage)
parser.add_argument('-t', '--tgt', dest='tgt', required=True)
parser.add_argument('-c', '--cmd', dest='cmd', required=True)
parser.add_argument('-r', '--reload_jid', choices=['yes', 'no'], dest='reload_jid', default='no')
option = parser.parse_args()
return option
def async_request(tgt, cmd, reload_jid):
"""
异步请求
:param tgt: 目标
:param cmd: 命令
:param reload_jid: 是否重置jid
:return:
"""
data = {
'tgt': tgt,
'cmd': cmd,
'reload_jid': True if reload_jid == 'yes' else False
}
try:
jid = requests.post("http://127.0.0.1:31020/async/", json.dumps(data)).content.decode()
print(str(jid))
except Exception as e:
print('请求发生问题:{}'.format(str(e)))
def entry():
option = get_options()
async_request(option.tgt, option.cmd, option.reload_jid)
if __name__ == '__main__':
entry()