使用Terragrunt从一个Terraform模块创建多个对象

使用Terragrunt从一个Terraform模块创建多个对象,terraform,terragrunt,Terraform,Terragrunt,我通过terragrunt使用terraform。 我有一个文件夹,其中只有一个terragrunt.hcl文件。此文件的目的是在GCP中创建多个子网 为了创建子网络,我有一个模块,它接受多个输入 我希望能够在terragrunt.hcl文件中创建几个子网 我认为最好的方法是创建一个包含字典(或terraform称之为地图)的列表,然后对它们进行迭代 我有一些代码不起作用 下面是一些非工作代码 #terragrunt.hcl include { path = find_in_parent_

我通过terragrunt使用terraform。 我有一个文件夹,其中只有一个terragrunt.hcl文件。此文件的目的是在GCP中创建多个子网

为了创建子网络,我有一个模块,它接受多个输入

我希望能够在terragrunt.hcl文件中创建几个子网

我认为最好的方法是创建一个包含字典(或terraform称之为地图)的列表,然后对它们进行迭代

我有一些代码不起作用

下面是一些非工作代码

#terragrunt.hcl

include {
  path = find_in_parent_folders()
}

  inputs = {
    # Common tags to be assigned to all resources
    subnetworks = [
      {
        "subnetName": "subnet1-euw"
        "subNetwork": "10.2.0.0/16"
        "region": "europe-west1"
      },
      {
        "subnetName": "subnet1-usc1"
        "subNetwork": "10.3.0.0/16"
        "region": "us-central1"
      }
    ]
  }

terraform {
  module "subnetworks" {
    source = "github.com/MyProject/infrastructure-modules.git//vpc/subnetwork"
    vpc_name = "MyVPC"
    vpc_subnetwork_name = [for network in subnetworks: network.subnetName]
    vpc_subnetwork_cidr = [for network in subnetworks: network.subNetwork]
    vpc_subnetwork_region = [for network in subnetworks: network.region]
  }
}
似乎我不能在“地形”块内使用“模块”。希望代码至少显示了我想要实现的目标

作为参考,我调用的模块如下所示

#main.tf

terraform {
  # Intentionally empty. Will be filled by Terragrunt.
  backend "gcs" {}
}

resource "google_compute_subnetwork" "vpc_subnetwork" {
  name          = var.vpc_subnetwork_name
  ip_cidr_range = var.vpc_subnetwork_cidr
  region        = var.vpc_subnetwork_region
  network       = var.vpc_name
}

Terragrunt没有循环构造。在Terragrunt中,您可以使用目录层次结构来完成您在这里想要做的事情。例如,要实现上述目标,请执行以下操作:

└── live
    ├── empty.yaml
    ├── euw
    │   ├── region.yaml
    │   └── vpc
    │       └── terragrunt.hcl
    ├── terragrunt.hcl
    └── usc1
        ├── region.yaml
        └── vpc
            └── terragrunt.hcl
live/terragrunt.hcl
中,您可以在terragrunt配置中使用其他yaml文件:

# live/terragrunt.hcl
inputs = merge(
  # Configure Terragrunt to use common vars encoded as yaml to help you keep often-repeated variables (e.g., account ID)
  # DRY. We use yamldecode to merge the maps into the inputs, as opposed to using varfiles due to a restriction in
  # Terraform >=0.12 that all vars must be defined as variable blocks in modules. Terragrunt inputs are not affected by
  # this restriction.
  yamldecode(
    file("${get_terragrunt_dir()}/${find_in_parent_folders("region.yaml", "${path_relative_from_include()}/empty.yaml")}"),
  )
)
在每个区域的
region.yaml
中,您只需声明区域:

# live/euw/region.yaml
# These variables apply to this entire region. They are automatically pulled in using the extra_arguments
# setting in the root terraform.tfvars file's Terragrunt configuration.
region: "europe-west1"
现在,您可以将每个区域
terragrunt.hcl
文件中的区域作为变量引用:

# live/euw/vpc/terragrunt.hcl
terraform {
  source = "github.com/MyProject/infrastructure-modules.git//vpc/subnetwork"
}

include {
  path = find_in_parent_folders()
}

inputs = {
  vpc_subnetwork_name = "subnet1-${region}"
  vpc_subnetwork_cidr = "10.2.0.0/16"
  vpc_subnetwork_region = region
  vpc_name = "MyVPC"
}
此外:


您可能会发现来自Gruntwork的帮助。

在您的示例中,您正在为多个区域设置相同的CIDR。正如您在我的示例中看到的,不同的区域有不同的CIDR。如果您可以将我的示例中的两个子网络都包含在您的示例中,这可能会更清楚。谢谢当然,我认为布局很清晰,但我将其更新为显式。如果我们需要在yaml文件中表示地图,该怎么办?
# live/usc1/region.yaml
region: "us-central1"
# live/euw/vpc/terragrunt.hcl
terraform {
  source = "github.com/MyProject/infrastructure-modules.git//vpc/subnetwork"
}

include {
  path = find_in_parent_folders()
}

inputs = {
  vpc_subnetwork_name = "subnet1-${region}"
  vpc_subnetwork_cidr = "10.2.0.0/16"
  vpc_subnetwork_region = region
  vpc_name = "MyVPC"
}
# live/usc1/vpc/terragrunt.hcl
terraform {
  source = "github.com/MyProject/infrastructure-modules.git//vpc/subnetwork"
}

include {
  path = find_in_parent_folders()
}

inputs = {
  vpc_subnetwork_name = "subnet1-${region}"
  vpc_subnetwork_cidr = "10.3.0.0/16"
  vpc_subnetwork_region = region
  vpc_name = "MyVPC"
}