在下面的代码中,我试图从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"
}