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

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

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"
    }
    

person karthik    schedule 30.01.2018    source источник
comment
1. Выведите подсказку. 2. Получите пользовательский ввод. 3. Используйте блок switch или if ... else if ... else, чтобы определить, какой файл сценария запускать на основе этого. 4. Запускаем скрипт.   -  person Agi Hammerthief    schedule 30.01.2018


Ответы (2)


Если вы не упрощаете свою проблему в вопросе, вы создаете шаблоны статических файлов вместо фактической передачи в них переменных.

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

user-data.sh.tpl

#!/usr/bin/env 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, и затем подставит его в визуализированный вывод шаблона.

person ydaetskcoR    schedule 30.01.2018

Если вы хотите использовать отдельные файлы шаблонов для каждой среды, вы можете найти соответствующий файл по имени среды:

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}"
  ...
}
person glucas    schedule 30.01.2018