我可以在Terraform中使用多个variables.tf文件吗?

时间:2016-12-08 13:41:20

标签: python amazon-web-services terraform

我已在单个variables.tf文件中声明了所有变量。

但我想动态获取AWS AMI ID。

所以,我试图通过Python脚本动态创建第二个variables.tf文件(variables-amis.tf),该脚本使用Boto根据名称标签获取最新的AMI ID。

正如我在文档中所读到的,Terraform将使用将在工作路径中找到的每个.tf文件。

我可以将变量文件分解为较小的文件吗?

我是否以某种方式过度工程?有一种简单而优雅的方式吗?

1 个答案:

答案 0 :(得分:3)

Terraform会将文件夹中的所有.tf文件连接在一起,所以,是的,你可以简单地在其他文件中定义变量。

要记住的一件事是,如果在正在处理的文件夹中的多个文件中定义变量,0.7 Terraform将会出错。

所以如果你有这样的事情:

terraform
├── configuration.tf
├── main.tf
└── variables.tf

并且variables.tf包含:

variable "foo" { default = "foo" }
variable "bar" { default = "bar" }

和configuration.tf包含:

variable "foo" { default = "bar" }

这会导致Terraform错误,因为foo变量定义了两次。

在您的具体情况下,您可能最好使用aws_ami data source,而不是编写Python脚本来查找基于标记的AMI。

Terraform的数据源允许您通过查询远程数据源来传递动态配置。这可以是存储在某些后端(例如S3)中的脚本或远程状态,或者在这种情况下,您可以使用aws_ami数据源查询AWS API。

一个简短的例子(来自Terraform的aws_instance docs)就是这样的:

data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
  }
  filter {
    name = "virtualization-type"
    values = ["hvm"]
  }
  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "web" {
    ami = "${data.aws_ami.ubuntu.id}"
    instance_type = "t2.micro"
    tags {
        Name = "HelloWorld"
    }
}

这可以找到由099720109477帐户(Canonical)发布的AMI,其虚拟化类型为hvm,名称以ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*开头,可以提取最新的官方14.04图像。然后它接受AMI并使用它来创建一个实例。