как динамически передать параметр в модуль terraform и запустить модуль на основе условия

#terraform

Вопрос:

У меня есть требование запускать модули на условной основе, а также динамически создавать список параметров для вызываемого модуля из переменной map.

Мой main.tf файл выглядит так, как показано ниже

 provider "aws" {
  region = var.region

}

module "CreateResource1" {
  source = "./modules/CreateResource1"
  ProductName = "Test1"
  ProductColour = "Red"
  ProductShape = "Hexagone"
}


module "CreateResource2" {
  source = "./modules/CreateResource2"
  ProductName = "Test2"
  ProductType = "xyz"
  ProductModel = "abc"
  ProductPrice = ""
  
}

 

требованием является условная переменная module_name, которую передаст пользователь, и на основе этого мне нужно выполнить любой из модулей в соответствии с условием.

Кроме того, вместо передачи таких параметров, как ProductName, ProductColour, ProductShape в качестве отдельных переменных, пользователь будет передавать их как переменную dict, и я хотел бы динамически построить переменную с ключом и значением для модуля.

Ввод от пользователя будет выглядеть так, как показано ниже.

 module "Resource" {
  module_name = "CreateResource1"
  parameters = {
    ProductName = "Test1"
    ProductColour = "Red"
    ProductShape = "Hexagone"
  }
}
 

на основе приведенных выше входных данных мне нужно выбрать модуль для запуска и построить параметры для модуля.

поскольку я новичок в терраформировании, любые зацепки будут оценены по достоинству. Используемая версия Terraform-1.0.0

С уважением

Комментарии:

1. Эта архитектура вызовет огромные проблемы с вашим состоянием, поэтому вам нужно будет подойти к этому по-другому.

2. Привет, Мэтт, не могли бы вы предложить некоторые решения для решения этой проблемы?

Ответ №1:

Если возможно, я бы просто изменил модули, чтобы они принимали карту, подобную вызывающему модулю:

(Отказ от ответственности: частичный, непроверенный пример)

модули/ресурс/main.tf

 variable "module_name" {
  type = string
}

variable "parameters" {
  type = map
}

module "CreateResource1" {
  source = "../CreateResource1"
  count = var.module_name == "CreateResource1" ? 1 : 0

  parameters = var.parameters

}

module "CreateResource2" {
  source = "../CreateResource2"
  count = var.module_name == "CreateResource2" ? 1 : 0

  parameters = var.parameters

}
 

main.tf

 module "Resource" {
  source = "./modules/resource"
  module_name = "CreateResource1"
  parameters = {
    ProductName = "Test1"
    ProductColour = "Red"
    ProductShape = "Hexagone"
  }
}
 

Вызываемым модулям потребуется небольшая модификация для определения parameter входной переменной типа map , а затем к значениям можно будет получить доступ в коде с помощью lookup функции (например lookup(var.parameters, "ProductName", "") , — обратите внимание, что 3-й параметр позволяет указать значение по умолчанию, если элемент не существует на карте. Нет причин, по которым это значение нельзя взять из входной переменной, поэтому, если вы не хотите жестко кодировать его здесь, вы могли бы, например, передать его из набора по умолчанию в вызывающем модуле и передать всем/некоторым дочерним элементам). Так, например:

модули/CreateResource1/main.tf (частичный пример)

 variable "parameters" {
  type = map
}

resource "some_resource_type" "some_resource_name" {

  ProductName = lookup(var.parameters, "ProductName", "Product1")
  ProductColour = lookup(var.parameters, "ProductColour", "Red")
  ProductShape = lookup(var.parameters, "ProductShape", "Circle")
}
 

Таким образом, в этом примере для ресурса, созданного с помощью CreateResource1 , требуется 3 параметра. Если они существуют на карте, переданной модулем Resource , то они будут использоваться, а для любых, которые отсутствуют на переданной карте, будут использоваться значения по умолчанию (в данном случае «Product1», «Красный» и «Круг»).

Комментарии:

1. Привет, Clockworknet, спасибо, что поделился схемой потока. Теперь мне ясно, что такое условное исполнение. Я все еще не уверен в типе карты для вызываемого модуля, не могли бы вы поделиться примером этого

2. Я отредактировал свой ответ с дополнительным примером. Учитывая, что ваш вопрос написан в абстрактных терминах, трудно привести конкретный пример.

3. Привет, Clockworknet, спасибо, что поделились примером. Я смог реализовать этот материал и смог подтвердить, что он работает так, как ожидалось