Overview
TerraformのprovisionerにはAnsibleがないが terraform-inventory が .tfstateファイルからdynamic inventoryを生成しAnsibleでのterraformリソースの構成管理を可能にしてくれるようなので試してみた。
Requirements
- Terraform (Tested on 0.6.1)
- terraform-inventory (Tested on 0.5)
Installation
golangのインストール
CentOS
yum install golang --enablerepo=epel
Debian系
apt-get install golang
terraform-inventoryをインストール
$ export GOPATH=/usr/local/go
$ go get github.com/adammck/terraform-inventory
$ export PATH=$PATH:/usr/local/go/bin
$ which terraform-inventory
なおterraform-inventoryがサポートしているTerraformリソースとしては、2015/08/12現在 AWS, DigitalOcean, CloudStack のみなのに注意。
.tfstateファイル
デフォルトはカレントディレクトリのterraform.tfstate
を参照する。
別のパスを指定したい場合はTF_STATE
環境変数で指定する。
ansible実行
vim test.yml
test.yml
- hosts: all
remote_user: ec2-user
tasks:
- name: Hello
command: echo Hello!
$ export PATH=$PATH:/usr/local/go/bin
$ ansible-playbook -i $(which terraform-inventory) test.yml
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [52.69.47.41]
TASK: [Hello] *****************************************************************
changed: [52.69.47.41]
PLAY RECAP ********************************************************************
52.69.47.41
実行出来た。
なお生成されるinventoryは.tfファイルのリソースブロックのNAME
に当たる部分がホスト名になる。
例えば
resource "aws_instance" "web" {
ami = "ami-123456"
instance_type = "m1.small"
}
というリソース定義ならweb
がホスト名になるのでplaybookでは
- hosts: web
remote_user: ec2-user
tasks:
- name: Hello
command: echo Hello!
と書ける。
terraformとの連携
provisioner
ブロックの発火タイミングではまだ.tfstateファイルが生成されていないのでterraform実行後にansibleを発火する必要がある。
terraform apply
cat terraform.tfstate
ansible -i $(which terraform-inventory) all -m ping
Conclusion
TerraformとAnsibleでAWSリソースの構成管理をした。
Terraformが公式にサポートしているprovisionerとしてはChefがあるが既にAnsibleを使ってる場合はこの方法でもいいかなと思った。