Ansible Tower オブジェクト管理に関して

皆さんこんにちは、ソリューションアーキテクトの岡野です。
私から今回は、Ansible Tower のオブジェクトの管理方法についてご紹介したいと思います。

そもそも、このような記事を書くきっかけとなったのは、お客様からしばしば頂く以下のような質問です。

”複数の Ansible Tower 間でオブジェクトの移動って出来ますか?”

例えば検証環境と本番環境にそれぞれ Ansible Tower が存在し、検証環境でうまくいったら、そのオブジェクトをそのまま本番環境に移植したい。つまり、エクスポート、インポートのようなことを複数の Ansible Tower 間でやりたい、というリクエストです。

残念ながら現時点ではこのような機能は実装されていません。全てのオブジェクトの丸ごとコピーであればバックアップ・リストアで簡単に出来るのですが、特定のオブジェクトのみの移動は難しい、というのが現状でした。

ただ、面白い方法があります。ちょっと考え方を変えて、

"Ansible Tower のオブジェクト自体を Tower モジュールで管理する"

というのが今回のブログの趣旨です。Ansible には3,000を超えるモジュールがあって、いろんな端末を操ることが出来ますが、Ansible Tower 自体をモジュールで操ることも可能です。

イメージとしてはこんな感じです。
f:id:hokn5:20191205134328j:plain

Ansible Tower モジュール

https://docs.ansible.com/ansible/latest/modules/list_of_web_infrastructure_modules.html#ansible-tower

別に難しいことはなく、”Ansible Tower のオブジェクト自体をモジュールで管理することが出来る”

ということだけ理解していれば、あとはモジュールを使って書くだけです。♪
例えば、ジョブテンプレート作成の場合は以下の様に書くことが出来ます。

---
- name: Manage Job Template
  hosts: localhost

  tasks:
  - name: Manage Job Template
    tower_job_template:
      name: Apache Install
      tower_username: admin
      tower_password: password
      job_type: run
      inventory: Workshop Inventory
      project: Ansible Workshop Examples
      playbook: apache_install.yml
      credential: Workshop Credentials
      state: present
      become_enabled: yes

これで、Ansible Tower上にジョブテンプレートを作成することが出来ます。もちろん、stateを変数で定義し、作成・削除を管理することも可能です。ジョブテンプレート以外にも、認証情報、プロジェクト、インベントリなどなど、 Tower のオブジェクトに対応したモジュールもありますので、これらを使って Ansible Tower のオブジェクトを Ansible で、さらに言うと、Git 上で管理することが可能となります。Ansible Tower 3.6でサポートされた Webhook 機能を使えば、Git 上での Playbook の更新をトリガーに Tower 上のオブジェクトを自動で更新することも可能です。

ちなみに上記 Playbook 内で指定されている、Ansible Tower に関する認証情報ですが、 Ansible Tower の機能を使えば、登録された認証情報から "TOWER_USERNAME" 等の環境変数を使ってプレイブック内に自動で入力することが可能です(下記参照)。このあたりの認証情報の管理手法も Ansible Tower の有用な機能の一つです。

tower_username: "{{ lookup('env', 'TOWER_USERNAME') }}"
tower_password: "{{ lookup('env', 'TOWER_PASSWORD') }}"
tower_host: "{{ lookup('env', 'TOWER_HOST') }}"

Gitを使って Ansible Tower のオブジェクト自体も管理をする。この場合、Ansible Tower は便利な機能をギュッと詰め込んだ、オペレーションを橋渡しするハブと考えることが出来ます。面白い仕組みだと思います。コードで全てを管理したい方、是非ご検討ください!

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。