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