はじめに
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 上で確認するとこんな感じです。
■ エクスポートデータの編集
保存したワークフロー testwf1
のエクスポートデータを元に編集します。
ここでは、以下の図のように、ワークフロー内の jt2
を jt5
に差し替えて、新たなワークフロー testwf2
となるように編集します。
- 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 で確認します。
testwf2
が作成されています。
続いて、ワークフローの定義を確認します。
狙い通り jt5
に差し替わったワークフローになっています。
注意点: 既存オブジェクトの更新はできない
試した限り、既存のワークフローを上書きするようにインポートすることはできませんでした。おそらく、ワークフローの name
で存在確認をして、存在すれば何もしないという動作になっているのだと思います。タスクの実行ステータスとしては changed
ではなく、ok
でした。
tower_workflow_template
モジュールのほうを利用すれば、既存ワークフローの設定変更もできます。
■ まとめ
設定済みの ワークフローをエクスポートして、編集して再利用するする方法をご紹介しました。
エクスポートにはtower_receive
モジュール、インポートにはtower_send
モジュールを利用しました。
これらのモジュールはワークフロー以外にも組織、プロジェクト、インベントリなど様々なオブジェクトを扱えます。
オブジェクトの種類によっては、ちょっとした複製であれば GUI からでもできますが、いっぺんに大量に類似オブジェクトを作成する場合は、これらのモジュールは便利だと思いました。