Azure Terraform:使用If/Else模式将资源属性分配给资源参数

Azure Terraform:使用If/Else模式将资源属性分配给资源参数,azure,terraform,Azure,Terraform,我正在使用Terraform来构建一个NIC,有没有公共IP。分配NIC时会出现问题。我找不到一种技术可以让我选择用于创建带有或不带公共IP的NIC的资源。使用三元操作失败,因为其中一个资源不存在。将资源放在列表中不会插值。如何分配正确的资源输出 resource "azurerm_public_ip" "public_ip" { count = "${var.assign_public_ip}" name

我正在使用Terraform来构建一个NIC,有没有公共IP。分配NIC时会出现问题。我找不到一种技术可以让我选择用于创建带有或不带公共IP的NIC的资源。使用三元操作失败,因为其中一个资源不存在。将资源放在列表中不会插值。如何分配正确的资源输出

resource "azurerm_public_ip" "public_ip" {
    count                        = "${var.assign_public_ip}"
    name                         = "${format("${var.name}-pip%02d", count.index)}"
    location                     = "${var.location}"
    resource_group_name          = "${var.resource_group_name}"
    public_ip_address_allocation = "static"

    tags {
        environment = "${var.resource_group_name}"
    }
}

resource "azurerm_network_interface" "nic_with_public_ip" {
    count               = "${var.assign_public_ip}"
    name                = "${format("${var.name}-nic%02d", count.index)}"
    location            = "${var.location}"
    resource_group_name = "${var.resource_group_name}"

    ip_configuration {
        name                          = "ip_cfg"
        subnet_id                     = "${var.subnet_id}"
        private_ip_address_allocation = "dynamic"
        public_ip_address_id          = "${azurerm_public_ip.public_ip.id}"
    }
}

resource "azurerm_network_interface" "nic" {
    count               = "${1 - var.assign_public_ip}"
    name                = "${format("${var.name}-nic%02d", count.index)}"
    location            = "${var.location}"
    resource_group_name = "${var.resource_group_name}"

    ip_configuration {
        name                          = "ip_cfg"
        subnet_id                     = "${var.subnet_id}"
        private_ip_address_allocation = "dynamic"
    }
}

resource "azurerm_virtual_machine" "centos" {
    count                 = "${var.count}"
    name                  = "${format("${var.name}%02d", count.index)}"
    location              = "${var.location}"
    resource_group_name   = "${var.resource_group_name}"
    network_interface_ids = ["${var.assign_public_ip == 1 ? azurerm_network_interface.nic_with_public_ip.id : azurerm_network_interface.nic.id }"]
    vm_size               = "${var.size}"
    delete_os_disk_on_termination = true
    delete_data_disks_on_termination = true

    storage_image_reference {
        publisher = "OpenLogic"
        offer     = "CentOS"
        sku       = "7.3"
        version   = "latest"
    }

    storage_os_disk {
        name              = "${format("${var.name}-osdisk%02d", count.index)}"
        caching           = "ReadWrite"
        create_option     = "FromImage"
    }

    os_profile {
        computer_name  = "${format("${var.name}%02d", count.index)}"
        admin_username = "${var.admin_user}"
    }

    os_profile_linux_config {
        disable_password_authentication = true
        ssh_keys = {
            path = "/home/${var.admin_user}/.ssh/authorized_keys"
            key_data = "${var.ssh_key}"
    }
  }

  tags {
      environment = "${var.name}"
  }
}
此操作失败,出现以下错误: 运行计划时出错:发生1个错误:

* module.jumphost.azurerm_virtual_machine.centos: 1 error(s) occurred:

* module.jumphost.azurerm_virtual_machine.centos: Resource 'azurerm_network_interface.nic' not found for variable 'azurerm_network_interface.nic.id'

在resource azurerm_virtual_machine中,更改为azurerm_network_interface.nic.*.id

在resource azurerm_virtual_machine中,更改为azurerm_network_interface.nic.*.id

可以使用splat表达式获取从资源块创建的实例的属性值列表,该实例的计数为:

当count=0时,返回一个空列表。在这种情况下,在所有计数中始终有一个总数,可以利用concat来选择其中一个:

network_interface_ids = "${concat(azurerm_network_interface.nic_with_public_ip.*.id, azurerm_network_interface.nic.*.id)}"

由于network\u interface\u id已经是一个列表,我们可以在这里直接分配concat的结果。由于在这些资源上如何分配count,我们知道此列表将始终只有一个元素,从而实现选择活动元素的预期结果。

可以使用splat表达式获取从具有count的资源块创建的实例的属性值列表:

当count=0时,返回一个空列表。在这种情况下,在所有计数中始终有一个总数,可以利用concat来选择其中一个:

network_interface_ids = "${concat(azurerm_network_interface.nic_with_public_ip.*.id, azurerm_network_interface.nic.*.id)}"

由于network\u interface\u id已经是一个列表,我们可以在这里直接分配concat的结果。由于对这些资源分配计数的方式,我们知道此列表将始终只有一个元素,从而实现选择活动元素的预期结果。

您能更明确一些吗?我试了两种方法来回答你,但都不管用。将行更改为network\u interface\u ids=[${var.assign\u public\u ip==1?azurerm\u network\u interface.nic.*.id:azurerm\u network\u interface.nic.*.id}]或network\u interface\u ids=[${var.assign\u public\u ip==1?azurerm\u network\u interface.nic\u with\u public\u ip.id:azurerm\u network\u interface.nic.*.id}]两个人都给了我你能说得更清楚一点吗?我试了两种方法来回答你,但都不管用。将行更改为network\u interface\u ids=[${var.assign\u public\u ip==1?azurerm\u network\u interface.nic.*.id:azurerm\u network\u interface.nic.*.id}]或network\u interface\u ids=[${var.assign\u public\u ip==1?azurerm\u network\u interface.nic\u with\u public\u ip.id:azurerm\u network\u interface.nic.*.id}]两人都犯了错误。这很有效,谢谢你的帮助。我对作业做了一个小修改,把它列成了一个列表。再次感谢这工作做得很好,谢谢你的帮助。我对作业做了一个小修改,把它列成了一个列表。再次感谢