我创建子网作为单独的terraform模板的一部分,并按如下方式导出ID。
private void buttonSearch_Click(object sender, EventArgs e)
{
listBoxAddedIntegers.SelectedItems.Clear();
var itemsFound = listBoxAddedIntegers.Items.Where(i=>i.ToString().ToLower().Contains(textBoxSearch.Text.ToLower())).ToList();
if(itemsFound == null)
{
MessageBox.Show("No matches found.");
}
else
{
MessageBox.Show("Found " + itemsFound.Count + " matches.");
}
}
然后我打算在另一个模板中查找这些ID,这个模板可以重复用于配置多个环境。下面的示例显示我的第二个模板是调用模块来配置EC2实例并通过subnet_id。
output "subnet-aza-dev" {
value = "${aws_subnet.subnet-aza-dev.id}"
}
output "subnet-azb-dev" {
value = "${aws_subnet.subnet-azb-dev.id}"
}
output "subnet-aza-test" {
value = "${aws_subnet.subnet-aza-test.id}"
}
output "subnet-azb-test" {
value = "${aws_subnet.subnet-azb-test.id}"
}
...
我想做的是将环境变量作为查找subnet_id的一部分传递,例如。
variable "environment" {
description = "Environment name"
default = "dev"
}
module "sql-1-ec2" {
source = "../modules/ec2winserver_sql"
...
subnet_id = "${data.terraform_remote_state.env-shared.subnet-aza-dev}"
}
但是我知道不支持变量插值。我尝试使用第一个terraform模板中的地图将它们全部导出到“子网”中。然后我可以使用它从第二个模板中查找。这不起作用,因为我无法在地图中输出变量。
这种设计模式是我以前在CloudFormation中使用过的,但是我对terraform要新得多。我错过了一些明显的东西吗?
答案 0 :(得分:0)
使用数据源
制定了一种方法Diff
虽然这有效并且满足了我的原始需求,但我希望通过将variable "environment" {
description = "Environment name"
default = "dev"
}
module "sql-1-ec2" {
source = "../modules/ec2winserver_sql"
...
subnet_id = "${data.aws_subnet.subnet-aza.id}"
}
data "aws_subnet" "subnet-aza" {
filter {
name = "tag:Name"
values = ["${var.product}-${var.environment}-${var.environmentno}-subnet-aza"]
}
}
data "aws_subnet" "subnet-azb" {
filter {
name = "tag:Name"
values = ["${var.product}-${var.environment}-${var.environmentno}-subnet-azb"]
}
}
块移动到模块内来改进这一点,这样可以减少重复次数。尽管如此......仍然在努力...