我正在尝试使用 Terraform 0.12+ 及其新的 for_each 在 Azure 中构建多个 vnet,但遇到了一些麻烦。我希望新功能能够让我创建一个接受复杂变量的通用网络模块,但我可能已经达到了它的极限,或者只是没有正确地思考它。本质上我的变量是这样构建的
variable "networks" {
type = list(object({ name = string, newbits = number, netnum = number, subnets = list(object({ name = string, newbits = number, netnum = number}))}))
}
Run Code Online (Sandbox Code Playgroud)
您可以看到它是一个网络数组,其中包含该网络的子网子数组。这样做可以轻松记录网络,而无需额外的 terraform 资源需求,因此我们的网络团队可以轻松调整/扩展,而无需担心了解 HCL。
我可以使用计数及其索引执行构建多个 vnet 资源的必要功能,但我想使用 for_each,因为它允许对键进行索引,而不是可能随时间变化的计数(需要重新部署,而我们不能做)。
网络对象
networks = [
{
# x.x.1.0/24
name = "DMZ",
newbits = "8",
netnum = "1",
subnets = [
{
# x.x.1.0/25
name = "DMZ"
newbits = "9",
netnum = "2"
}
]
},
{ …Run Code Online (Sandbox Code Playgroud) 我已经在网上阅读了这些文章,但它们似乎没有完全涵盖这个主题,希望已经完成的人可以为我提供一些指导。我们正在设置一个复杂的 Terraform 模板,以满足与我们的 SaaS 产品相关的 IaC 要求。这样做时,我们希望模板在启动时使用用户的凭据在 Azure AD 中创建新的服务主体(这部分我没有问题)。然后在模板的下一部分中,我们将使用该服务主体作为提供者。问题是它在计划/应用中抛出错误,因为服务主体不存在(也就是由于服务提供者部分尚未运行,id 不存在)。那么有没有办法做到这一点?创建一个服务主体,然后在使用该服务主体而不将其拆分为多个模板的提供程序别名中使用它?
最后,我希望此模板使用本地用户的权限或 MSI 创建服务提供者,将 RBAC 赋予订阅,然后使用该服务提供者在该订阅中创建资产。
main.ts(根)
provider "azurerm" {
alias = "ActiveDirectory"
subscription_id = "${var.subscriptionNucleus}"
}
provider "azurerm" {
alias = "Infrastructure"
subscription_id = "${var.subscriptionInfrastructure}"
}
module "activedirectory" {
providers = { azurerm = "azurerm.ActiveDirectory"
}
source = "./modules/activedirectory"
subscription_id_infrastructure = "${var.subscriptionInfrastructure}"
}
module "infrastructure" {
providers = { azurerm = "azurerm.Infrastructure"}
source = "./modules/infrastructure"
location = "${var.location}"
application_id =
"${module.activedirectory.service_principal_application_id}"
subscription_id = "${var.subscriptionInfrastructure}"
prefix = "${var.prefix}"
}
Run Code Online (Sandbox Code Playgroud)
main.ts …