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 来引导资源?的主要内容,如果未能解决你的问题,请参考以下文章

使用Terraform部署代码和管理配置

Terraform - 在可用时使用 rds 快照

在 Terraform 工作空间之间共享资源

仅在不存在时如何创建 terraform 资源

我可以使用 Terraform 创建 GCP API 密钥吗?

使用 Terraform 导入 Azure 上的现有资源