我从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
资源,这似乎有些痛苦。您不能重用它们吗?那应该是模板的目的,对吧?
我肯定想念一些东西,但找不到答案。 谢谢。
答案 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提供者以在资源上运行命令。
因此,将provisioner
从local-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}