Terraform 会根据运行时环境不断更改多行 heredoc 的行尾

Posted

技术标签:

【中文标题】Terraform 会根据运行时环境不断更改多行 heredoc 的行尾【英文标题】:Terraform keeps changing line endings of the multi-line heredoc depending on the runtime environment 【发布时间】:2021-11-22 01:16:04 【问题描述】:

我有这个 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 或类似的东西。也许有一些标准的方法来解决这个问题?

附:我认为由于 git 会发生不同的行尾,但似乎是 git 行为的正确方式,因此它可能应该在 terraform 中修复。

【问题讨论】:

【参考方案1】:

这就是我最终做的:

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

【讨论】:

【参考方案2】:

您的版本控制系统似乎已配置为在不同系统上提取文件时自动重写文件的行尾。 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 表达式。

【讨论】:

非常感谢您的帮助! Json 值只是示例之一,不幸的是,我还有其他非 json 值以相同的方式生成。将 git 设置为忽略 lineending 也是一个问题,因为在不同系统上打开文件可能会来回覆盖行结尾......我将尝试在可能的情况下切换到 json,这似乎是一个合理的做法跨度> 在您的团队中设置关于如何创建文件的约定,无论平台如何,您都需要在 Terraform 之外进行协调。例如,您可以在版本控制系统中使用自动检查来验证新的拉取请求是否只有预期的行尾,如果没有则返回错误。如果您团队中的每个人都在使用支持它的编辑器,您还可以使用 EditorConfig 默认帮助人们生成合适的文件。

以上是关于Terraform 会根据运行时环境不断更改多行 heredoc 的行尾的主要内容,如果未能解决你的问题,请参考以下文章

Terraform删除路由表,然后在第二次运行时将其添加(无更改)。错误或我缺少什么吗?

快速搭建实验环境:使用 Terraform 部署 Proxmox 虚拟机

跨微服务环境模块化 Terraform IaC

如何根据“位置更改”不断更新表格视图?

使 Terraform 资源键多行

使用Terraform部署代码和管理配置