Могут ли разные модули в terraform использовать один и тот же файл vars - PullRequest
1 голос
/ 03 июня 2019

У меня есть следующий файл tf:

provider "aws" {
  region = "us-east-1"
}

module "ec2"{
    source = “../service1”
    app                 = "${var.app}"
    env                 = "${var.env}"
}

module "workspaces"{
    source = “../service2”
    app                 = "${var.app}"
    env                 = "${var.env}"

 }

, хотя service1 и service2 - это разные модули, их базовый файл variables.tf абсолютно одинаков. Есть ли способ использовать общий файл variables.tf для обоих модулей?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

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

Если вы используете файловую систему, которая поддерживает символические ссылки, вы можете использовать те же символические ссылки .tf файл в несколько каталогов, чтобы получить аналогичный эффект.Тем не менее, если набор объявлений переменных не является особенно большим или сложным, я бы рекомендовал просто скопировать их: в долгосрочной перспективе хранение каждой конфигурации часто более полезно, чем избегание небольшого копирования простого стандартного кода.


Если вы используете Terraform v0.12, вы можете объединить все эти общие настройки в единое значение объекта, чтобы уменьшить шаблон:

locals {
  context = {
    app = "example"
    env = var.environment
  }
}

module "ec2" {
  source = "../service1"

  context = local.context
}

module "workspaces" {
  source = "../service2"

  context = local.context
}

Объявление переменной, подобноеследующие (в каждом из ваших дочерних модулей) сделают форму этого context объекта более явной, поэтому Terraform сможет обнаружить и сообщить об ошибке, если передано недопустимое значение:

variable "context" {
  type = object({
    app = string
    env = string
  })
}

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

Например, если вы хотите отделить ec2 модуль от его вызывающего, возможно, вы бы спроектировали еготак что у него нет понятия «приложение» или «окружение» - эти понятия принадлежат модулю вызывающего, но не являются понятиями EC2 - и вместо этого выражают то же самое в более EC2-ориентированном виде, например, через теги:

locals {
  # Common tags for all AWS objects
  aws_tags = {
    Name        = "example ${var.environment}"
    Environment = var.environment
  }
}

module "ec2" {
  source = "../service1"

  # (other EC2-oriented settings)

  tags = local.aws_tags
}

При таком подходе модуль EC2 заботится только о концепциях EC2, а корневой модуль переводит свои собственные представления о «приложении» и «среде» в представление о тегах в EC2.Это может позволить позднее использовать тот же модуль EC2 в другом контексте, где, например, подходит другая схема тегирования.

Более подробная информация об этом подходе приведена в разделе документации Terraform по Состав модуля .

0 голосов
/ 03 июня 2019

Да, вы можете.

Структура папок будет:

/service1
  --main.tf
  --var.tf

/service2
  --main.tf
  --var.tf

main.tf
var.tf

Содержимое . / Service1 / var.tf и ./service2/var.tf:

variable "app" {}

variable "env" {}

Содержимое . / Var.tf

variable "app" {
   default = "YOUR-APP-NAME"
}
variable "env" {
   default = "dev"
}

Или вы можете сохранить содержимое всех переменных var.tf и передать флаг -var из CLI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...