Ansible Tower(AWX)で実行したジョブのextra_varsを取得するツールを作ってみた

Ansible Tower(AWX)のジョブを実行する時に渡した `extra_vars` をGUI上から確認・コピペすることができますが取得するツールを勉強がてら作ってみました。
~~コピペできるとは知らなかったのはヒミツ~~

# 1. 作った理由

ジョブ実行者からうまく動作しなかったなどのデバッグをお願いされる時に大量の `extra_vars` があった時にいちいち小さい画面から見るのが面倒だったためです。
最新版のAWXであれば `EXPAND` が追加されており、クリックすれば別窓で `EXTRA VARIABLES` が確認できるようになりました。
ただ、一個一個確認するのもめんどうなのでジョブIDが分かれば `extra_vars` を取得できたら便利かなと思い作ってみました。

![スクリーンショット 2018-07-14 20.58.19.png](https://qiita-image-store.s3.amazonaws.com/0/180118/fea7d45a-ca1a-939b-0bec-57964f35f46c.png)

![スクリーンショット 2018-07-14 20.58.50.png](https://qiita-image-store.s3.amazonaws.com/0/180118/ab9d44b4-7206-564a-8d9a-e5ed014efc27.png)

Ansible Tower 3.2.5 には、まだこの機能はないようです。

# 2. awx-get-job-extv.py

```python
#!/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のものを指定した例

![スクリーンショット 2018-07-14 21.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/180118/a629358c-49b4-5554-0093-db31f0e3492f.png)

```shell-session
$ ./awx-get-job-extv.py -s 192.168.0.234 -id 4 --ssl --json-indent 2
Password:
{
  "MSG": [
    "HOGE",
    "FUGA",
    "TEST"
  ]
}
```

AWXで使う場合でジョブIDが5のものを指定した例

![スクリーンショット 2018-07-14 21.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/180118/5c67ac43-fd73-cfdd-ae87-a4a10386aece.png)

```shell-session
$ ./awx-get-job-extv.py -s 192.168.0.237 -id 5 --json-indent 2
Password:
{
  "MSG": [
    "HOGE",
    "FUGA",
    "TEST"
  ]
}
```