1

我为三种不同的环境提供了三个特定的用户数据文件。根据用户对env(环境)变量的输入,我们必须为aws_instanceterraform 资源选择任一用户数据文件。

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

2 回答 2

3

除非您在问题中过度简化您的问题,否则您正在模板化静态文件,而不是实际将变量传递给它们。

因为这些静态文件似乎只因该硬编码域而异,所以您应该使用以下内容动态呈现它们:

用户数据.sh.tpl

#!/usr/bin/env bash
DOMAIN="${domain}"
PORT="8080"

实例.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地图中查找与环境匹配的域,然后将其替换为模板的渲染输出。

于 2018-01-30T10:28:19.803 回答
1

如果您确实想为每个环境使用单独的模板文件,您可以按环境名称查找相应的文件:

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}"
  ...
}
于 2018-01-30T22:52:37.717 回答