てくなべ (tekunabe)

ansible / network / automation

[Ansible] Tower/AWXのジョブテンプレートやワークフロージョブテンプレートを専用モジュールで起動する

はじめに

Ansible Tower / AWX の操作に対応する awx.awx コレクションには、ジョブテンプレートやワークフロージョブテンプレートを起動するモジュールがあります。

この記事では、簡単なサンプルをもとに使用例をご紹介します。

  • 検証環境
    • AWX 11.0

※ Ansible モジュールではなく、awx コマンドでジョブを起動する場合は、以下の記事をご参照ください [Ansible] awx コマンドでジョブの実行を終了までリアルタイムに見届ける(--monitor オプション) - てくなべ (tekunabe)


■ ジョブテンプレートの起動

ジョブテンプレートの起動には、awx.awx.tower_job_launch モジュールを利用します。

name オプションにジョブテンプレート名を指定します。

他にも、追加変数を指定する extra_vars や タグを指定する tag など、GUI の各オプションに対応するオプションが用意されています。詳細は、モジュールのドキュメント(のソース))を参照してください。

その1: 起動するだけ(ジョブの終了を待たない)

awx.awx.tower_job_launch モジュール単体で利用すると、ジョブテンプレートを起動すするだけして、ジョブの終了を待たずにタスクが終了します。

  • job_launch.yml
---
- hosts: tower
  gather_facts: false
  connection: local

  environment:  # 認証情報
    TOWER_HOST: "http://{{ ansible_host }}"
    TOWER_USERNAME: "{{ conn.tower_username }}"
    TOWER_PASSWORD: "{{ conn.tower_password }}"

  tasks:
    # ジョブテンプレートの起動
    - name: launch job
      awx.awx.tower_job_launch:
        name: jt_show             # ジョブテンプレート名

この Playbook を実行すると、ジョブテンプレートが起動します。ステータスは changed になります。

  • 実行(すぐ終わる)
$ ansible-playbook -i ../inventory.ini job_launch.yml 

PLAY [tower] *****************************************************************************************************

TASK [launch job] ************************************************************************************************
changed: [awx1]

PLAY RECAP *******************************************************************************************************
awx1                       : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

ジョブの終了は待たないので、この Playbook 終了後の AWX の画面では、まだジョブが実行中です。

f:id:akira6592:20200420211916p:plain:w400
まだジョブ実行中

その2: 起動してジョブの終了まで待つ

ジョブの終了まで待つ場合は、別途 awx.awx.tower_job_wait モジュールを併用します。

awx.awx.tower_job_launch のタスクの実行結果を register で拾うと、ジョブID(起動ごとに振られるID)id が取得できます。

この idawx.awx.tower_job_wait モジュールの job_id オプションに指定することで、ジョブの終了まで待つことができます。

  • job_launch_wait.yml
---
- hosts: tower
  gather_facts: false
  connection: local

  environment:  # 認証情報
    TOWER_HOST: "http://{{ ansible_host }}"
    TOWER_USERNAME: "{{ conn.tower_username }}"
    TOWER_PASSWORD: "{{ conn.tower_password }}"

  tasks:
    # ジョブテンプレートの起動
    - name: launch job
      awx.awx.tower_job_launch:
        name: jt_show             # ジョブテンプレート名
      register: res_jt_launch

    # ジョブの終了まで待つ
    - name: wait job
      awx.awx.tower_job_wait:
        job_id: "{{ res_jt_launch.id }}"  # 実行中のジョブIDを指定

この組み合わせにより、ジョブの終了まで待ってから、タスクを終了します。

  • 実行
$ ansible-playbook -i ../inventory.ini job_launch_wait.yml 

PLAY [tower] ******************************************************************************************************

TASK [launch job] *************************************************************************************************
changed: [awx1]

TASK [wait job] ***************************************************************************************************
ok: [awx1]    // ここで終了までそれなりに待つ

PLAY RECAP ********************************************************************************************************
awx1                       : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

待っている途中で、ジョブがエラーになると、タスクとしてもエラーになります。


■ ワークフロージョブテンプレートの起動

ワークフロージョブテンプレートの起動には、awx.awx.tower_workflow_launch モジュールを利用します。

name オプションにワークフロージョブテンプレート名を指定します。

他にも、追加変数を指定する extra_vars や タグを指定する tag など、GUI の各オプションに対応するオプションが用意されています。詳細は、モジュールのドキュメント(のソース)を参照してください。

その1: 起動するだけ(ジョブの終了を待たない)

awx.awx.tower_job_launch モジュールと違って、awx.awx.tower_workflow_launch モジュールでは、ジョブの終了を待つか待たないかを wait オプションでしていできます。

デフォルトは true なので待ちます。

まずは false (待たない)の場合の Playbook は以下のとおりです。

  • wf_lauch.yml
---
- hosts: tower
  gather_facts: false
  connection: local

  environment:  # 認証情報
    TOWER_HOST: "http://{{ ansible_host }}"
    TOWER_USERNAME: "{{ conn.tower_username }}"
    TOWER_PASSWORD: "{{ conn.tower_password }}"

  tasks:
    # ワークフロージョブテンプレートの起動
    - name: launch wf
      awx.awx.tower_workflow_launch:
        name: wf_show
        wait: false     # 待たない指定(デフォルト true)
      register: res_wf_launch
  • 実行(すぐ終わる)
$ ansible-playbook -i ../inventory.ini job_launch.yml 

PLAY [tower] ******************************************************************************************************

TASK [launch wf] **************************************************************************************************
changed: [awx1]

PLAY RECAP ********************************************************************************************************
awx1                       : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

この Playbook が終了直後は、まだワークフローは実行中です。

f:id:akira6592:20200420211949p:plain:w400
まだジョブ実行中

その2: 起動してジョブの終了まで待つ

待つ場合は wait オプション を true に指定します。デフォルトなので省略もできます。

  • wf_launch_wait.yml
---
- hosts: tower
  gather_facts: false
  connection: local

  environment:  # 認証情報
    TOWER_HOST: "http://{{ ansible_host }}"
    TOWER_USERNAME: "{{ conn.tower_username }}"
    TOWER_PASSWORD: "{{ conn.tower_password }}"

  tasks:
    # ワークフロージョブテンプレートの起動
    - name: launch wf
      awx.awx.tower_workflow_launch:
        name: wf_show
        wait: true     # 待つ指定(デフォルト)
      register: res_wf_launch
  • 実行
$ ansible-playbook -i ../inventory.ini wf_launch_wait.yml 

PLAY [tower] *****************************************************************************************************

TASK [launch wf] *************************************************************************************************
changed: [awx1]   // ここで終了までそれなりに待つ

PLAY RECAP *******************************************************************************************************
awx1                       : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

待っている途中で、どこかのジョブがエラーになると、タスクとしてもエラーになります。

途中で Approval ノードて止まってる場合も待ち続けます。タイムアウトtimeout 値で調整できます。 進めるには、別途承認操作が必要です。


おわりに

awx.awx.tower_job_launch モジュールや、awx.awx.tower_workflow_launch モジュールで、ジョブを起動する Playbook をご紹介しました。

GUI 以外の方法でジョブを起動したいときは便利ですね。

参考