Terraform - 我应该使用 user_data 还是 provisioner 来引导资源?

16

看起来我可以使用模板文件或 "remote-exec" provisioner 的内联命令来引导启动,它们都可以使用 user_data。那么哪一个更符合惯用语呢?

3个回答

27
您应该使用user_data用户数据字段是惯用语,因为它是AWS原生的,而远程执行提供程序是特定于Terraform的,这只是调用AWS API的众多方法之一。
此外,可以在AWS控制台中查看用户数据,并且通常是在AWS中使用自动缩放组的重要部分,其中您希望每个EC2实例在启动时执行相同的配置代码。使用Terraform的远程执行提供程序无法实现这一点。

3
除此之外,在使用自动扩展时,使用user_data也是适用的,因为它可以包含在启动配置中。因此,使用user_data可以使静态实例和自动扩展实例保持一致性。 - Martin Atkins

5

我同意Josh的说法,如果实例没有运行时更改,您可以使用packer构建ami,然后在启动配置中使用它。这样,您就不必等待用户数据运行。

Packer是Hashicorp工具系列的一部分。

https://www.packer.io/docs/builders/amazon-ebs.html


1
这是一个很有道理的观点。事实上,如果您不需要配置是动态的(例如,仅在EC2实例启动时检测到的私有IP地址),构建AMI通常是处理配置最快、最可靠的方式。 - Josh Padnick
感谢您的建议。我同意AMI应该是正确的选择。然而,我的组织目前不允许自定义镜像。 - Chris

1

它完全基于条件和场景。

情况:当您在自动缩放组中主要使用模板时,应使用user_data。由于所有新启动的实例都将使用相同的初始化脚本启动,因此还有一个好处,您实际上可以在AWS控制台日志中查看输出。

情况:当您正在启动新实例并且一旦它启动后,您的配置管理工具运行或使用模板工具时。

provisioner "remote-exec" {
inline = [
  "puppet apply",
  "consul join ${aws_instance.web.private_ip}",
]
}

请参考文档中的远程执行部分,了解更多关于远程执行的信息:Docs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接