有关在Terraform插值中引用特定索引的问题

时间:2019-08-17 17:06:48

标签: terraform

首先让我说我当前有一个可用的terraform配置,但是当我执行以下操作时,我的IDE(VSCode;使用mauve.terraform扩展,v 1.3.12)抱怨我的语法:

virtual_machine_name = "${azurerm_virtual_machine.sql["${count.index}"].name}"

它抱怨说它期望一个'}',但是发现了一个'。'。

我应该以其他方式或更准确地将其写出来吗?我对使用terraform相当陌生,因此我确定我的语法可以使用一些帮助。

提前谢谢!

作为参考,这是我的完整资源块:

resource "azurerm_virtual_machine_extension" "sql" {
  name                          = "OMSExtension"
  location                      = "${data.azurerm_resource_group.generics_sql_dev.location}"
  resource_group_name           = "${data.azurerm_resource_group.generics_sql_dev.name}"
  virtual_machine_name          = "${azurerm_virtual_machine.sql["${count.index}"].name}"
  publisher                     = "Microsoft.EnterpriseCloud.Monitoring"
  type                          = "MicrosoftMonitoringAgent"
  type_handler_version          = "1.0"
  auto_upgrade_minor_version    = true
  count                         = "${var.sql_node_count}"

  settings = <<-BASE_SETTINGS
  {
    "workspaceId" : "${data.azurerm_log_analytics_workspace.oms.workspace_id}"
  }
  BASE_SETTINGS

  protected_settings = <<-PROTECTED_SETTINGS
  {
    "workspaceKey" : "${data.azurerm_log_analytics_workspace.oms.primary_shared_key}"
  }
  PROTECTED_SETTINGS
}

1 个答案:

答案 0 :(得分:0)

从Terraform 0.12和更高版本开始,“标准”的编写方式是:

  virtual_machine_name = azurerm_virtual_machine.sql[count.index].name

您尝试过的方法也可以在Terraform 0.12中使用,但是字符串插值在该版本中是多余的。它在Terraform 0.12中工作,因为有一个特殊的向后兼容规则,即如果带引号的字符串序列由单个插值的 only 组成(例如"${ ...anything ... }"),则Terraform将忽略引号并只返回内部表达式的值。

仅向后兼容支持为Terraform 0.11编写的配置,因此,如果您使用Terraform 0.12或更高版本,我建议避免使用它。通过使读者怀疑它是否意味着转换为字符串,往往会损害可读性。


对于Terraform 0.11和更早版本,需要一级字符串插值,并且索引必须针对“ splat运算符”:

  virtual_machine_name = "${azurerm_virtual_machine.sql.*.name[count.index]}"

此处的azurerm_virtual_machine.sql.*.name部分产生了name值的列表,然后[count.index]选择其中一个。在Terraform 0.11和更早版本中需要使用此方法,因为在这些版本中,索引运算符[...]必须始终位于一系列遍历步骤的 end 处。