Как я могу запустить код Terraform в последовательности? - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь настроить некоторую автоматизацию вокруг инфраструктуры AWS.Просто столкнулся с одним вопросом о зависимостях модуля.Поскольку в terraform нет опции типа «Включить», поэтому достижение моей цели становится немного трудным.

Вот краткое описание сценария:

В моем корневом каталоге я имеюфайл main.tf

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

module mytest1
{
source = mymod/dev
}

module mytest2
{
source = mymod2/prod
}

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

Поскольку модуль не зависит, я подумал, есть ли способ запустить модули в последовательности или какие-либо другие идеи?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2019

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

Чтобы справиться с этим, вы можете использовать terraform workspacesи создайте одно рабочее пространство для каждого env, например:

terraform worskspace new staging

Это создаст совершенно новое рабочее пространство с собственным состоянием.Если вам нужно определить количество создаваемых ресурсов, вы можете использовать переменную sor самого имени рабочего пространства terraform, например:

# Your EC2 Module
"aws_instance" "example" {
    count = "${terraform.workspace == "prod" ? 3 : 1}"
}

# or

"aws_instance" "example" {
    count = "${lenght(var.subnets)}" # you are likely to have more subnets for prod
}


# Your module
module "instances" {
source = "./modules/ec2"
subnets = "my subnets list"
}

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

Подробнее о рабочих пространствах можно прочитать здесь

0 голосов
/ 24 апреля 2019

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

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

# (this goes within a file in your mymod/dev directory)
output "vpc_id" {
  value = "${aws_vpc.example.id}"
}

Тогда ваш производственный модуль, наоборот, будет иметь входную переменную для указания этого:

# (this goes within a file in your mymod2/prod directory)
variable "vpc_id" {
  type = "string"
}

После установки ваш родительский модуль может передать значение между ними, чтобы установить искомую зависимость:

module "dev" {
  source = "./mymod/dev"
}

module "prod" {
  source = "./mymod2/prod"

  vpc_id = "${module.dev.vpc_id}"
}

Это работает, потому что создает следующую цепочку зависимостей:

module.prod's input variable vpc_id depends on
module.dev's output value vpc_id, which depends on
module.dev's aws_vpc.example resource

Затем вы можете использовать var.vpc_id в любом месте вашего производственного модуля для получения этого идентификатора VPC, который создает другую ссылку в этой цепочке зависимостей, сообщая Terraform, что он должен дождаться создания VPC, прежде чем предпринимать какие-либо действия, зависящие от VPC. существовать.

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

Дополнительная информация по этому шаблону приведена в разделе документации Состав модуля . Он написан с учетом синтаксиса и возможностей Terraform v0.12, но общий шаблон все еще применим к более ранним версиям, если вы вместо этого выражаете его с использованием синтаксиса и возможностей v0.11, как я делал в примерах выше.

0 голосов
/ 24 апреля 2019

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

Я ожидаю, что у вас может быть что-то похожее на следующую структуру папок:

  • Папка 1: Dev (Содержит модули для dev)
  • Папка 2: Prod (Содержит модули для Prod)
  • Папка 3: Ресурсы (Содержит общие блоки ресурсов, которые используются как модулем dev, так и модулем prod)

Затем, когда вы запускаете terraform apply для папки 1, она будетсоздайте свою инфраструктуру разработки, передав переменные из ваших модулей в ресурсы (в папке 3).

И когда вы запустите terraform apply для папки 2, она создаст инфраструктуру вашего продукта, передав переменные из ваших модулей.к ресурсам (в папке 3).

Если по какой-либо причине вы не можете этого сделать, то выходные переменные или источники данных могут потенциально помочь вам получить необходимую информацию.

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