Терраформирование — Добавление исключений в ignore_changes

#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)
}