使用Terraform + Ansible来进行EC2的配置管理
概述
我试着使用 terraform-inventory 生成来自 .tfstate 文件的动态清单,并允许使用 Ansible 进行 terraform 资源的配置管理,因为在 Terraform 的 provisioner 中没有 Ansible。
要求
Terraform (Tested on 0.6.1)
terraform-inventory (Tested on 0.5)
安装
安装 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
需要注意的是,截至2015年8月12日,目前terraform-inventory仅支持AWS、DigitalOcean和CloudStack作为Terraform资源。
.tfstate文件
如果您想指定另一个路径,则默认情况下参考的是当前目录下的terraform.tfstate文件。您可以通过设置TF_STATE环境变量来指定其他路径。
运行ansible
vim 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
结论。
我使用Terraform和Ansible来管理AWS资源的配置。
虽然Terraform官方支持Chef作为配置管理工具,但如果已经使用Ansible的话,我认为这种方法也可以。