Terraform:我可以将ignore_changes传递给模块吗?

mva*_*mva 9 terraform terraform-modules

我可以传递ignore_changes到 terraform 模块吗?就我而言,我不想在更新 AMI 时更新自动缩放组。

简单回顾一下,似乎无法做到 - https://github.com/hashicorp/terraform/issues/21546

当然,我可以有两个复制粘贴的模块版本 - 一个有ignore_changes,另一个没有,但看起来不太好。也许我只是错过了一些东西?

cod*_*des 8

截至 2022 年 2 月 16 日,这似乎是不可能的。GitHub 上有两个问题记​​录了这一点,一个是您在此处指出的,另一个是关于处理生命周期属性中的插值的更一般的问题:https: //github.com/hashicorp/terraform/issues/3116。截至目前,推理似乎是:

@phinze:
这里真正的问题是生命周期块不能包含插值。这是因为生命周期修改可以改变图的形状,这使得处理它们的计算值变得更加棘手。这是我们理论上可以做到的事情,但需要一些思考和努力。标记作为增强。


对于解决方法(尽管不是最佳),我们可以将值硬编码到ignore_changes模块作用域中,然后count与变量一起使用,例如从模块作用域create_resource_with_ignore_changes = 1获取我们的资源。ignore_changes我知道这不是问题所要求的,而是硬编码ignore_changes到模块中并通过计数开关对其进行配置。以下是其工作原理的示例:

变量.tf

variable "create_resource_with_ignore_changes" {
  type        = number
  description = "Choose whether to create a version that uses hardcoded ignore_changes"
  default     = 1
}
Run Code Online (Sandbox Code Playgroud)

调用模块.tf

module "servers" {
  source                              = "./app-cluster"
  create_resource_with_ignore_changes = var.create_resource_with_ignore_changes
}
Run Code Online (Sandbox Code Playgroud)

内部服务器模块.tf

resource "a_terraform_resource" "example" {
  count = var.create_resource_with_ignore_changes
  # ...
  lifecycle {
    ignore_changes = [
        # your hardcoded changes to ignore here
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的一个好处是您仍然可以使用单个模块来拥有不同的配置。您还可以将其他逻辑嵌套到 count 参数中,例如,通过创建字符串并使用三元运算符确定它是否匹配:

resource "a_terraform_resource" "example" {
  count = var.my_resource_config == "someHardcodedNamedConfig" ? 1 : 0
  # ...
}
Run Code Online (Sandbox Code Playgroud)

这也让我思考是否可以有条件地控制区块lifecycle。有一篇文章在这里回答了这个问题:Terraform有条件地应用生命周期块

不幸的是,这也是不可能的,出于与此特定问题的解释类似的原因,使重复资源(一个带有块,一个不带块lifecycle)成为当前可行的解决方法。