Невозможно проанализировать network_interface_id как идентификатор ресурса: Невозможно проанализировать AzureID: разобрать module.network.azurerm_network_interface.primary.id: invalidURIforrequest - PullRequest
0 голосов
/ 07 апреля 2020
on modules/security_group/main.tf line 64, in resource "azurerm_network_interface_security_group_association" "primary":
      64:   resource "azurerm_network_interface_security_group_association" "primary" {

Я получаю вывод выше с помощью команды "terraform validate". Ниже приведена конфигурация, которую я использовал для terraform. Вот дерево, с которым я работаю как модуль

├── main.tf
    └── modules
        ├── network
        │   ├── main.tf
        │   ├── variable.tf
        │   └── variable.tfvars
        ├── resource
        │   ├── main.tf
        │   ├── variable.tf
        │   └── variable.tfvars
        ├── security_group
        │   ├── main.tf
        │   ├── variable.tf
        │   └── variable.tfvars
        ├── storage
        │   ├── main.tf
        │   ├── variable.tf
        │   └── variable.tfvars
        └── vm
            ├── main.tf
            ├── variable.tf
            └── variable.tfvars

main.cf:

#Select provider
    provider "azurerm" {
      subscription_id = "xxxxxxxxxxxxxxxxxxxxxxxxx"
      version = "~> 2.4"
      features {}
    }
  module "resource" {
      source = "./modules/resource"
      resource_group_name = "devops_primary"
      location = "southeastasia"
    }
   module "network" {
      source = "./modules/network"
      virtual_network = "primaryvnet"
      subnet = "primarysubnet"
      address_space = "192.168.0.0/16"
      address_prefix = "192.168.1.0/24"
      public_ip = "backendvmpip"
      location = "southeastasia"
      primary_nic = "backendvmnic"
      primary_ip_conf = "backendvm"
      resource_group_name = "devops_primary"
    }
    module "vm" {
      source = "./modules/vm"
      vm_name = "backendvm-primary"
      vm_size = "standard_d2s_v3"
      vm_storage_od_disk_name = "backend-vm-os-disk-primary"
      computer_name = "backendserver"
      username = "terraform"
      ssh_key_path = "/home/terraform/.ssh/authorized_keys"
      keys_data = "~/.ssh/id_rsa.pub"
    }
    module "security_group" {
       source = "./modules/security_group"
       sg_group_name = "primary_sg"
       primary_nic_id = ["module.network.primary_nic_id"] 
    }

Вот файл main.cf ресурса:

#Select provider
provider "azurerm" {
  subscription_id = "xxxxxxxxxxxxxxxxxxxxxx"
  version = "~> 2.2"
  features {}
}

#Create Primary Resource Group
resource "azurerm_resource_group" "primary" {
  name     = "var.resource_group_name"
  location = "var.location"
  tags = {
        environment = "Test"
    }
}
output "devops_primary" {
  value = "${azurerm_resource_group.primary.name}"
}
output "location" {
    value = "${azurerm_resource_group.primary.location}"
}

Здесь это файл main.cf сети:

#Create public IP address
resource "azurerm_public_ip" "primary" {
    name                         = "var.public_ip"
    location                     = "module.resource.azurerm_resource_group.primary.location"
    resource_group_name          = "module.resource.azurerm_resource_group.primary.name"
    allocation_method            = "Dynamic"
    tags = {
        environment = "Test"
    }
}
output "public_ip_id"{
  value = azurerm_public_ip.primary.id
  }
#Create Network Interface
resource "azurerm_network_interface" "primary" {
  name                = "var.primary_nic"
  location            = "module.resource.azurerm_resource_group.primary.location"
  resource_group_name = "module.resource.azurerm_resource_group.primary.name"
   resource_group_name = var.resource_group_name
  ip_configuration {
        name                           = "var.primary_ip_conf"
       #subnet_id                       = "${azurerm_subnet.primary.id}"
        subnet_id                       = azurerm_subnet.primary.id
        private_ip_address_allocation  = "Dynamic"
        #public_ip_address_id            = "${azurerm_public_ip.primary.id}"
        public_ip_address_id           = azurerm_public_ip.primary.id
        #public_ip_address_allocation   = "Dymanic"
    }
  tags = {
        environment = "Test"
    }
  # depends_on = [var.subnet_id_primary]
    #depends_on                     = [module.resource.azurerm_resource_group.name]
}
output "primary_nic_id"{
  description = "Primary VNET NIC Id "
  value = ["azurerm_network_interface.primary.id"]
  }
output "private_ip" {
  description = "private ip addresses of the vm nics"
  value       = "${azurerm_network_interface.primary.private_ip_address}"
}

Вот файл main.cf виртуальной машины:

#Create VM in Primary resource
resource "azurerm_virtual_machine" "primary" {
  name                  = "var.vm_name"
  location              = "module.resource.azurerm_resource_group.primary.location"
  resource_group_name   = "module.resource.azurerm_resource_group.primary.name"
  vm_size               = "var.vm_size"
  network_interface_ids = ["module.resource.azurerm_network_interface.primary.id"]
  storage_os_disk {
    name              = "var.vm_storage_od_disk_name"
    os_type           = "Linux"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Premium_LRS"
  }
storage_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
  os_profile {
    computer_name  = "var.computer_name"
    admin_username = "var.username"
  }
  os_profile_linux_config {
    disable_password_authentication = true
  ssh_keys {
      path     = "/home/terraform/.ssh/authorized_keys"
      key_data = file("~/.ssh/id_rsa.pub")
    }
  }
  tags = {
        environment = "Test"
    }
}

Вот файл main.cf группы безопасности:

#Create Network Security Group
resource "azurerm_network_security_group" "primary" {
    name                = "var.sg_group_name"
    #location            = "module.resource.azurerm_resource_group.primary.location"
    #resource_group_name = "module.resource.azurerm_resource_group.primary.name"
     resource_group_name = "var.resource_group_name"
     location            = "var.location"
    #Security Rules for Security Group
    security_rule {
        name                       = "SSH"
        priority                   = 1001
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "22"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
    }
    security_rule {
        name                       = "AppOut"
        priority                   = 1002
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "8040"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
    }
    security_rule {
        name                       = "MySql"
        priority                   = 1003
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "3306"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
    }
    security_rule {
        name                       = "Redis"
        priority                   = 1004
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "6379"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
    }
    tags = {
        environment = "Test"
    }
}
variable "primary_nic_id" {}
# Connect the security group to the network interface
  resource "azurerm_network_interface_security_group_association" "primary" {
    #network_interface_id      = "${module.network.azurerm_network_interface.primary.id}"
    network_interface_id      = "module.network.azurerm_network_interface.primary.id"
    network_security_group_id = "${azurerm_network_security_group.primary.id}"
    #depends_on                = ["module.network.primary_nic_id"]
    #primary_nic_id               = ["var.primary_nic_id"]
}
#depends_on                = [module.network.primary_nic_id]
# Generate a new ID only when a new resource group is defined
 resource "random_id" "randomId" {
    keepers = {
        resource_group_name = "module.resource.azurerm_resource_group.primary.name"
    }
    byte_length = 8
}

Пожалуйста, ознакомьтесь с кодом, над которым я сейчас работаю, я новичок в terraform, только начал учиться.

1 Ответ

0 голосов
/ 08 апреля 2020

Прежде всего, вы можете удалить кавычки для всех неконстантных выражений и оставить внутреннее внутреннее выражение. Чтобы начать обновление конфигурации, выполните команды terraform 0.12upgrade.

Terraform 0.11 и более ранние версии требовали предоставления всех неконстантных выражений с помощью синтаксиса интерполяции, но этот шаблон теперь не рекомендуется. Чтобы отключить это предупреждение, удалите последовательность «$ {последовательность из начала и}» в конце этого выражения, оставив только внутреннее выражение.

Синтаксис интерполяции шаблона все еще используется для построения строк из выражений, когда шаблон включает в себя несколько последовательностей интерполяции или смесь буквенных строк и интерполяций. Это устаревание применяется только к шаблонам, которые полностью состоят из одной последовательности интерполяции.

Вызов дочернего модуля

Вызов модуля означает включение содержимое этого модуля в конфигурацию с указанием c значений для его входных переменных . Модули вызываются из других модулей, используя блоки module:

module "servers" {
  source = "./app-cluster"

  servers = 5
}

Доступ к выходным значениям модуля

Ресурсы, определенные в модуле инкапсулированы , поэтому вызывающий модуль не может получить доступ к их атрибутам напрямую. Однако дочерний модуль может объявлять выходные значения для выборочного экспорта определенных значений, к которым должен обращаться вызывающий модуль.

Например, если модуль ./app-cluster экспортировал значение output с именем instance_ids, то вызывающий модуль может ссылаться на этот результат, используя выражение module.servers.instance_ids:

resource "aws_elb" "example" {
  # ...

  instances = module.servers.instance_ids
}

Для получения дополнительной информации о ссылках на именованные значения см. Выражения .

Например, , В этом случае вы не можете запросить значение из модуля как ваш код

network_interface_id      = "module.network.azurerm_network_interface.primary.id"

Правильное выражение - module.<MODULE NAME>.<OUTPUT NAME>. Это значение указанного output значения из дочернего модуля, вызываемого текущим модулем. Вам следует запросить azurerm_network_interface.primary.id из модуля network следующим образом network_interface_id = module.network.primary_nic_id

Кроме того, поскольку блоки модулей объявлены в каталоге root в вашем коде, вы не можете напрямую ссылаться на них из вашего Файлы конфигурации дочерних модулей. Вы можете использовать входные переменные для передачи значения вашему дочернему модулю из модуля root. См. выходные значения .

Например, в модуле network в каталоге root вы вызываете модуль resource output devops_primary из модуля network следующим образом resource_group_name = module.resource.devops_primary

module "network" {
  source = "./modules/network"
  resource_group_name = module.resource.devops_primary
  location = module.resource.location
  virtual_network = "primaryvnet"
  subnet = "primarysubnet"
  address_space = ["192.168.0.0/16"]
  ...
}

в каталоге ./modules.network, у вас есть

#Create Virtual Network in Primary Resource Group
resource "azurerm_virtual_network" "primary" {
  name                = var.virtual_network
  resource_group_name = var.resource_group_name
  address_space       = var.address_space
  location            = var.location

}

variable "resource_group_name" {

}

variable "location" {

}

Вы можете заново отредактировать ваши файлы конфигурации, следуя приведенным выше правилам. Дополнительные примеры вы можете найти azurerm modules .

...