Ansible Tower(AWX)のジョブを実行する時に渡した extra_vars
をGUI上から確認・コピペすることができますが取得するツールを勉強がてら作ってみました。
コピペできるとは知らなかったのはヒミツ
1. 作った理由
ジョブ実行者からうまく動作しなかったなどのデバッグをお願いされる時に大量の extra_vars
があった時にいちいち小さい画面から見るのが面倒だったためです。
最新版のAWXであれば EXPAND
が追加されており、クリックすれば別窓で EXTRA VARIABLES
が確認できるようになりました。
ただ、一個一個確認するのもめんどうなのでジョブIDが分かれば extra_vars
を取得できたら便利かなと思い作ってみました。
Ansible Tower 3.2.5 には、まだこの機能はないようです。
2. awx-get-job-extv.py
#!/usr/bin/env python3
from getpass import getpass
import sys
import argparse
import json
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def options():
parser = argparse.ArgumentParser(prog="awx-get-job-extv.py",
add_help=True,
description="Get extra_vars from the job result executed with Ansible Tower(AWX).")
parser.add_argument("--server", "-s",
type=str, required=True,
help="Specify IP or host name of Ansible Tower(AWX).")
parser.add_argument("--user", "-u",
type=str, default="admin",
help="Specify Ansible Tower(AWX) user.")
parser.add_argument("--password", "-p",
type=str,
help="Specify ANsible Tower(AWX) user password.")
parser.add_argument("--job-id", "-id",
type=int, required=True,
help="Specify job id of get extra_vars.")
parser.add_argument("--json-indent",
type=int,
help="Specify JSON indent number.")
parser.add_argument("--ssl",
action="store_true",
help="Specify when using SSL connection.")
parser.add_argument("--ssl-verify",
action="store_true",
help="Enable server certificate check.")
args = parser.parse_args()
if(not(args.password)):
args.password = getpass()
return args
def create_url(args, path):
if(args.ssl):
url = "https://%s%s" % (args.server, path)
else:
url = "http://%s%s" % (args.server, path)
return url
def main():
args = options()
url = create_url(args, "/api/v2/jobs")
headers = {"Content-Type": "application/json"}
results = []
ssl_verify = True if(args.ssl_verify) else False
while True:
try:
r = requests.get(url,
headers=headers,
auth=(args.user, args.password),
verify=ssl_verify)
except Exception as e:
print("Error: %s" % e)
if(r.status_code == 200):
next_path = json.loads(r.text)["next"]
if(next_path):
url = create_url(args, next_path)
for r in json.loads(r.text)["results"]:
results.append(r)
else:
for r in json.loads(r.text)["results"]:
results.append(r)
break
else:
print("Error")
print("status code: %s" % r.status_code)
print(r.text)
sys.exit(1)
for job in results:
if(args.job_id == job["id"]):
if (args.json_indent):
print(json.dumps(json.loads(job["extra_vars"]), indent=args.json_indent))
sys.exit(0)
else:
print(job["extra_vars"])
sys.exit(0)
print("job id %s not found." % args.job_id)
if __name__ == "__main__":
main()
3. 使い方
Ansible Towerで使う場合でジョブIDが4のものを指定した例
$ ./awx-get-job-extv.py -s 192.168.0.234 -id 4 --ssl --json-indent 2
Password:
{
"MSG": [
"HOGE",
"FUGA",
"TEST"
]
}
AWXで使う場合でジョブIDが5のものを指定した例
$ ./awx-get-job-extv.py -s 192.168.0.237 -id 5 --json-indent 2
Password:
{
"MSG": [
"HOGE",
"FUGA",
"TEST"
]
}