我有这个地形资源(为了清晰起见简化了一点):
resource "azurerm_key_vault_secret" "env_secrets" {
name = "my-secret"
key_vault_id = var.key_vault_id
value = <<-EOT
{
"ADMIN_USER": "admin",
"ADMIN_PASSWORD": "some_secret",
}
EOT
content_type = "application/x-json"
}
实际情况是,根据地形运行的位置(在Windows上的WSL2或在部署管道中的Ubuntu上),行结束从n
到rn
来回变化,这意味着总是有一个"变化";这是不理想的。
有什么好的方法来修复它吗?我想可能是很难转化为n
,或者去除r
或类似的东西。也许有一些标准的方法来解决这个问题?
注:我认为不同的行结束是由于git,但似乎是git行为的正确方式,所以它应该在terraform中修复。
似乎您已将版本控制系统配置为在不同系统上提取文件时自动重写文件的行结尾。Terraform试图完全保留您的字符串写入(因为行尾对于您使用Terraform管理的系统通常很重要,即使这对JSON不是真的),所以如果您想在所有平台上保持一致的行为,那么您应该配置您的版本控制系统,以完全保留写入.tf
文件的字节,而不是在签出时自动覆盖它们。
如果你的源代码在Git中,那么你可以在你的存储库中使用.gitattributes
文件配置该行为。
对于您的特殊情况,因为您正在生成JSON,所以使用heredoc字符串很奇怪,因为Terraform有一个专门用于此目的的jsonencode
函数:
resource "azurerm_key_vault_secret" "env_secrets" {
value = jsonencode({
"ADMIN_USER" = "admin"
"ADMIN_PASSWORD" = "some_secret"
})
}
因为jsonencode
函数知道它正在生成JSON,因此空格在那里是无关紧要的,它将生成一致的结果,而不管源文件中使用的行结束符是什么。如果您以后想要动态生成JSON数据结构的一部分,这种方法通常也会更好地工作,因为您可以在jsonencode
参数中使用任意Terraform表达式。
我最后就是这么做的:
locals {
value_raw = <<-EOT
{
"ADMIN_USER": "admin",
"ADMIN_PASSWORD": "some_secret",
}
EOT
value = chomp(replace(local.value_raw, "rn", "n"))
}
resource "azurerm_key_vault_secret" "env_secrets" {
value = local.value
}