##使用local_async而不是local。 这样做的好处是执行长流程的任务不会出现超时问题。
非常简单的例子:
import time
import requests
# 获取TOKEN的步骤省略
headers = {
"Accept":"application/json",
'X-Auth-Token':TOKEN,
}
data = {
'client':'local_async',
'expr_form': 'glob',
'tgt': 'minion1',
'fun': 'func.run_long_time',
}
res=requests.post(BASE_URL, data, headers=headers, verify=False, timeout=REQUEST_TIMEOUT)
# 获取job id
jid=res.json()['return'][0]['jid']
#轮询结果
while True:
job_url='{0}/jobs/{1}'.format(BASE_URL,jid)
res=requests.get(job_url, headers=headers, verify=False, timeout=REQUEST_TIMEOUT)
# TODO: 判断是否执行完成
time.sleep(5)
##检查job有没有在minion上执行
通过saltutil.find_job可以确定job有没有正在minion上运行,如果job没有运行,则尝试获取返回结果。
def _is_job_running(self, tgt, expr_form, jid):
"""判断job有没有正在minion上运行"""
res = sync_execute(tgt, "saltutil.find_job", arg=[jid], expr_form=expr_form)
try:
# {"return": [{"127.0.0.1": {"tgt_type": "glob", "jid": "20160402143702150218",
# "tgt": "127.0.0.1", "pid": 9354, "ret": "", "user": "saltapi",
# "arg": ["sleep 5;echo 123;"],
# "fun": "cmd.run"}}]
# }
# 有返回值说明job正在运行.
if res.json()["return"][0].values()[0]:
return True
else:
return False
except:
return False
##获取job的结果
这时会有两种情况:1. job的执行结果可以被正常获取到 2.找不到job的执行结果,出现这种情况说明job执行到一半被打断了,有可能是minion被关闭了,需要抛出异常。
headers = {"Accept": "application/json",
'X-Auth-Token': token,
}
job_url = '{0}/jobs/{1}'.format(self.api_endpoint, jid)
res = self.request("get", job_url, headers=headers)
LOG.debug(res.text)
try:
result = res.json()['info'][0]['Result']
except:
raise SaltApiException(res.text)
if not result:
raise SaltApiException("cloud not fetch job result, job is broken on minion.")