terraform azurerm_virtual_machine_extension 设置上的动态块
dynamic block on terraform azurerm_virtual_machine_extension settings
我正在使用 terraform 创建 Azure VM 扩展资源 azurerm_virtual_machine_extension
。但是,我坚持以下用例是否可以动态创建 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
块,我不知道如何在这里使用 dynamic 块功能。因为我们最后有 SETTINGS
字符串。
在此非常感谢您的帮助。
谢谢,
戒日
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)
// ...
}
为了清理它,我将不同的选项拉到一个本地块中。然后您可以将三元运算符链接到 select 要使用的正确字符串。
我正在使用 terraform 创建 Azure VM 扩展资源 azurerm_virtual_machine_extension
。但是,我坚持以下用例是否可以动态创建 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
块,我不知道如何在这里使用 dynamic 块功能。因为我们最后有 SETTINGS
字符串。
在此非常感谢您的帮助。
谢谢, 戒日
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)
// ...
}
为了清理它,我将不同的选项拉到一个本地块中。然后您可以将三元运算符链接到 select 要使用的正确字符串。