Поставщик Terraform / совместное использование переменных в модулях

Есть ли способ абстрагироваться от поставщика для всех модулей, определенных в проекте.

например у меня есть этот проект

├── modules
│   ├── RDS
│   └── VPC
└── stacks
    ├── production
    │   └── main.tf
    └── staging
        └── main.tf

и он отлично работает ... проблема с определением модулей

├── RDS
│   ├── README.md
│   ├── main.tf
│   ├── providers.tf
│   └── variables.tf
└── VPC
    ├── README.md
    ├── main.tf
    ├── providers.tf
    └── variables.tf

провайдер в обоих этих модулях точно такой же

# providers.tf
provider "aws" {
  region = "${var.region}"
  version = "~> 1.26"
}

и переменные в каждом модуле разные, но все они имеют переменную region.

# variables.tf
variable "region" {
  default     = "eu-central-1"
  description = "AWS region."
}
# other module dependent variables...

есть ли способ определить эти биты информации на уровне модулей, чтобы я получил что-то примерно такое

├── modules
│   ├── providers.tf  <<< include the *shared* provider definition block
│   ├── variables.tf  <<< include the *shared* region vaiable definition block
│   ├── RDS
│   │   ├── README.md
│   │   ├── main.tf
│   │   └── variables.tf
│   └── VPC
│       ├── README.md
│       ├── main.tf
│       └── variables.tf

И последнее: определения модулей в большинстве случаев имеют атрибут ресурса (извлечение модуля из реестра terraform ... поэтому я не знаю, возможно ли унаследовать как источник из реестра, так и базовый модуль)


person a14m    schedule 06.07.2018    source источник
comment
Вы должны использовать рабочие области / ветки вместо того, чтобы помещать среды в каталог. Это решит вашу проблему и будет соответствовать лучшим практикам. terraform.io/docs/enterprise/workspaces/repo-structure.html < / а>   -  person Matt Schuchard    schedule 08.07.2018
comment
Я выбрал самое простое решение для символической ссылки на файл provider.tf ... Я планирую вскоре протестировать terragrunt и посмотреть, как это будет ... прямо сейчас символические ссылки работают нормально ... что касается модели ветвей рабочей области, это немного сложно (и команда не получит от этого никакой пользы, поскольку мы все новички в терраформе) и просто запутаемся в ветвях, пытаясь что-то исправить (это нужно применять во многих ветках)   -  person a14m    schedule 12.07.2018
comment
@MattSchuchard Эта ссылка terraform дает три варианта, одна из которых - использовать ветку для каждой среды. Для типичных репозиториев на основе git использование такого ветвления противоречит большинству базовых рекомендаций git.   -  person GaTechThomas    schedule 15.12.2020


Ответы (4)


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

TL; DR
совместное использование переменных между модулями противоречит принципам ясности / ясности ядра terraform.

Временное решение
Временное решение - разместить *shared* файлы в родительском каталоге и использовать символические ссылки для их добавления в модули.

person a14m    schedule 06.07.2018
comment
Это проблематично - я пробовал это, но получил дополнительный ресурс. TL; DR Я связал sgA.tf в moduleB из moduleA, и sgA 'создается ... не то, что я ожидал (я просто хотел использовать sgA в moduleB) - person Antonio Gomez Alvarado; 09.12.2019
comment
Таким образом, разработчики Terraform упустили главную концепцию разработки программного обеспечения: DRY. Хромой. - person jcollum; 13.03.2020

Если вы знаете terragrunt, это не составит никаких проблем.

Terragrunt - это тонкая оболочка для Terraform, которая предоставляет дополнительные инструменты для работы с несколькими модулями Terraform.

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

account
 └ _global
 └ region
    └ _global
    └ environment
       └ resource

Быстрый старт

Ознакомьтесь с примером-модулями-инфраструктурой и terragrunt-Infrastructure-live-example для полнофункционального примера кода, демонстрирующего эти функции.

вы можете использовать prod/terraform.tfvars или prod/account.tfvars для глобальных переменных или поместить файл tfvars в папку _global.

person BMW    schedule 07.07.2018

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

Для вашего случая использования вы можете определить поставщиков с псевдонимами в своих папках стека (вероятно, лучше всего определить это в файле и сделать символические ссылки для каждой папки стека):

# stacks/{staging,production}/providers.tf
provider "aws" {
  alias  = "us-east-1"
  region = "us-east-1"
}

provider "aws" {
  alias   = "us-east-2"
  region  = "us-east-2"
}

Затем, когда вы вызываете модули, передайте псевдоним поставщика, который вы хотите использовать (это предполагает, что модуль использует только 1 из любого конкретного типа поставщика):

# stacks/{staging,production}/main.tf
module "VPC-us-east-1" {
  source = "../../modules/VPC"

  providers = {
    aws      = "aws.us-east-1"
  }
}

module "VPC-us-east-2" {
  source = "../../modules/VPC"

  providers = {
    aws      = "aws.us-east-2"
  }
}
person Eric M. Johnson    schedule 08.07.2018
comment
может ли провайдер в модуле использовать интерполяцию? то есть `` провайдеры = {aws = $ {var.my_region}} `` ` - person tavor999; 08.11.2019

В настоящее время для языка конфигурации Hashicorp нет функции глобальных переменных.

И variables используются для определения интерфейсов модулей модулей или действуют как переменные ENV (inline ENV). Итак, это не лучший способ использовать переменную как глобальную. Потому что каждый раз, когда вы определяете какие-то модули, вам всегда нужно думать о том, какие переменные вы использовали в верхних модулях. И, вероятно, в итоге вы получите: first_module_s3_bucket_name, second_module_s3_bucket_name.

Но locals имеет смысл делиться дочерними модулями. Потому что местные жители считают, что это помогает избежать повторения одного и того же значения.

Если вам интересно, есть новое обсуждение запроса функции Hashicorp.

https://github.com/hashicorp/terraform/issues/25431

person Zogoo    schedule 30.06.2020