Terraform - у ресурса нет идентификатора атрибута при использовании функции слайса - PullRequest
0 голосов
/ 22 января 2019

Я использую вывод одного модуля, чтобы передать его другому:

output "subnets_id_wan" {
  value       = "${azurerm_subnet.wan.*.id}"
    depends_on = [
    "azurerm_subnet.wan",
  ]
}

На выходе я получаю

 security_groups_id_wan = [
    /subscriptions/111-222-333-4445/resourceGroups/default_resource_group/providers/Microsoft.Network/networkSecurityGroups/DF-DTAP-WAN-Subnet-Security-Group
    ]

Я передаю этот вывод ресурсу сетевого интерфейса

#Create network interface

resource "azurerm_network_interface" "public_ip" {

  count = "${var.enable_public_ip ? 1 : 0}"
  provider                  = "azurerm.base"
  name                      = "Network_Inteface_Public_IP_${var.env_name}_${var.azure_instance_names}"
  location                  = "${module.azure_vnet_dtap.resource_group_location}"
  resource_group_name       = "${module.azure_vnet_dtap.resource_group_name}"
  network_security_group_id = "${var.enable_security_group ? element(concat(azurerm_network_security_group.nsg.*.id,list("")),0) : element(concat(list("")),0)}"


  ip_configuration {
    name                          = "${var.env_name}_${var.ip_configuration_name}"
    #subnet_id                     = "${module.azure_vnet_dtap.subnets_id_single_wan}"
    subnet_id                     = "${element(module.azure_vnet_dtap.subnets_id_wan,count.index)}"
    private_ip_address_allocation = "${var.is_static_ip ? "static" : "dynamic"}"
    private_ip_address            = "${var.static_ip}"
    public_ip_address_id          = "${azurerm_public_ip.public_ip.id}"
  }

  tags = "${
    merge(map("Name", format("%s %s %s",var.env_name,var.azure_instance_names, "Public_IP_Interface")),var.global_tags, var.vpc_tags)}"
}

И vm код:

resource "azurerm_virtual_machine" "one_volume" {

  count = "${var.single_volume > 0 ? 1 : 0}"
  provider                         = "azurerm.base"
  name                             = "VM_${var.env_name}_${var.azure_instance_names}"
  location                         = "${module.azure_vnet_dtap.resource_group_location}"
  resource_group_name              = "${module.azure_vnet_dtap.resource_group_name}"
  availability_set_id              = "${azurerm_availability_set.availability_set.id}"  
  network_interface_ids            = ["${var.enable_public_ip ? element(concat(azurerm_network_interface.public_ip.*.id,list("")),0) : element(concat(azurerm_network_interface.no_public_ip.*.id,list("")),0)}"]
  vm_size                          = "${var.vm_size}"
  delete_os_disk_on_termination    = "true"
  delete_data_disks_on_termination = "true"

Все выше работает отлично

Теперь я изменил вывод, чтобы избавиться от подписки Azure

output "subnets_id_wan" {

  value = "${slice(split("/",join(",",azurerm_subnet.wan.*.id)), length(split("/",join(",",azurerm_subnet.wan.*.id)))-1, length(split("/",join(",",azurerm_subnet.wan.*.id))))}"
  depends_on = [
    "azurerm_subnet.wan",
  ]

выход:

security_groups_id_wan = [
   DF-DTAP-WAN-Subnet-Security-Group
]

при работе с terraform применяется получение:

* module.azure_vm.azurerm_virtual_machine.one_volume: 1 error(s) occurred:

* module.azure_vm.azurerm_virtual_machine.one_volume: Resource 'azurerm_network_interface.public_ip' does not have attribute 'id' for variable 'azurerm_network_interface.public_ip.*.id'

попробовал это как тест:

network_interface_ids            = ["${element(azurerm_network_interface.public_ip.*.id,count.index)}"]

но та же ошибка, если не использовать срез в выводе, все работает нормально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...