如何将templatefile函数传递给Terraform 0.12中EC2资源的用户_数据参数?

如何将templatefile函数传递给Terraform 0.12中EC2资源的用户_数据参数?,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我需要将下面的templatefile函数传递给EC2资源中的user\u data。多谢各位 userdata.tf ec2.tf 由于templatefile是一个内置函数,您可以通过将其直接包含在要为其赋值的参数中: resource "aws_instance" "web" { ami = "ami-xxxxxxxxxxxxxxxxx" instance_type = "t2.micro&q

我需要将下面的
templatefile
函数传递给EC2资源中的
user\u data
。多谢各位

userdata.tf

ec2.tf


由于
templatefile
是一个内置函数,您可以通过将其直接包含在要为其赋值的参数中:

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"
  }
}
如果模板仅为一个目的定义,那么上述方法是一种很好的方法,就像这里的情况一样,并且您不会在其他任何地方使用该结果。如果要在多个位置使用同一模板结果,可以使用为该结果命名,然后在模块中的其他位置使用:

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\u user\u data
后,您可以使用
local.web\u user\u data
在同一模块中的其他位置引用它,从而在多个位置使用模板结果。但是,我建议只有在需要在多个位置使用结果时才这样做;如果模板结果只针对这个特定实例的
用户\u数据
,那么像我上面的第一个示例那样将其内联将使事情变得更简单,从而希望将来的读者和维护人员更容易理解。

这是一个很好的答案。解释得非常好,并提供了内联和分离声明的良好示例。
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"
  }
}
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"
  }
}