динамический блок в настройках terraform azurerm_virtual_machine_extension

#azure #terraform #terraform-provider-azure #terraform0.12

#azure #terraform #terraform-provider-azure #terraform0.12

Вопрос:

Я создаю ресурсы расширения виртуальной машины Azure azurerm_virtual_machine_extension с использованием terraform. Однако я застрял в приведенном ниже примере использования, могу ли я динамически создавать settings блок?

 variable "test_string" {
  description = "boolean var to attach VM nics to lb"
  type        = string
  default     = ""
}

variable "test_script" {
  description = "script locally"
  type        = string
  default     = ""
}

variable "file_uri" {
  description = "script to download"
  type        = string
  default     = "https://example.com/azure-tests/custom_script.sh"
}


resource "azurerm_virtual_machine_extension" "ama_vm_extension" {

  name                 = "tst-vm-extension"
  virtual_machine_id   = "xxxxx-xxxx-xxxxx"
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.0"

  dynamic settings = <<SETTINGS
  {
    count = var.file_uri != "" ? 1: 0
    "commandToExecute": "sh ${basename(var.file_uri)}",
    "fileUris": ["${var.file_uri}"]
  }
  SETTINGS

  dynamic settings = <<SETTINGS
  {
     count = var.test_string != "" ? 1: 0
     content {
       "commandToExecute": "${var.test_string}"
     }
  }
  SETTINGS

  dynamic settings = <<SETTINGS
  {
     count = var.test_script != "" ? 1: 0
     content {
       "script": "${base64encode(var.test_string)}"
     }
  }
  SETTINGS

}
  

В приведенном выше коде я хотел бы управлять поведением ресурса с помощью test_string , test_script file_uri переменных. Однако terraform допускает только один settings блок в ресурсе, и я не знаю, как я могу использовать здесь функцию динамического блока. Поскольку у нас есть SETTINGS строка в конце.

Здесь очень ценится ваша помощь.

Спасибо, Харша

Комментарии:

1. Если три параметра являются взаимоисключающими, то при трех настройках azurerm_virtual_machine_extension динамический блок исключается и счетчик переносится на сам ресурс. Если они не являются взаимоисключающими, тогда используйте объектную переменную и преобразуйте ее в json. У меня нет времени тестировать это, но именно с этого я бы начал.

Ответ №1:

Динамические блоки Terraform предназначены для использования с вложенными блоками в ресурсах. Поскольку setting это всего лишь строка, вы можете просто использовать обычные условные выражения для установки значения setting .

Я бы, вероятно, сделал что-то вроде этого:

 locals {
  file_uri_settings = jsonencode({
    "commandToExecute" = "sh ${basename(var.file_uri)}",
    "fileUris"         = [var.file_uri]
  })
  test_string_settings = jsonencode({
    "commandToExecute" = var.test_string
  })
  test_script_settings = jsonencode({
    "script" = base64encode(var.test_script)
  })
}

resource "azurerm_virtual_machine_extension" "example" {
  // ...
  settings = var.test_string != "" ? local.test_string_settings : (var.test_script != "" ? local.test_script_settings : local.file_uri_settings)
  // ...
}
  

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

Комментарии:

1. спасибо за этот ответ .. не знал, что я могу удалить SETTINGS .

2. Это SETTING является ограничителем / идентификатором для строкового литерала в стиле «heredoc». Это просто более чистый способ выражения многострочных строк. Идентификатор также может иметь любое желаемое значение. Подробнее об этом можно прочитать в документации здесь: terraform.io/docs/configuration /…