我目前有一个模块,其中包含一个具有许多可配置属性的 block
resource "example_resource" "instance1" {
block1 {
property1 = var.variable1 # Should generate a diff if changed
property2 = var.variable2 # Ignore
property3 = var.variable3 # Ignore
....
....
propertyN = var.variableN # Ignore
}
lifecycle {
ignore_changes = [
block1[0].property2, block1[0].property3, ... ,block1[0].propertyN
]
}
}
生成资源后,block1
中的许多属性可能会因与用户的交互而发生变化。我想在运行 terraform plan
时忽略此类更改,除了一些异常(exception)情况,如果将来发生更改,这些异常(exception)情况应该会产生差异。 (例如,在上述资源中,如果 property1
发生更改,它应该生成差异,但不会为其他资源生成差异)
可以使用lifecycle
block 中的ignore_changes
来忽略此类更改。但似乎要做上面的事情。添加整个 block1
参数将导致其中的所有更改被忽略,或者我们必须将 block 内所有被忽略的属性一一添加到 ignore_changes
block 中,就像我一样示例中已提到。
手动执行此类操作会使维护变得更加困难,因为在向 block 添加/删除新属性时,您必须不断添加/删除新属性。那么是否可以配置 ignore_changes
block 来忽略所有更改并专门添加所需的异常?
附注
我不认为这个问题特定于某个资源,但我试图实现这个概念的资源是 Azure App Service资源,特别是其中的 site_config
block 。
最佳答案
我能想到的最简单的方法是列出该 block 中可能的所有单个属性,除了那些您不想忽略更改的属性。这仍然是乏味且丑陋的。
这里有一个更聪明的(未经测试的)方法可供尝试
#get the existing resource
data "example_resource" "instance1" {
}
resource "example_resource" "instance1" {
block1 {
...
}
lifecycle {
#transform the list of properties so the values all start with block[0].
ignore_changes = [for prop in local.ignore_change_props : "block[0].${prop}"]
}
}
locals {
#these properties we want to exclude from ignore_changes
change_exceptions = ["property1", "property10"],
#get all the properties from the data block in a map, then remove properties to be excluded
ignore_change_props = setsubtract(keys(data.example_resource.instance1.block1), local.change_exceptions)
}
关于Terraform - 向ignore_changes添加异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69241068/