1

我正在尝试实现一个 Terraform 脚本来创建多个子网。

resource "azurerm_subnet" "test_subnet" {
    name = "testSUBNET"
    resource_group_name = "${local.resource_group_name}"
    virtual_network_name = "${azurerm_virtual_network.lab_vnet.name}"
    address_prefix = "10.0.1.0/24"
}

有没有办法对变量执行 for-each 或循环以便同时创建它们?

此致!

4

3 回答 3

4

您可以使用变量和计数索引来实现此目的,如下所示:

variable "subnet_prefix" {
  type = "list"
  default = [
    {
      ip      = "10.0.1.0/24"
      name     = "subnet-1"
    },
    {
      ip      = "10.0.2.0/24"
      name     = "subnet-2"
    }
   ]
}

resource "azurerm_subnet" "test_subnet" {
    name = "${lookup(element(var.subnet_prefix, count.index), "name")}"
    count = "${length(var.subnet_prefix)}"
    resource_group_name = "${local.resource_group_name}"
    virtual_network_name = "${azurerm_virtual_network.lab_vnet.name}"
    address_prefix = "${lookup(element(var.subnet_prefix, count.index), "ip")}"
}

新版本中还为每个人提供了预览功能

于 2020-01-10T13:32:11.487 回答
1

如果您使用的是 Terraform 12,则可以使用for-each功能或count 功能来实现

如果您希望创建几乎相同的资源,则应使用count 。

for-each应该用于根据不同的映射或一组值创建多个每个实例。

使用字符串列表和toset()转换它的函数是实现此目的的一种巧妙方法

variable "subnet_ids" {
  type = list(string)
}

resource "aws_instance" "server" {
  for_each = toset(var.subnet_ids)

  ami           = "ami-a1b2c3d4"
  instance_type = "t2.micro"
  subnet_id     = each.key # note: each.key and each.value are the same for a set

  tags = {
    Name = "Server ${each.key}"
  }
}

或者您可以通过使用以下内容来实现此目的:

resource "azurerm_resource_group" "rg" {
  for_each = {
    a_group = "eastus"
    another_group = "westus2"
  }
  name     = each.key
  location = each.value
}

如果您希望使用 Terraform 11 来实现这一点,那么除了代码重复之外,countvariable功能是唯一的方法。(Rajat Arora 提到过)

我强烈建议使用 Terraform 12,因为在不久的将来,Terraform 11 的提供程序将不受支持,如果您现在可以免于重构,那么您应该这样做!

于 2020-01-14T05:00:57.920 回答
0

我正在尝试完成类似的事情。

variable "custom_role_list" {

  type        = list(object ({ service_principal_id = string, role = string }) )

} 

当我尝试从资源模块设置它时

resource "azurerm_role_assignment" "ad_sp_role_assignment" {

  scope                = azurerm_container_registry.acr.id
  for_each = var.custom_role_list
  role_definition_name           = each.value.role
  principal_id = each.value.service_principal_id

}

本质上,我正在尝试将 azure 容器注册表设置为与具有特定访问角色的多个服务主体一起使用。

以下是 var 定义。

custom_role_list = [
    {
        service_principal_id = aserviceprincipal.id
        role = "Contributor"
    },

    {
        service_principal_id = bserviceprincipal.id
        role = "Contributor"
    }


]

当我执行它时,我收到以下错误。

Error: Invalid for_each argument

  on ../modules/az-acr/main.tf line 46, in resource "azurerm_role_assignment" "ad_sp_role_assignment":
  46:   for_each = var.custom_role_list

The given "for_each" argument value is unsuitable: the "for_each" argument
must be a map, or set of strings, and you have provided a value of type list
of object.

请如果有人可以指导将非常有帮助。谢谢!

于 2020-03-30T22:24:39.897 回答