Terraform - 我应该使用 user_data 还是 Provisioner 来引导资源?
Posted
技术标签:
【中文标题】Terraform - 我应该使用 user_data 还是 Provisioner 来引导资源?【英文标题】:Terraform - should I use user_data or provisioner to bootstrap a resource? 【发布时间】:2017-11-06 18:22:14 【问题描述】:似乎我可以将user_data
与模板文件一起使用,或者将“远程执行”provisioner
与内联命令一起使用来引导。那么哪一个被认为更惯用呢?
【问题讨论】:
【参考方案1】:您应该使用user_data
。 user data 字段是惯用的,因为它是 AWS 原生的,而 remote-exec 配置器是特定于 Terraform 的,这只是调用 AWS API 的众多方法之一。
此外,用户数据可在 AWS 控制台中查看,这通常是在 AWS 中使用 Auto Scaling 组的重要部分,您希望每个 EC2 实例在启动时执行相同的配置代码。使用 Terraform 的 remote-exec 配置器无法做到这一点。
【讨论】:
除此之外,在使用自动缩放时使用user_data
也适用,因为它可以包含在启动配置中。因此,使用 user_data
可以在静态实例和自动缩放实例之间提供一致性。【参考方案2】:
虽然我同意 Josh 的观点,但如果实例没有运行时更改,您可以使用 packer 构建一个 ami,然后在启动配置中使用它。这样您就不必等待用户数据运行。
Packer 是 Hashicorp 工具系列的一部分
https://www.packer.io/docs/builders/amazon-ebs.html
【讨论】:
这是一个有效的点。事实上,如果您不需要动态配置(例如,通过检测仅在 EC2 实例启动时才知道的私有 IP 地址),构建 AMI 通常是处理配置的最快和最可靠的方式。 感谢您的建议。我同意 AMI 应该是要走的路。但是,我的组织目前不允许自定义图像。【参考方案3】:它完全基于条件和场景。
案例:如果您主要在自动缩放组中使用模板,您应该使用 user_data。由于启动的所有新实例都将使用相同的初始化脚本启动,这还有一个好处,您实际上可以在 AWS 控制台日志中看到 o/p。
案例:当您启动新实例时,一旦启动,您的配置管理工具或模板工具就会运行。
provisioner "remote-exec"
inline = [
"puppet apply",
"consul join $aws_instance.web.private_ip",
]
远程执行请参考Docs
【讨论】:
以上是关于Terraform - 我应该使用 user_data 还是 Provisioner 来引导资源?的主要内容,如果未能解决你的问题,请参考以下文章