TerraformInventory で、TerrafromとAnsibleを2コマンドで連携させる

AWS運用自動化サービス「Cloud Automator」
この記事は1年以上前に書かれたものです。
内容が古い可能性がありますのでご注意ください。

全国のTerrafrom愛好家の皆様こんにちは。
技術4課の岩本です。

Terraformのプロビジョナーには非常に残念ながらAnsibleがありません。
通常であればTerraformで環境を構築後に、別途Ansible用のInventoryファイルを作成してという流れになりますが、
Inventoryファイルの作成なしにTerraform Inventoryを使って、TerraformとAnsibleを2コマンドで連携させてみました。

Terraform Inventory とは?

AnsibleのDynamicInventoryをTerrafromのStateファイルから生成するプログラムです。

Terraform Inventory

また、AWS以外にも

  • DigitalOcean
  • CloudStack
  • VMware
  • OpenStack
  • Google Compute Engine
  • SoftLayer
  • Exoscale
  • Scaleway

に対応しています。

インストール

Mac環境では brew からインストール可能です。

使い方

AnsibleのInventoryとして、terraform-inventoryを指定することで、
Terraformで作成したEC2インスタンスにAnsibleが実行されます。

  • 参照されるTerrafromのStateファイルは実行したコマンドを実行したディレクトリ内のものが参照されます。
  • 別ディレクトリ内にあるStateファイルを参照する場合は、環境変数TF_STATEで指定をします。

他にも、下記コマンドを実行することで、Stateファイル内からホスト/ホストグループを確認することができます。

やってみた

とりあえず作成したTerraformを使ってAWS環境を構築します。

  • main.tf

  • plan

  • apply

次に上記で作成されたStateファイルを指定し、Ansibleを実行します。
(ホストにPINGをおこなうだけの簡単なプレイブックです。)

タイトルには、2ステップとありましたが、実はterraform planを入れると3ステップとなります。
ごめんなさい、じゃっかんの釣りタイトルでした・・・
ですが、ご覧いただく通りInventoryの修正なしで、Ansibleの実行が可能です。

ただし、2ステップ(Planを入れると3ステップ)で実行をを行うには、Ansible側で工夫が少し必要でした。

  • setup.yml

Ansibleを適用する場合、ssh_configを作成し、InventoryファイルおよびGroup_varsを環境に応じて設定することが可能でした。

同じ様にGroup_versを利用するには、下記の様にtagsを設定します。

なお、Terraform Inventoryでは配布元で説明があるとおり、Ansibleで指定するホスト名は、
プロバイダ上でのホスト名ではなくTerraformで定義したリソース名となります。

This will provide the resource names and IP addresses of any instances found in the state file to Ansible, which can then be used as hosts patterns in your playbooks.

上記、Terraform内にて設定したタグは、ホストグループenv_devとして定義されますので、
group_versディレクトリ内に、env_dev.ymlファイルを設置します。

また、同様に

と設定し、AnsibleのPlaybook内では

と指定することで、役割毎に実行するPlaybookの変更も可能です。

上記2つを組み合わせることで、1つのTerraform・Playbookを元に開発・検証・本番などの様に
設定値だけを切り替える構成が、インフラ環境の構築からEC2内の設定まで可能となります。

夢が広がりますね!

では、また!!!

AWS運用自動化サービス「Cloud Automator」