【问题标题】:How to set hostname with cloud-init and Terraform?如何使用 cloud-init 和 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 我得到了它的工作,感谢您的建议。如果您将其发布为答案,我会将其标记为已选择。

标签: terraform cloud-init


【解决方案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}

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 2021-05-24
    • 2016-11-25
    • 2016-07-09
    • 2021-02-13
    • 2022-01-16
    • 2020-05-02
    • 2017-09-01
    • 2022-01-24
    相关资源
    最近更新 更多