使用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的话,我认为这种方法也可以。

广告
将在 10 秒后关闭
bannerAds