如何使用 cloud-init 和 Terraform 设置主机名?
Posted
技术标签:
【中文标题】如何使用 cloud-init 和 Terraform 设置主机名?【英文标题】:How to set hostname with cloud-init and Terraform? 【发布时间】:2019-06-17 01:27:47 【问题描述】:我从 Terraform 开始。我试图让它设置一个友好的主机名,而不是 AWS 使用的通常的 ip-10.10.10.10
。但是,我还没有找到怎么做。
我尝试使用配置器,如下所示:
provisioner "local-exec"
command = "sudo hostnamectl set-hostname friendly.example.com"
但这不起作用,主机名没有改变。
所以现在,我正在尝试这个:
resource "aws_instance" "example"
ami = "ami-XXXXXXXX"
instance_type = "t2.micro"
tags =
Name = "friendly.example.com"
user_data = "$data.template_file.user_data.rendered"
data "template_file" "user_data"
template = "$file("user-data.conf")"
vars
hostname = "$aws_instance.example.tags.Name"
在user-data.conf
我有一行可以使用变量,如下所示:
hostname = $hostname
但这给了我一个循环依赖:
$ terraform apply
Error: Error asking for user input: 1 error(s) occurred:
* Cycle: aws_instance.example, data.template_file.user_data
另外,这意味着我必须为每个实例创建不同的 user_data
资源,这似乎有点痛苦。你不能重复使用它们吗?这应该是模板的目的吧?
我一定错过了什么,但我找不到答案。 谢谢。
【问题讨论】:
关于第一次尝试:local-exec
在您的“本地”设备上执行。你想要remote-exec
。
@MattSchuchard 啊,谢谢!我认为它对于正在配置的实例是本地的。我会试试这个。
@MattSchuchard 我得到了它的工作,感谢您的建议。如果您将其发布为答案,我会将其标记为已选择。
【参考方案1】:
使用带有local-exec
块的 Terraform provisioner
将在应用 Terraform 的设备上执行它:documentation。请特别注意以下行:
这会调用运行 Terraform 的机器上的进程,而不是资源上的进程。请参阅 remote-exec 配置程序以在资源上运行命令。
因此,将provisioner
从local-exec
切换为remote-exec
:
provisioner "remote-exec"
inline = ["sudo hostnamectl set-hostname friendly.example.com"]
应该解决您设置主机名的问题。
【讨论】:
remote-exec
供应商使用inline
而不是command
。还要确保 inline 是一个命令数组; inline = ['sudo hostnamectl set-hostname friendly.example.com']
【参考方案2】:
既然您将标签作为字符串提供给实例,为什么不直接将其设为 var?
在您的实例资源和数据模板中将字符串 friendly.example.com
替换为 $var.instance-name
。然后设置变量:
variable "instance-name"
default="friendly.example.com"
【讨论】:
好的,这解决了循环问题,并获得了正确的主机名,耶!但是,如果我现在添加第二个实例,我需要创建一个不同的变量和一个不同的 user_data 模板,对吗?这似乎不太灵活。 查找使用 count 然后 count.index 遍历多个实例。也使用 aws_launch-configs 而不是 aws_instance 如果它是一个更完整的示例来展示如何引用变量/本地并且格式正确,这将是一个更好的答案。【参考方案3】:我相信您的user-data.conf
应该是bash 脚本,以#!/usr/bin/env bash
开头。
应该是这样的
#!/usr/bin/env bash
hostname $hostname
【讨论】:
以上是关于如何使用 cloud-init 和 Terraform 设置主机名?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Terraform 上使用 cloud-init 初始化实例
如何在 Azure VM 的 ubuntu 上将 python3.8 升级到 python3.9 并使用 cloud-init 安装 docker?