Как мне управлять тремя (для каждой среды) файлами пользовательских данных в terraform?
У меня есть три конкретных файла пользовательских данных для трех разных сред. На основе пользовательского ввода на env
(переменная окружения), мы должны выбрать один из файлов пользовательских данных для aws_instance
терраформный ресурс.
variable "env" {
description = "choose env between dev | prod | qa "
}
Вот три файла пользовательских данных:
user_data_dev.sh
:#!/bin/bash DOMAIN = "testing.dev.xxxx.com" PORT = "8080"
user_data_prod.sh
#!/bin/bash DOMAIN = "testing.prod.xxxx.com" PORT = "8080"
user_data_qa.sh
#!/bin/bash DOMAIN = "testing.qa.xxxx.com" PORT = "8080" resource "aws_instance" "server" { ami = "ami-123456" instance_type = "t2.medium" availability_zone = "us-east-1" user_data = "${template_file.user_data_graphite.rendered}" root_block_device { delete_on_termination = true volume_size = "${var.volume_size}" volume_type = "${var.volume_type}" } tags { Name = "domain_testing" }
2 ответа
Если вы не упрощаете свою проблему в вопросе, вы шаблонизируете статические файлы вместо того, чтобы фактически передавать в них переменные.
Поскольку эти статические файлы, похоже, различаются только в этом жестко закодированном домене, вам просто нужно динамически их визуализировать, например:
пользователя data.sh.tpl
#!/bin/bash
DOMAIN = "${domain}"
PORT = "8080"
instance.tf
variable "environment" {}
variable "environment_domains" {
default = {
"dev" = "testing.dev.xxxx.com"
"qa" = "testing.prod.xxxx.com"
"prod" = "testing.qa.xxxx.com"
}
}
data "template_file" "user_data" {
template = "${file("${path.module}/user-data.sh.tpl")}"
vars {
domain = "${lookup(var.environment_domains, var.environment)}"
}
}
resource "aws_instance" "server" {
...
user_data = "${template_file.user_data.rendered}"
...
}
Учитывая окружение, Terraform будет искать домен, который соответствует окружению, из environment_domains
сопоставить, а затем подставить это в визуализированный вывод шаблона.
Если вы хотите использовать отдельные файлы шаблонов для каждой среды, вы можете найти соответствующий файл по имени среды:
data "template_file" "user_data" {
template = "${file("${path.module}/user-data-${var.env}.sh")}"
...
}
resource "aws_instance" "server" {
user_data = "${template_file.user_data.rendered}"
...
}