【问题标题】:dynamic block on terraform azurerm_virtual_machine_extension settingsterraform azurerm_virtual_machine_extension 设置上的动态块
【发布时间】:2020-12-13 07:06:14
【问题描述】:

我正在使用 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_stringtest_scriptfile_uri vars 来控制资源行为。但是,terraform 在资源中只允许一个 settings 块,我不知道如何在这里使用 dynamic 块功能。因为我们最后有SETTINGS 字符串。

非常感谢您的帮助。

谢谢, 哈沙

【问题讨论】:

  • 如果这三个设置互斥,则让三个 azurerm_virtual_machine_extension 消除动态块并将计数移至资源本身。如果它们不是互斥的,则使用对象变量并将其转换为 json。我没有时间对此进行测试,但这就是我要开始的地方。

标签: azure terraform terraform-provider-azure terraform0.12+


【解决方案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)
  // ...
}

为了清理它,我将不同的选项拉入一个本地块。然后您可以链接三元运算符来选择要使用的正确字符串。

【讨论】:

  • 感谢您的回答.. 不知道我可以删除 SETTINGS
  • SETTING 是“heredoc”样式字符串文字的分隔符/标识符。这只是表达多行字符串的一种更简洁的方式。标识符也可以是您想要的任何值。您可以在此处的文档中阅读更多信息:terraform.io/docs/configuration/…
猜你喜欢
  • 2019-06-02
  • 2018-06-30
  • 2021-09-29
  • 2020-08-18
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2022-07-07
相关资源
最近更新 更多