如何使用 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 配置程序以在资源上运行命令。

因此,将provisionerlocal-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 初始化实例

如何在不重启的情况下重新运行 cloud-init

在本地KVM中使用cloud-init

如何在 Azure VM 的 ubuntu 上将 python3.8 升级到 python3.9 并使用 cloud-init 安装 docker?

云服务器cloud-init初始化工具的使用与配置

通过“用户数据”(Amazon Linux)通过cloud-init启用EPEL