如何在terraform中管理三个(每个环境)用户数据文件?

时间:2018-01-30 10:15:56

标签: terraform terraform-template-file

我有三个不同环境的三个特定用户数据文件。根据{{​​1}}(环境)变量的用户输入,我们必须为env terraform资源选择一个用户数据文件。

aws_instance

以下是三个用户数据文件:

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

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

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

    user_data_qa.sh

2 个答案:

答案 0 :(得分: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地图中查找与环境匹配的域,然后将其替换为模板的渲染输出。

答案 1 :(得分: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}"
  ...
}