Возможна ли переменная провайдера в терраформе?

По-прежнему невозможно использовать поставщик переменных в Terraform v0.12.6? В * .tfvars у меня есть переменная списка поставщик

supplier = ["azurerm.core-prod","azurerm.core-nonprod"]

и провайдеры, определенные в provider.tf:

provider "azurerm" {
  ...
  alias           = "core-prod"
}

provider "azurerm" {
  ...
  alias = "core-nonprod"

то я хочу сослаться на него в * .tf. Ниже приведен пример с «данными», но то же самое относится и к «ресурсу».

data "azurerm_public_ip" "pip" {
  count = "${var.count}"
   ....
   provider = "${var.supplier[count.index]}"
} 

Что такое обходной путь? Ошибка: недействительная ссылка на конфигурацию поставщика, показывающая, что аргумент поставщика требует имени типа поставщика, за которым может следовать точка, а затем псевдоним конфигурации.


person irom    schedule 15.08.2019    source источник
comment
Для этого вам необходимо настроить псевдоним провайдера. Документация находится здесь: terraform.io/docs/configuration/. Есть также ответы на Stack Overflow о том, как их использовать, на которые вы можете ссылаться. Также это стало возможно, по крайней мере, с 0.11.   -  person Matt Schuchard    schedule 15.08.2019
comment
Извините, я обновил свой вопрос с помощью provider.tf, конечно, он у меня настроен   -  person irom    schedule 15.08.2019


Ответы (1)


Невозможно динамически связать ресурс с поставщиком. Подобно тому, как в языках программирования со статической типизацией вы обычно не можете динамически переключать определенный символ для ссылки на другую библиотеку во время выполнения, Terraform необходимо привязать блоки ресурсов к конфигурациям провайдера, прежде чем станет возможной оценка выражения.

Что вы можете сделать, так это написать модуль, который ожидает получить конфигурацию поставщика от вызывающего, а затем статически выбрать конфигурацию поставщика для каждого экземпляра этого модуля:

provider "azurerm" {
  # ...

  alias = "core-prod"
}

module "provider-agnostic-example" {
  source = "./modules/provider-agnostic-example"

  providers = {
    # This means that the default configuration for "azurerm" in the
    # child module is the same as the "core-prod" alias configuration
    # in this parent module.
    azurerm = azurerm.core-prod
  }
}

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

Общий подход состоит в том, чтобы иметь отдельную конфигурацию для каждой среды, с общими модулями, представляющими любые характеристики, общие для сред, но дающими возможность для представления любых различий, которые могут существовать между ними. В простейшем случае это могут быть две конфигурации, которые состоят только из одного блока module и одного блока provider, каждая с некоторыми разными аргументами, представляющими конфигурацию для этой среды, и с общим модулем, содержащим все блоки resource и data. . В более сложных системах может быть несколько модулей, интегрированных вместе с использованием методов композиции модулей.

person Martin Atkins    schedule 15.08.2019
comment
спасибо за пост. В приведенном выше сценарии, если мы поместим 4 поставщика псевдонимов в блок поставщиков модулей (все aws, по 1 для каждого региона us), как дочерние модули будут их использовать? Могут ли они передать регион, а затем с помощью интерполяции выбрать нужного провайдера из списка? - person tavor999; 08.11.2019