Terraform 根据运行时环境不断更改多行 heredoc 的行尾
Terraform keeps changing line endings of the multi-line heredoc depending on the runtime environment
我有这个 terraform 资源(为清楚起见稍微简化了一点):
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"
}
根据 terraform 的位置 运行(在 Windows 上的 WSL2 上或部署管道中的 Ubuntu 上),行结尾从 \n
到 \r\n
意味着总是有一个不理想的应该应用的“变化”。
有什么好的方法可以解决吗?我假设可能会硬转换为 \n
,或者删除 \r
或类似的东西。也许有一些标准的方法可以解决这个问题?
P.S。我假设由于 git 而发生了不同的行尾,但似乎 git 的行为方式是正确的,因此它可能应该在 terraform 中修复。
这就是我最后做的事情:
locals {
value_raw = <<-EOT
{
"ADMIN_USER": "admin",
"ADMIN_PASSWORD": "some_secret",
}
EOT
value = chomp(replace(local.value_raw, "\r\n", "\n"))
}
resource "azurerm_key_vault_secret" "env_secrets" {
value = local.value
}
您似乎将版本控制系统配置为在不同系统上提取文件时自动重写文件的行尾。 Terraform 正在尝试完全按照写入的方式保留您的字符串(因为行结尾对于您使用 Terraform 管理的系统通常很重要,即使 JSON 并非如此),所以如果您希望在所有平台上保持一致的行为那么您应该对您的版本控制系统进行一般配置,以准确保留写入 .tf
文件中的字节,而不是在结帐时自动覆盖它们。
如果您的源代码在 Git 中,那么您可以使用存储库中的 a .gitattributes
file 配置该行为。
但是对于你的特殊情况,因为你正在生成 JSON 使用 heredoc 字符串很奇怪,因为 Terraform 有一个 jsonencode
function 专门用于这个目的:
resource "azurerm_key_vault_secret" "env_secrets" {
value = jsonencode({
"ADMIN_USER" = "admin"
"ADMIN_PASSWORD" = "some_secret"
})
}
因为 jsonencode
函数知道它正在生成 JSON,因此那里的空格无关紧要,所以无论源文件中使用的行结尾如何,它都会生成一致的结果。如果您稍后最终想要动态生成 JSON 数据结构的一部分,这种方法通常也更有效,因为您可以在该 jsonencode
参数中使用任意 Terraform 表达式。
我有这个 terraform 资源(为清楚起见稍微简化了一点):
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"
}
根据 terraform 的位置 运行(在 Windows 上的 WSL2 上或部署管道中的 Ubuntu 上),行结尾从 \n
到 \r\n
意味着总是有一个不理想的应该应用的“变化”。
有什么好的方法可以解决吗?我假设可能会硬转换为 \n
,或者删除 \r
或类似的东西。也许有一些标准的方法可以解决这个问题?
P.S。我假设由于 git 而发生了不同的行尾,但似乎 git 的行为方式是正确的,因此它可能应该在 terraform 中修复。
这就是我最后做的事情:
locals {
value_raw = <<-EOT
{
"ADMIN_USER": "admin",
"ADMIN_PASSWORD": "some_secret",
}
EOT
value = chomp(replace(local.value_raw, "\r\n", "\n"))
}
resource "azurerm_key_vault_secret" "env_secrets" {
value = local.value
}
您似乎将版本控制系统配置为在不同系统上提取文件时自动重写文件的行尾。 Terraform 正在尝试完全按照写入的方式保留您的字符串(因为行结尾对于您使用 Terraform 管理的系统通常很重要,即使 JSON 并非如此),所以如果您希望在所有平台上保持一致的行为那么您应该对您的版本控制系统进行一般配置,以准确保留写入 .tf
文件中的字节,而不是在结帐时自动覆盖它们。
如果您的源代码在 Git 中,那么您可以使用存储库中的 a .gitattributes
file 配置该行为。
但是对于你的特殊情况,因为你正在生成 JSON 使用 heredoc 字符串很奇怪,因为 Terraform 有一个 jsonencode
function 专门用于这个目的:
resource "azurerm_key_vault_secret" "env_secrets" {
value = jsonencode({
"ADMIN_USER" = "admin"
"ADMIN_PASSWORD" = "some_secret"
})
}
因为 jsonencode
函数知道它正在生成 JSON,因此那里的空格无关紧要,所以无论源文件中使用的行结尾如何,它都会生成一致的结果。如果您稍后最终想要动态生成 JSON 数据结构的一部分,这种方法通常也更有效,因为您可以在该 jsonencode
参数中使用任意 Terraform 表达式。