はじめに
2020/12/19 に、YouTube Live で「つまずき Ansible 【Part23】AWX をコマンドなどで操作する」という配信をしました。
実際に作業しながら(ときには)エラーと戦って進めるシリーズです。
今回は、AWX を画面以外で操作する方法を扱いしました。
- 環境
- AWX 15.0.0
動画
■ やったこと
API を直接叩く
AWX には API が備わっているのでそれを直接叩く方法です。
URL に ユーザー名とパスワードを直接埋め込む場合。ここではジョブテンプレートの一覧を取得。
今回は主に VS Code の REST Client という拡張を利用しました。
GET http://admin@password@192.168.1.141/api/v2/job_templates/ HTTP/1.1 Content-Type: application/json
トークンを利用する場合。
GET http://192.168.1.141/api/v2/job_templates/ HTTP/1.1 Content-Type: application/json Authorization: Bearer XXXXXXX_DUMMY_TOKEN_XXXXXXX
なお、トークンは AWX の各ユーザーの画面の「トークン」から作成できる。
追加する場合は、POST を利用して、リクエストボディを含めます。
POST http://192.168.1.141/api/v2/job_templates/ HTTP/1.1 Content-Type: application/json Authorization: Bearer XXXXXXX_DUMMY_TOKEN_XXXXXXX { "name": "jt_show999999999", "description": "", "job_type": "run", "inventory": 2, "project": 8, "playbook": "show2.yml" }
すでにあるものをもう一度作成しようとすると、エラーになる。
JobTemplate with this (organization, name) combination already exists.
API リファレンスは Ansible Tower のものを参照しました。
https://docs.ansible.com/ansible-tower/latest/html/towerapi/api_ref.html#/
awx コマンド
API をラップしたようなツールです。
インストール
pip install awx
接続、認証情報の設定。
export TOWER_HOST=http://192.168.1.141 export TOWER_OAUTH_TOKEN=XXXXXXX_DUMMY_TOKEN_XXXXXXX export TOWER_VERIFY_SSL=False
設定の確認。
awx config
ジョブテンプレートのリストの取得。
awx job_templates list
-f
オプションによるフォーマットの指定。
awx job_templates list -f human id name == ================= 7 Demo Job Template 9 jt_show 15 jt_show999999999
ジョブテンプレートの作成。インベントリなどは ID だけなく、名前でも指定可能。
awx job_templates create --name jt_show1111111 --project 8 --playbook show2.yml --inventory inv_sandbox
Ansible
awx.awx
collection の tower_* モジュールで操作可能です。
インベントリファイル。
[awx] awx01 ansible_host=192.168.1.141
Playbook。
--- - hosts: awx gather_facts: false connection: local environment: TOWER_HOST: "http://{{ ansible_host}}" TOWER_OAUTH_TOKEN: XXXXXXX_DUMMY_TOKEN_XXXXXXX tasks: - name: create jt awx.awx.tower_job_template: name: "jt99999999999999" inventory: inv_sandbox project: pj_tower-sample-nw playbook: show2.yml
Playbook 実行。
ansible-playbook -i inventory.ini jt.yml
なお、connection: local
を忘れた場合は以下のエラーが発生。AWX に SSH 接続を試みようとして以下のエラーに。今回は Ansible コントロールノードから AWX の API を叩く形なので、SSH 接続は不要。
fatal: [awx01]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}
今回は、awx.awx collection が 14.1.0 (ansilbe==2.10.4に付属)で、接続対象の AWX が 15.0.0 だったため、以下のバージョン不一致の警告が表示された。処理自体は正常にできた模様。
[WARNING]: You are running collection version 14.1.0 but connecting to tower version 15.0.0
なので、
ansible-galaxy collection install awx.awx:15.0.0 -f
として バージョンを合わせたところ警告は出なくなった。
また、同じ Playbook を実行したら、 changed ではなく ok になった。
おわりに
Web UI とそれ以外の操作応報をうまく使い分けていきたいと思います。
Part24 にむけて
以下のネタを検討中です。気が向いたものをやります。