代码描述: 通过调用tower ansible api接口launch一个job template,同时输出tower ansible执行日志记录。
import requests
import optparse
import urllib3
import logging
import json
logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(levelname)s %(message)s")
from base64 import b64encode
urllib3.disable_warnings()
class TowerError(Exception):
'''Tower API Error'''
pass
class ARGS:
def __init__(self):
self.option = optparse.OptionParser(description='tower api for python')
self.option.add_option('--username',type=str,default=None,dest='username')
self.option.add_option('--password', type=str,default=None,dest='password')
self.option.add_option('--template', type=str,default=None,dest='template')
def get_args(self):
(option,args) = self.option.parse_args()
return [option.username,option.password,option.template]
class API:
def __init__(self,host,username,password,secure=True):
self._session = requests.Session()
self._session.verify = False
self._session.secure = secure
self._session.headers.update({'Content-Type':'application/json'})
self.host = "https://{}".format(host) if self._session.secure else "http://{}".format(host)
self.username = username
self.password = password
if self.username and self.password:
user_pass = "{0}:{1}".format(self.username,self.password).encode()
user_pass_encode = b64encode(user_pass).decode()
self._session.headers.update({'Authorization': "Basic {0}".format(user_pass_encode)})
response = self._session.get(self.host + '/api/me/')
if response.status_code == 401:
raise TowerError('UnathorizedError')
elif response.status_code == 403:
raise TowerError('AuthError')
def api_tmp(self,tmp_name):
return '/api/v2/job_templates/?search={}'.format(tmp_name)
def api_tmp_launch(self,tmp_id):
return '/api/v2/job_templates/{}/launch/'.format(tmp_id)
def api_job_event(self,job_id):
return '/api/v2/jobs/{}/job_events/'.format(job_id)
def api_job_status(self,job_id):
return '/api/v2/jobs/{}/'.format(job_id)
def get_tmp_id(self,tmp_name):
response = self._session.get(self.host + self.api_tmp(tmp_name))
return response.json()['results'][0]['id']
def launch_tmp(self,tmp_name):
tmp_id = self.get_tmp_id(tmp_name)
data = {"extra_vars":{"ansible_host":"xxx",
"ansible_user":"xxx",
"ansible_pass":self.password}}
response = self._session.post(self.host + self.api_tmp_launch(tmp_id),
data=json.dumps(data))
logging.log(logging.DEBUG,'job_id: {}'.format(response.json()['job']))
return response.json()['job']
def job_status(self,job_id):
response = self._session.get(self.host + self.api_job_status(job_id))
logging.log(logging.DEBUG,'status {}'.format(response.json()))
return response.json()['status']
def get_job_event(self,tmp_name):
job_id = self.launch_tmp(tmp_name)
while True:
import time;time.sleep(3)
response = self._session.get(self.host + self.api_job_event(job_id))
job_status = self.job_status(job_id)
logging.log(logging.DEBUG,'job_status: {}'.format(job_status))
logging.log(logging.DEBUG,'job event: {}'.format(response.json()))
if response.json()['results']:
for log in response.json()['results']:
print(log['stdout'].lstrip("\r\n").strip())
if job_status == 'successful':
return False
if __name__ == '__main__':
args = ARGS()
username = args.get_args()[0]
password = args.get_args()[1]
template = args.get_args()[2]
tower = API(host='x.x.x.x',
username=username,
password=password)
tower.get_job_event(template)