【问题标题】:Terraform template_file Empty Json validationTerraform template_file 空 Json 验证
【发布时间】:2021-12-06 04:29:49
【问题描述】:

我的 Terrform 代码如下所示。这里我的参数文件有时有值,大部分时间是空 JSON {}

resource "azurerm_policy_assignment" "example" {
  name                 = "example-policy-assignment"
  scope                = azurerm_resource_group.example.id
  policy_definition_id = azurerm_policy_definition.example.id
  description          = "Policy Assignment created via an Acceptance Test"
  display_name         = "My Example Policy Assignment"

  parameters           = "${data.template_file.policy_parameters_file.rendered}"

所以我需要做一些验证来检查我的参数文件是否为空 json 然后我需要分配一个空字符串。

我尝试了下面的方法,但它不起作用

"${data.template_file.policy_parameters_file.rendered}" == {} ? "" : "${data.template_file.policy_parameters_file.rendered}"

需要此验证,因为状态文件已经将参数值设为“”。现在,如果我运行 terraform 计划,它会显示为

parameters           = jsonencode({}) # forces replacement 

强制替换。

如果我将参数硬编码为“”,一切顺利。所以为了处理这个问题,我需要找到一种方法来处理参数文件中空 json 的验证。如果 json 为空,我需要传递为 ""

【问题讨论】:

  • 如果您将已弃用的 data.template_file 更新为 templatefile() 的使用,是否可以解决您的问题?
  • data.template_file 修改为templatefile() 将是一个更大的修改,因为原始代码将有许多基于循环的条件,以及处理许多文件的依赖关系。 (更通用的模块)。但是感谢这个指针。我会尝试在我的本地沙盒环境中模拟这一点,如果修复,我会回复你。
  • " 但它不起作用" - 不具体。到底发生了什么?有什么错误吗?
  • 没有错误。由于状态文件已经像 parameters = "" 当我现在运行 terraform 计划时,我得到了 OP 中提到的 force replacement 而不是对现有资源的更新。根据azurerm_policy_assignment 的设计,它会在更改参数字段时重新创建新资源。但就我而言,它实际上并没有改变。我必须找到一种方法将参数字段作为“”

标签: terraform terraform-provider-azure


【解决方案1】:

听起来您有一个生成 JSON 的模板,但有时会生成一个空的 JSON 对象,在这种特殊情况下,您宁愿完全不设置此参数,而不是将其设置为字面意义上的 "{}"

如果是这样,我认为您尝试的问题是您将字符串 "{}" 与真正的空对象 {} 进行了比较,因为字符串和对象不可比较,所以它总是返回 false。 (作为一般规则,== 总是为不同类型的值返回 false。)

如果您知道空对象大小写始终是字符串"{}",而不是任何其他等效的JSON,例如"{ }"(大括号之间有一个空格),那么您可以编写一个非常类似于除了与该字符串进行比较之外,您编写的那个:

  parameters = (
    data.template_file.policy_parameters_file.rendered != "{}" ?
    data.template_file.policy_parameters_file.rendered :
    null
  )

如果您想更健壮一些并捕获 JSON 对象的任何有效编码,您可以编写一个稍微复杂的表达式,如下所示:

  parameters = (
    length(jsondecode(data.template_file.policy_parameters_file.rendered)) > 0 ?
    data.template_file.policy_parameters_file.rendered :
    null
  )

这会将 JSON 再次解码为真实对象,然后测试它是否具有至少一个属性。


请注意,对于使用 Terraform v0.12.0 或更高版本的任何人,不推荐使用 template_file 数据源。虽然不需要摆脱这种情况以获得如上所述的工作结果,但我建议还计划在将来迁移到the templatefile function,因为它将持续支持并正确集成到Terraform 语言,因此它可以避免来自在外部插件中实现的 template_file 数据源的各种奇怪的怪癖。

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2020-03-23
    • 2018-02-21
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多