Как мне управлять тремя (для каждой среды) файлами пользовательских данных в terraform?

У меня есть три конкретных файла пользовательских данных для трех разных сред. На основе пользовательского ввода на env (переменная окружения), мы должны выбрать один из файлов пользовательских данных для aws_instance терраформный ресурс.

variable "env" {
   description = "choose env between dev | prod | qa "
}

Вот три файла пользовательских данных:

  1. user_data_dev.sh:

    #!/bin/bash
    DOMAIN = "testing.dev.xxxx.com"
    PORT = "8080"
    
  2. user_data_prod.sh

    #!/bin/bash
    DOMAIN = "testing.prod.xxxx.com"
    PORT = "8080"
    
  3. 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}"
  ...
}
Другие вопросы по тегам