てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] 「つまずき Ansible 【Part23】AWX をコマンドなどで操作する」ふりかえり

はじめに

2020/12/19 に、YouTube Live で「つまずき Ansible 【Part23】AWX をコマンドなどで操作する」という配信をしました。

実際に作業しながら(ときには)エラーと戦って進めるシリーズです。

今回は、AWX を画面以外で操作する方法を扱いしました。

tekunabe.connpass.com

  • 環境
    • AWX 15.0.0


動画

www.youtube.com

  • 0:00 イントロダクション
  • 2:57 API を叩く
  • 14:05 awx コマンドで操作
  • 25:10 Ansible(Playbook) で操作
  • 40:28 おわりに

■ やったこと

API を直接叩く

AWX には API が備わっているのでそれを直接叩く方法です。

URL に ユーザー名とパスワードを直接埋め込む場合。ここではジョブテンプレートの一覧を取得。

今回は主に VS CodeREST 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 の各ユーザーの画面の「トークン」から作成できる。

f:id:akira6592:20201219213232p:plain:w300
トークン画面

追加する場合は、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 にむけて

以下のネタを検討中です。気が向いたものをやります。

  • Ansible 2.10 関連
  • connection: local ななにか
  • ansible.cfg
  • Jinja2、フィルター
  • Windows
  • ESXi で VM作成
  • cli_parse モジュール(Part15 の続き)