首先让我说我当前有一个可用的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
}
答案 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 处。