【问题标题】:Is it possible to report error on a condition with terraform 0.12?是否可以在 terraform 0.12 的条件下报告错误?
【发布时间】:2021-02-17 10:14:43
【问题描述】:

原始参考 - Quit condition on Terraform blueprint

是否仍然可以像上面的问题一样进行条件检查

resource "null_resource" "condition_checker" {
  count = "${var.variable == 1 ? 0 : 1}"
  "Insert your custom error message" = true
}

类似的格式在 terraform 0.12 和 0.13 中不起作用,我找不到任何关于删除此功能的参考。像0.12或0.13这样的支票可以做吗?

【问题讨论】:

  • 你想达到什么目的?你想做变量验证吗?如果是 0.13 引入了变量验证:terraform.io/docs/configuration/…。如果您还不能升级到 0.13,它在技术上早在 0.12.20 就包含在功能标志后面:github.com/hashicorp/terraform/blob/v0.12/…
  • 我实际上想要做的是使用定义的工作空间验证当前工作空间 - 类似 terraform.workspace != var.workspace 会引发错误。
  • 你为什么要请求工作空间而不是仅仅使用来自terraform.workspace 的值?不过,您仍然应该能够通过输入验证检查变量是否设置为 terraform.workspace
  • 当你在remote中存储状态并使用workspace来区分key时,很容易出错。假设我切换到工作区“一”并尝试运行工作区“二”的脚本。但我认为,terraform 在避免这些错误和测试时的差异方面非常可靠。

标签: terraform terraform0.12+


【解决方案1】:

您在这里所指的不是实际的 Terraform 功能,而是利用早期版本的 Terraform 中的错误来获得 Terraform 没有明确支持的结果的示例。

话虽如此,现代版本的 Terraform 支持 custom variable validation rules,它允许您直接在相应的 variable 块内写出变量验证检查。例如:

variable "variable" {
  type = number

  validation {
    condition     = var.variable == 1
    error_message = "Variable value must always be 1."
  }
}

话虽如此,我只是从此处的问题中复制了您的人为示例,因此这需要针对实际示例进行一些调整。另请注意,变量验证规则只能依赖于变量值和其他常量,因此您不能将其用于更复杂的检查,例如涉及两个不同变量的检查。对于这种情况,我建议进行重构,以便相关的值到达对象类型的单个变量中,然后验证该对象是否有效。

【讨论】:

  • 正如我在上面的评论中提到的,我正在尝试使用输入变量验证 terraform.workspace 变量。正如您所提到的,我可能无法做到这一点,因为变量验证不允许在块中提及任何其他变量。考虑到这是我们目前所能做的最多的事情,我将接受这个作为答案。
  • 这个即将推出的功能看起来非常接近我想问的 - github.com/hashicorp/terraform/pull/25088
  • 不幸的是,该功能似乎没有进展:-(
【解决方案2】:

目前仍然无法验证需要访问多个变量的输入。 (validation 块只允许访问已验证的变量。)

使用 external 数据源仍然可以进行 hacky 验证:

data "external" "check_valid" {
  count = var.to_test == true && some_other_condition ? 1 : 0
  
  program = ["sh", "-c", ">&2 echo Condition must be satisfied when to_test is true; exit 1"]
}

在 terraform 请求批准计划之前检查此条件。

在输出中它看起来像这样:

Error: failed to execute "sh": Condition must be satisfied when to_test is true


  on variables.tf line 1, in data "external" "check_valid":
  1: data "external" "check_valid" {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2021-12-22
    相关资源
    最近更新 更多