【问题标题】:How to use Conditional Attributes in Terraform如何在 Terraform 中使用条件属性
【发布时间】:2019-09-22 22:01:12
【问题描述】:

我编写了一个脚本来使用 terraform 创建 Azure VM。脚本可以灵活地将操作系统作为输入。现在 azurerm_virtual_machine 资源块中有一些特定于操作系统的属性。 如何使用条件,例如 Windows 使用 os_profile_windows_config{} 或操作系统是 linux 使用 os_profile_linux_config{}

正常的条件语句不起作用,因为此属性没有通过使用 = 直接获取任何值。

resource "azurerm_virtual_machine" "vmdeploy" {
  count = "${var.count_of_VMs}"
  name = "${var.vm_name}-${count.index}"
  resource_group_name = "${azurerm_resource_group.deployrg.name}"
  availability_set_id = "${azurerm_availability_set.avset.id}"
  location = "${azurerm_resource_group.deployrg.location}"
  network_interface_ids = ["${element(azurerm_network_interface.nic.*.id, count.index)}"]
  vm_size = "Standard_DS1_v2"

  storage_image_reference{
    publisher = "${var.OS_Image_Publisher}"
    offer = "${var.OS_Image_Offer}"
    sku = "${var.OS_Image_Sku}"
    version = "latest"
  }
  storage_os_disk{
    name = "${var.vm_name}-${count.index}-osdisk"
    caching = "ReadWrite"
    managed_disk_type = "Standard_LRS"
    create_option = "FromImage"
  }

  storage_data_disk {
    name = "${element(azurerm_managed_disk.mdisk.*.name, count.index)}"
    managed_disk_id = "${element(azurerm_managed_disk.mdisk.*.id, count.index)}"
    create_option = "Attach"
    lun = 1
    disk_size_gb = "${element(azurerm_managed_disk.mdisk.*.disk_size_gb, count.index)}"
  }

  os_profile {
    computer_name = "${var.vm_name}-${count.index}"
    admin_username = "XXXXXXXXXXXX"
    admin_password = "XXXXXXXXXXXX"
  }

  os_profile_windows_config {

  }
}

我试图在这里找到一种使用条件的方法,以根据作为输入提供的操作系统版本使用相应的配置属性。

【问题讨论】:

  • 您可能需要拥有 2 个几乎相同的资源并根据操作系统调整整个资源。我并不是说它是唯一的方法,但它很可能会起作用
  • 哪个 terraform 版本? 0.12 之前还是之后?
  • Giulio Vian,我使用的是 pre-0.12 版本,

标签: terraform terraform-provider-azure


【解决方案1】:

这在 terraform-0.12 之前是不可能的。这可以通过 0.12 版中的 dynamic blocks 实现。

provider "azurerm" {
  version = "~>2.19.0"
  features {}
}

variable "image" {
  type = map
  default = {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04-LTS"
    version   = "latest"
  }
}

locals {
  _is_microsoft = substr(lookup(var.image, "publisher", "value_not_declared"), 0, 9) == "Microsoft" ? true : false
  is_linux      = ! local._is_microsoft ? { empty = true } : {}
  is_windows    = local._is_microsoft ? { empty = true } : {}
}

resource "azurerm_resource_group" "rg" {
  name     = "rg"
  location = "east us"
}

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

resource "azurerm_subnet" "subnet" {
  name                 = "subnet"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.rg.name
  address_prefixes     = ["10.10.10.0/24"]
}

resource "azurerm_network_interface" "rg" {
  name                = "nic"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "ipconfig"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_virtual_machine" "rg" {
  name                  = "-vm"
  location              = azurerm_resource_group.rg.location
  resource_group_name   = azurerm_resource_group.rg.name
  network_interface_ids = [azurerm_network_interface.rg.id]
  vm_size               = "Standard_D2_v3"

  storage_image_reference {
    publisher = lookup(var.image, "publisher")
    offer     = lookup(var.image, "offer")
    sku       = lookup(var.image, "sku")
    version   = lookup(var.image, "version")
  }
  storage_os_disk {
    name              = "disk1"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }
  os_profile {
    computer_name  = "computer"
    admin_username = "localadmin"
    admin_password = "donotuserthispassword123!"
  }

  dynamic "os_profile_linux_config" {
    for_each = local.is_linux

    content {
      disable_password_authentication = false
    }
  }

  dynamic "os_profile_windows_config" {
    for_each = local.is_windows

    content {
      provision_vm_agent = true
    }
  }
}

请注意,azurerm 团队认为这是not a good 想法并将资源分成两种不同的类型。采用 azurerm_linux_virtual_machine 或 azurerm_windows_virtual_machine。 构建一个具有单个接口的模块,然后使用计数来选择哪个 用于构建 windows 或 linux 的资源。

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 2021-07-06
    • 2021-12-16
    • 1970-01-01
    • 2022-01-21
    • 2021-12-05
    • 2012-11-21
    • 2019-04-25
    • 1970-01-01
    相关资源
    最近更新 更多