如何在Terraform中对模板使用计数条件



在下面的代码中,我试图从keyvault获取azure秘密(如果存在)并渲染它以生成模板。

...
< Keyvault definition >
data "azurerm_key_vault_secret" "win_admin_pass" {
count = ${var.cnt} # either 0 and 1
name         = "vm-winpw"
key_vault_id = data.azurerm_key_vault.keyvault.id
}
data "template_files" "wininv"{
count = ${var.cnt} # either 0 and 1
template = file(ansible/inventory.tpl)
var = {
winpw = data.azurerm_key_vault.keyvault.id[count.index]
}
}
resource "local_file" "wininv" {
count = ${var.cnt} 
content = data.template_files.wininv[count.index]
filename = "ansible/inventory.cfg"
}

在这里,我想获取azure的秘密,如果在keyvault上可用,并生成模板。

没有"count"代码,它工作得很好,但是当秘密在azure上不可用时,在Terraform中得到错误。

但是用这个代码,得到以下错误:

Error: incorrect attributes value type
On test.tf in data template_files" "wininv":
66    var ={ 
inappropriate value for attribute string required vars: elements example : String required

你能建议可能的Syntex或任何替代解决方案吗?

感谢

template_file只需要字符串属性。应该是:

winpw = data.azurerm_key_vault.keyvault[count.index].id

现在也推荐使用templatefile而不是template_file

条件表达式可以解决你的问题。

data "template_files" "wininv"{
count = ${var.cnt} # either 0 and 1
template = file(ansible/inventory.tpl)
var = {
winpw = ${var.cnt} == 0 ? "" : data.azurerm_key_vault.keyvault[count.index].id
}
}

您需要使用rendered属性来获得呈现的模板。(doc)

resource "local_file" "wininv" {
count = ${var.cnt} 
content = data.template_files.wininv[count.index].rendered  # NOTICE rendered
filename = "ansible/inventory.cfg"
}

相关内容

  • 没有找到相关文章

最新更新