繁体   English   中英

传递给 azurerm_virtual_machine_extension 多个文件

[英]pass to azurerm_virtual_machine_extension multiple files

我想使用 terraform azurerm_virtual_machine_extension作为模块,并以某种方式将多个文件作为设置参数传递。

这是一个例子:

module "ad_settings" {
  source = "./modules/cse" 
  vm_id = azurerm_virtual_machine.addc_vm.id  

  files = [
        "${azurerm_storage_container.scripts_ct.id}/1.ps1",
        "${azurerm_storage_container.scripts_ct.id}/2.ps1",
        "${azurerm_storage_container.scripts_ct.id}/22.ldif",
        "${azurerm_storage_container.scripts_ct.id}/3.zip",
        "${azurerm_storage_container.scripts_ct.id}/5.zip"]

  cse_protected_settings =  "powershell -ExecutionPolicy Unrestricted -File 1.ps1 ${var.vm_admin_name} ${var.vm_admin_pass} ${var.ad_domain_name} true"

}

cse_resources.tf

resource "azurerm_virtual_machine_extension" "template" {
  name                 = "CustomScriptExtension"
  virtual_machine_id   = var.vm_id
  publisher            = "Microsoft.Compute"
  type                 = "CustomScriptExtension"
  type_handler_version = "1.9"

  settings = <<SETTINGS
    {
      "fileUris": [
          ${var.files}
      ]
                }
SETTINGS 

  protected_settings = <<PROTECTED_SETTINGS
      {
              "commandToExecute": "${var.cse_protected_settings}"
      }
  PROTECTED_SETTINGS


  tags = {
    environment = var.farm_environment_tag_value
  }
}

错误:

Error: Invalid template interpolation value
│
│   on modules\cse\cse_resources.tf line 11, in resource "azurerm_virtual_machine_extension" "template":
│    8:   settings = <<SETTINGS
│    9:     {
│   10:       "fileUris": [
│   11:           ${var.files}
│   12:       ]
│   13:                 }
│   14: SETTINGS
│     ├────────────────
│     │ var.files is list of string with 5 elements
│
│ Cannot include the given value in a string template: string required.

有什么建议么? 我也可以在 tf 中与locals一起生成文件列表

fileUris 设置要求值采用字符串格式。 Terraform 的字符串格式要求所有内容都在一行中。 由于您有多个要提取的文件,因此 terraform 会将逗号视为需要换行的参数。 解决方案是使用terraform 的 heredoc style

为此,我创建了一个使用 Heredoc 的局部变量,然后我稍后在我的扩展设置中调用该变量。

这可以是变量或其他一些占位符

  locals {
      fileUris = <<EOT
      [
        "${azurerm_storage_container.scripts_ct.id}/1.ps1",
        "${azurerm_storage_container.scripts_ct.id}/2.ps1",
        "${azurerm_storage_container.scripts_ct.id}/22.ldif",
        "${azurerm_storage_container.scripts_ct.id}/3.zip",
        "${azurerm_storage_container.scripts_ct.id}/5.zip"
        ]
      EOT
    } 

这部分在你的扩展中

    settings = <<SETTINGS
      {
          "fileUris": ${local.fileUris},
          "commandToExecute": "${var.cse_protected_settings}"
      } 
  SETTINGS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM