我可以在 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 并使用它来创建一个实例。
我已经在单个 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 并使用它来创建一个实例。