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

Can I use more than one variables.tf file in Terraform?

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

但我想动态获取 AWS AMI ID。

因此,我正在尝试通过 Python 脚本动态创建第二个 variables.tf 文件(变量-amis.tf),该脚本使用 Boto 基于名称标签。

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

我可以将变量文件分成更小的文件吗?

我是不是在某些方面过度设计了?有没有更简单优雅的方法呢?

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

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

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

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 变量定义了两次。

然而,在您的特定情况下,与其编写 Python 脚本来根据标签查找 AMI,您最好使用 aws_ami data source.

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 并使用它来创建一个实例。