てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Ansible Tower / AWX の設定済みオブジェクトをエクスポート、編集、インポートする(ワークフロー編)

はじめに

Ansible Tower / AWX で画面から設定を続けていくと、自動化したくなるのではないでしょうか。

これから新たに設定する分は、Ansible で Ansible Tower / AWX の各オブジェクトを管理できる tower_* モジュールを利用するのも手かと思います。

では、設定済みのオブジェクトを再利用して、新たに別オブジェクトを作成するにはどのようにすれば良いでしょうか。

tower_* モジュールの中には、設定済みオブジェクトの情報をエクスポートできる tower_receive モジュールと、そのフォーマットの情報を元にインポートできる、tower_send モジュールがあります(今日知りました)。Ansible 2.8 で追加されたモジュールです。

扱えるオブジェクトは、組織、プロジェクト、インベントリ、など様々ですが、この記事では例としてワークフローを対象とした方法をご紹介します。

  • 環境
    • Ansible 2.9.0
    • AWX 7.0.0


■ 環境の準備

以前の記事にも書きましたが、Ansible 側に ansible-tower-cli をインストールして、 ansible_python_interpreter を調整します。

https://tekunabe.hatenablog.jp/entry/2019/11/124/ansible_towerk_workflow_schema


■ 既存ワークフローのエクスポート

tower_receive モジュールを、copy モジュールを利用して、特定のワークフローの情報をエクスポートします。

エクスポート用 Playbook 作成

以下の Playbook を作成します。

  • wf_exp.yml
- hosts: tower
  gather_facts: no
  connection: local

  vars:
    # ansible-tower-cli をインストールした環境
    ansible_python_interpreter: /Users/akira/envs/venvs/a2900/bin/python
    
  tasks:
    - name: export workflow
      tower_receive:
        tower_host: "{{ ansible_host }}"
        tower_username: "{{ tower_username }}"  # 別途定義した認証情報
        tower_password: "{{ tower_password }}"  # 別途定義した認証情報
        validate_certs: no
        workflow:
          - testwf1
      register: result

    - name: save workflow
      copy:
        content: "{{ result.assets | to_nice_yaml }}"
        dest: wf_data.yml

tower_receive モジュールでは、様々なオブジェクトをエクスポートできます。今回は testwf1 という名前のワークフローのみを対象とするため、workflow オプションを利用して、testwf1 を指定しています。 もし、全ワークフローを対象とする場合は、workflow: all のように指定します。実行結果は変数 result に保存します。

次の copy モジュールのタスクで、result.assets の内容を、dest で指定したファイルに書き出します。

エクスポート用 Playbook 実行

Playbook を実行します。

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

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

TASK [export workflow] ******************************************************************
ok: [awx1]

TASK [save workflow] ********************************************************************
changed: [awx1]

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

wf_data.yml にエクスポートされたワークフロー testwf1 の情報が保存されます。

  • wf_data.yml
-   asset_relation:
        labels: []
        roles:
        -   name: Admin
            team: []
            user: []
        -   name: Execute
            team: []
            user: []
        -   name: Read
            team: []
            user: []
        -   name: Approve
            team: []
            user: []
        schedules: []
        survey_spec: {}
        workflow_nodes:
        -   always_nodes:
            - node3
            failure_nodes: []
            name: node0
            success_nodes: []
            unified_job_name: jt2
            unified_job_type: job
        -   always_nodes: []
            failure_nodes:
            - node2
            name: node1
            success_nodes:
            - node0
            unified_job_name: jt1
            unified_job_type: job
        -   always_nodes:
            - node3
            failure_nodes: []
            name: node2
            success_nodes: []
            unified_job_name: jt9999
            unified_job_type: job
        -   always_nodes: []
            failure_nodes: []
            name: node3
            success_nodes: []
            unified_job_name: jt3
            unified_job_type: job
    asset_type: workflow
    name: testwf1

なお、このワークフローは、GUI 上で確認するとこんな感じです。

f:id:akira6592:20191123205145p:plain
testfw1 のワークフロー定義


■ エクスポートデータの編集

保存したワークフロー testwf1 のエクスポートデータを元に編集します。

ここでは、以下の図のように、ワークフロー内の jt2jt5 に差し替えて、新たなワークフロー testwf2 となるように編集します。

f:id:akira6592:20191123205733p:plain
要件

  • wf_data.yml
-   asset_relation:
        labels: []
        roles:
        -   name: Admin
            team: []
            user: []
        -   name: Execute
            team: []
            user: []
        -   name: Read
            team: []
            user: []
        -   name: Approve
            team: []
            user: []
        schedules: []
        survey_spec: {}
        workflow_nodes:
        -   always_nodes:
            - node3
            failure_nodes: []
            name: node0
            success_nodes: []
            unified_job_name: jt5   # ここ編集
            unified_job_type: job
        -   always_nodes: []
            failure_nodes:
            - node2
            name: node1
            success_nodes:
            - node0
            unified_job_name: jt1
            unified_job_type: job
        -   always_nodes:
            - node3
            failure_nodes: []
            name: node2
            success_nodes: []
            unified_job_name: jt9999
            unified_job_type: job
        -   always_nodes: []
            failure_nodes: []
            name: node3
            success_nodes: []
            unified_job_name: jt3
            unified_job_type: job
    asset_type: workflow
    name: testwf2     # ここ編集

もちろん、エクポートしなくても1からこのフォーマットのファイルを作成してインポートもできます。ここでは、どのようなフォーマットかを確認する意味も込めて一旦エクスポートしています。


■ インポート

tower_send モジュールを利用して、先ほど編集したワークフローのデータを Ansible Tower / AWX にインポートします。

インポート用 Playbook 作成

以下の Playbook を作成します。

  • wf_imp.yml
- hosts: tower
  gather_facts: no
  connection: local

  # ansible-tower-cli をインストールした環境
  vars:
    ansible_python_interpreter: /Users/akira/envs/venvs/a2900/bin/python

  tasks:
    - name: import workflow
      tower_send:
        tower_host: "{{ ansible_host }}"
        tower_username: "{{ tower_username }}"  # 別途定義した認証情報
        tower_password: "{{ tower_password }}"  # 別途定義した認証情報
        validate_certs: no
        files:
          - wf_data.yml

インポート用 Playbook 実行

Playbook を実行します。

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

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

TASK [import workflow] ******************************************************************
changed: [awx1]

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

確認

GUI で確認します。

f:id:akira6592:20191123205542p:plain
testwf2 ができた

testwf2 が作成されています。

続いて、ワークフローの定義を確認します。

f:id:akira6592:20191123205823p:plain
testwf2 のワークフロー定義

狙い通り jt5 に差し替わったワークフローになっています。

注意点: 既存オブジェクトの更新はできない

試した限り、既存のワークフローを上書きするようにインポートすることはできませんでした。おそらく、ワークフローの name で存在確認をして、存在すれば何もしないという動作になっているのだと思います。タスクの実行ステータスとしては changed ではなく、ok でした。

tower_workflow_template モジュールのほうを利用すれば、既存ワークフローの設定変更もできます。


■ まとめ

設定済みの ワークフローをエクスポートして、編集して再利用するする方法をご紹介しました。

エクスポートにはtower_receive モジュール、インポートにはtower_send モジュールを利用しました。

これらのモジュールはワークフロー以外にも組織、プロジェクト、インベントリなど様々なオブジェクトを扱えます。

オブジェクトの種類によっては、ちょっとした複製であれば GUI からでもできますが、いっぺんに大量に類似オブジェクトを作成する場合は、これらのモジュールは便利だと思いました。