如何为 terraform 中的对象设置默认值?

uda*_*ran 8 terraform terraform-provider-azure

我的地形片段:

\n
variable "machine_details" {\n  type = object({\n    name              = string\n    size = string\n    username               = string\n    password = string\n  })\n\n  default = [\n    {\n      name              = "example-vm"\n      size = "Standard_F2"\n      username               = "adminuser"\n      password = "Notallowed1!"\n    }\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我收到如下错误。

\n
    Error: Invalid default value for variable\n    \xe2\x94\x82\n    \xe2\x94\x82   on variables.tf line 38, in variable "machine_details":\n    \xe2\x94\x82   38:   default = [\n    \xe2\x94\x82   39:     {\n    \xe2\x94\x82   40:       name              = "example-vm"\n    \xe2\x94\x82   41:       size = "Standard_F2"\n    \xe2\x94\x82   42:       username               = "adminuser"\n    \xe2\x94\x82   43:       password = "Notallowed1!"\n    \xe2\x94\x82   44:     }\n    \xe2\x94\x82   45:   ]\nThis default value is not compatible with the variable's type constraint: object required.\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试了 map(string) 但也不起作用。

\n

也有相似的列表(字符串)。

\n

我正在尝试最新的 azurerm 提供程序。

\n

另外,在 gcp 中,我们可以选择提供计数(对于实例),因此如果我提供 2,将创建两个实例。

\n

如何使用 azure 和 aws 做同样的事情?

\n

如何解决这个问题?

\n

uda*_*ran 14

它就是这样工作的。

variable "machine_details" {
  type = object({
    name = string
    size = string
    username = string
    password = string
  })

  default = {
      name = "example-vm"
      size = "Standard_F2"
      username  = "adminuser"
      password = "Notallowed1!"
    }
  
}
Run Code Online (Sandbox Code Playgroud)

并且可以这样引用:var.machine_details.name


Ans*_*-MT 3

正如Marko E前面luk2302提到的,您必须声明并传递变量,如下所示:

variable "machine_details" {
  type = list(object({
    name = string
    size = string
    username = string
    password = string
  }))

  default = [
    {
      name = "example-vm"
      size = "Standard_F2"
      username = "adminuser"
      password = "Notallowed1!"
    },
    {
      name = "example2-vm"
      size = "Standard_F2"
      username = "adminuser1"
      password = "Notallowed2!"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您想使用count,则可以使用如下所示的内容:

provider "azurerm" {
  features{}
}

data "azurerm_resource_group" "example" {
  name     = "ansumantest"
}

resource "azurerm_virtual_network" "example" {
  name                = "example-network"
  address_space       = ["10.0.0.0/16"]
  location            = data.azurerm_resource_group.example.location
  resource_group_name = data.azurerm_resource_group.example.name
}

resource "azurerm_subnet" "example" {
  name                 = "internal"
  resource_group_name  = data.azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.2.0/24"]
}
resource "azurerm_public_ip" "example" {
  count = length(var.machine_details)
  name                = "aks-nfs-public-ip${count.index}"
  location            = data.azurerm_resource_group.example.location
  resource_group_name = data.azurerm_resource_group.example.name
  allocation_method   = "Dynamic"

  tags = {
    environment = "Production"
  }
}

resource "azurerm_network_interface" "example" {
  count = length(var.machine_details)
  name                = "example-nic-${count.index}"
  location            = data.azurerm_resource_group.example.location
  resource_group_name = data.azurerm_resource_group.example.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.example.id
    public_ip_address_id = "${element(azurerm_public_ip.example.*.id, count.index)}"
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_ssh_public_key" "example" {
  name                = "ansuman-sshkey"
  resource_group_name = data.azurerm_resource_group.example.name
  location            = data.azurerm_resource_group.example.location
  public_key          = file("~/.ssh/id_rsa.pub")
}

resource "azurerm_linux_virtual_machine" "example" {
  count = length(var.machine_details)
  name                = var.machine_details[count.index].name
  resource_group_name = data.azurerm_resource_group.example.name
  location            = data.azurerm_resource_group.example.location
  size                = var.machine_details[count.index].size
  admin_username      = var.machine_details[count.index].username
  admin_password      = var.machine_details[count.index].password
  disable_password_authentication = true
  network_interface_ids = ["${element(azurerm_network_interface.example.*.id, count.index)}"]

  admin_ssh_key {
    username   = var.machine_details[count.index].username
    public_key = azurerm_ssh_public_key.example.public_key
  }

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04-LTS"
    version   = "latest"
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述