#terraform #terraform-provider-azure
Вопрос:
В настоящее время у меня есть модуль, который содержит блок со многими настраиваемыми свойствами
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
исключением нескольких исключений, которые должны привести к изменениям, если они будут изменены в будущем. (Например, в приведенном выше ресурсе, если property1
он изменен, он должен генерировать разницу, но не для других)
Игнорировать такие изменения можно с помощью ignore_changes
lifecycle
блока «Внутри». Но, похоже, это похоже на то, чтобы сделать все вышесказанное. Добавление всего block1
аргумента к этому приведет к тому, что все изменения внутри будут проигнорированы, или нам придется добавлять все игнорируемые свойства внутри блока по одному в ignore_changes
блок, как я упоминал в примере.
Выполнение этого вручную немного усложняет обслуживание, так как вам придется продолжать добавлять/удалять новые свойства по мере добавления/удаления нового свойства в блок. Итак, можно ли настроить ignore_changes
блок так, чтобы он игнорировал все изменения и специально добавлял необходимые исключения?
P.S.
Я не считаю, что этот вопрос относится к определенному ресурсу, но ресурс, к которому я пытаюсь применить эту концепцию, — это ресурс службы приложений Azure, в частности site_config
, его блок.
Ответ №1:
Самый простой подход, который я могу придумать, — это просто перечислить все отдельные свойства, возможные в этом блоке, за исключением тех, которые вы не хотите игнорировать. Это все равно было бы утомительно и некрасиво.
Вот более умный (непроверенный) подход, чтобы попробовать
#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)
}