如何在Terraform 0.12中将templatefile函数传递给EC2资源的user_data参数?

时间:2020-06-26 15:54:03

标签: terraform terraform-provider-aws

我需要将下面的templatefile函数传递给EC2资源中的user_data。谢谢

userdata.tf

templatefile("${path.module}/init.ps1", {
  environment = var.env
  hostnames   = {"dev":"devhost","test":"testhost","prod":"prodhost"}
})

ec2.tf

resource "aws_instance" "web" {
  ami           = "ami-xxxxxxxxxxxxxxxxx"
  instance_type = "t2.micro"
  # how do I pass the templatefile Funtion here
  user_data     = ...

  tags = {
    Name = "HelloWorld"
  }
}

1 个答案:

答案 0 :(得分:9)

由于templatefile是内置函数,因此可以call直接将其包含在您希望将值分配给的参数中:

resource "aws_instance" "web" {
  ami           = "ami-xxxxxxxxxxxxxxxxx"
  instance_type = "t2.micro"
  user_data     = templatefile("${path.module}/init.ps1", {
    environment = var.env
    hostnames   = {"dev":"devhost","test":"testhost","prod":"prodhost"}
  })

  tags = {
    Name = "HelloWorld"
  }
}

如果模板仅出于一种目的而定义(如此处所示),并且您不会在其他任何地方使用该结果,则上述方法是一种很好的方法。在要在多个位置使用同一模板结果的情况下,可以使用local value赋予该结果一个名称,然后可以在模块中的其他位置使用该名称:

locals {
  web_user_data = templatefile("${path.module}/init.ps1", {
    environment = var.env
    hostnames   = {"dev":"devhost","test":"testhost","prod":"prodhost"}
  })
}

resource "aws_instance" "web" {
  ami           = "ami-xxxxxxxxxxxxxxxxx"
  instance_type = "t2.micro"
  user_data     = local.web_user_data

  tags = {
    Name = "HelloWorld"
  }
}

在定义了本地值web_user_data之后,您可以使用local.web_user_data在同一模块的其他位置引用它,从而在多个位置使用模板结果。但是,我建议您仅在需要在多个位置使用结果时才这样做。如果模板结果仅用于此特定实例的user_data,则将其放在上面第一个示例中的内联中将使事情变得更简单,从而希望对以后的读者和维护者更容易理解。