我已在单个variables.tf文件中声明了所有变量。
但我想动态获取AWS AMI ID。
所以,我试图通过Python脚本动态创建第二个variables.tf文件(variables-amis.tf),该脚本使用Boto根据名称标签获取最新的AMI ID。
正如我在文档中所读到的,Terraform将使用将在工作路径中找到的每个.tf
文件。
我可以将变量文件分解为较小的文件吗?
我是否以某种方式过度工程?有一种简单而优雅的方式吗?
答案 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并使用它来创建一个实例。