Terraform动态变量

时间:2017-12-07 13:49:06

标签: terraform

我创建子网作为单独的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要新得多。我错过了一些明显的东西吗?

1 个答案:

答案 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"] } } 块移动到模块内来改进这一点,这样可以减少重复次数。尽管如此......仍然在努力...