如何使用cloud-init和Terraform设置主机名?

时间:2019-01-23 12:42:36

标签: terraform cloud-init

我从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资源,这似乎有些痛苦。您不能重用它们吗?那应该是模板的目的,对吧?

我肯定想念一些东西,但找不到答案。 谢谢。

3 个答案:

答案 0 :(得分:1)

由于您将标记作为字符串提供给实例,所以为什么不直接将其设为var。 在实例资源和数据模板中,将字符串friendly.example.com替换为${var.instance-name},然后设置var:

variable "instance-name" {
default="friendly.example.com"
}

工作完成。

答案 1 :(得分:1)

provisioner块中使用Terraform local-exec将在应用Terraform的设备上执行documentation。请特别注意以下行:

  

这将在运行Terraform的计算机上而不是在资源上调用一个进程。请参阅remote-exec提供者以在资源上运行命令。

因此,将provisionerlocal-exec切换为remote-exec

provisioner "remote-exec" {
  command = "sudo hostnamectl set-hostname friendly.example.com"
}

应该通过设置主机名来解决您的问题。

答案 2 :(得分:0)

我认为您的user-data.conf应该是bash脚本,以#!/usr/bin/env bash开头。

应该看起来像

#!/usr/bin/env bash
hostname ${hostname}