mva*_*mva 9 terraform terraform-modules
我可以传递ignore_changes到 terraform 模块吗?就我而言,我不想在更新 AMI 时更新自动缩放组。
简单回顾一下,似乎无法做到 - https://github.com/hashicorp/terraform/issues/21546
当然,我可以有两个复制粘贴的模块版本 - 一个有ignore_changes,另一个没有,但看起来不太好。也许我只是错过了一些东西?
截至 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)成为当前可行的解决方法。
| 归档时间: |
|
| 查看次数: |
20351 次 |
| 最近记录: |