#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 /…