awx api for python

693 阅读1分钟

代码描述: 通过调用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)