てくなべ (tekunabe)

ansible / network / automation

[Ansible] Collection 版の tower モジュールでワークフローを作成する(tower_workflow_job_template/tower_workflow_job_template_node)

はじめに

以前の記事で、Ansible Tower / AWX の各種オブジェクトを作成、管理できる tower モジュールのうち、Collection 版のモジュールについてご紹介しました。

tekunabe.hatenablog.jp

Collection 版のモジュールでは、ワークフローを扱うモジュールとしては新たに、以下の2つが開発されています。

  • tower_workflow_job_template モジュール
  • tower_workflow_job_template_node モジュール

もともとあった、tower_workflow_template とは別物で、内部で tower-cli を利用していないタイプであり、後継版ような位置づけです。

この記事では、tower_workflow_job_templatetower_workflow_job_template_node モジュールを利用して、簡単なワークフローを作成するサンプルをご紹介します。


■ 目指すワークフロー

こんな感じのワークフローを作ることにします。

f:id:akira6592:20200403201625p:plain
目指すワークフロー

nodexxx は、各ノードを内部的に識別する id のようなもので、上図には独自に付加しました。GUI で設定する場合は意識しないのですが、あとで Playbook に出てきます。


■ 準備

まず予め、ansible-galaxy collection install awx.awx でモジュールをインストールします。

詳細はこちら: [Ansible] tower モジュールの最近の事情と Collection 版モジュールの使い方 - てくなべ (tekunabe)


■ Playbook

手抜きですが、実行するジョブテンプレートはすべて同じです。

本当はノードの作成とリンクをいっぺんにやりたかったのですが、先にノードが作成された後でないとリンクできないようでした。そのため、先にノード作成、あとでリンク、というように別のタスクにしています。

※ 少し改善版はこちら: [Ansible] tower_workflow_job_template_node モジュールでノード定義とリンク定義をうまくやる - てくなべ (tekunabe)

また、node301 では、「[Ansible/AWX] ワークフローですべてのジョブが正常で収束したときみ処理を進めるには(CONVERGENCEオプション) - てくなべ (tekunabe)」でもご紹介したCONVERGENCE オプションの「すべて」を再現するために、all_parents_must_converge: true を指定しています。

すべてのオプションについての説明は、ansible-doc コマンドで参照してください。

  • ansible-doc awx.awx.tower_workflow_job_template_node
  • ansible-doc awx.awx.tower_workflow_job_template_node_node
- hosts: tower
  gather_facts: no
  connection: local

  vars:
    conn: &conn
      tower_host: https://AWXのホスト
      tower_username: admin
      tower_password: xxxx
      validate_certs: no

  tasks:
    ################################################
    # ワークフロージョブテンプレート本体の作成
    - name: creat WFJT
      awx.awx.tower_workflow_job_template:
        <<: *conn
        name: test_WF   # 名前

    ################################################
    # ワークフローノードの作成

    # 左の列
    - name: create WFJT node101
      awx.awx.tower_workflow_job_template_node:
        <<: *conn
        identifier: node101   # 内部識別ID
        unified_job_template: tower-sample-ok # 実行するジョブテンプレート
        workflow_job_template: test_WF        # 関連付けるワークフロージョブテンプレート名

    # 真ん中の列 3つ
    - name: create WFJT node201
      awx.awx.tower_workflow_job_template_node:
        <<: *conn
        identifier: node201
        unified_job_template: tower-sample-ok
        workflow_job_template: test_WF

    - name: create WFJT node202
      awx.awx.tower_workflow_job_template_node:
        <<: *conn
        identifier: node202
        unified_job_template: tower-sample-ok
        workflow_job_template: test_WF

    - name: create WFJT node209
      awx.awx.tower_workflow_job_template_node:
        <<: *conn
        identifier: node209
        unified_job_template: tower-sample-ok
        workflow_job_template: test_WF

    # 右の列
    - name: create WFJT node301
      awx.awx.tower_workflow_job_template_node:
        <<: *conn
        identifier: node301
        unified_job_template: tower-sample-ok
        workflow_job_template: test_WF
        all_parents_must_converge: true  # すべてのノードが成功で収束したときのみ実行

    ################################################
    # ワークフローノード間のリンクの作成

    - name: link 100 to 200
      awx.awx.tower_workflow_job_template_node:
        <<: *conn
        identifier: node101
        workflow_job_template: test_WF
        success_nodes:  # 成功時に進めるノード(緑のリンク)
          - node201
          - node202
        failure_nodes:  # 障害発生時に進めるノード(赤のリンク)
          - node209

    - name: link 201 to 301
      awx.awx.tower_workflow_job_template_node:
        <<: *conn
        identifier: node201
        workflow_job_template: test_WF
        success_nodes: # 成功時に進めるノード(緑のリンク)
          - node301

    - name: link 202 to 301
      awx.awx.tower_workflow_job_template_node:
        <<: *conn
        identifier: node202
        workflow_job_template: test_WF
        success_nodes: # 成功時に進めるノード(緑のリンク)
          - node301


■ 実行

Playbook を実行します。

$ ansible-playbook -i ../inventory.ini wf01.yml 

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

TASK [creat WFJT] ************************************************************************************************
changed: [awx1]

TASK [create WFJT node101] ***************************************************************************************
changed: [awx1]

TASK [create WFJT node201] ***************************************************************************************
changed: [awx1]

TASK [create WFJT node202] ***************************************************************************************
changed: [awx1]

TASK [create WFJT node209] ***************************************************************************************
changed: [awx1]

TASK [create WFJT node301] ***************************************************************************************
changed: [awx1]

TASK [link 100 to 200] *******************************************************************************************
changed: [awx1]

TASK [link 201 to 301] *******************************************************************************************
changed: [awx1]

TASK [link 202 to 301] *******************************************************************************************
changed: [awx1]

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


■ 確認

AWX 側で確認します。

f:id:akira6592:20200403201729p:plain
ワークフロージョブテンプレート本体の確認

f:id:akira6592:20200403201813p:plain
ワークフローの確認

無事に作れました。


■ まとめ

tower_workflow_job_templatetower_workflow_job_template_node モジュールを利用して、ワークフローを作成する Playbook をご紹介しました。

tower-cli を利用しなくていい点や、分岐からの収束するワークフローも作れるのが良いと思いました。もともとあった tower_job_template モジュールの schema オプションでは表現できなかった気がします。