Как установить имя хоста с помощью cloud-init и Terraform? - PullRequest
0 голосов
/ 23 января 2019

Я начинаю с Terraform.Я пытаюсь установить для него дружественное имя хоста вместо обычного ip-10.10.10.10, которое использует AWS.Однако я не нашел, как это сделать.

Я пытался использовать провайдеров, например:

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 голосов
/ 23 января 2019

Использование Terraform provisioner с блоком local-exec выполнит его на устройстве, с которого Terraform применяет: документация .Обратите особое внимание на строку:

Это вызывает процесс на машине с Terraform, а не на ресурсе.Обратитесь к провайдеру remote-exec для запуска команд на ресурсе.

Поэтому переключение provisioner с local-exec на remote-exec:

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

должноисправьте проблему с настройкой имени хоста.

0 голосов
/ 31 июля 2019

Я считаю, что ваш user-data.conf должен быть скриптом bash, для начала #!/usr/bin/env bash.

Это должно выглядеть как

#!/usr/bin/env bash
hostname ${hostname}
0 голосов
/ 23 января 2019

Поскольку вы предоставляете тег для экземпляра в виде строки, почему бы просто не сделать это переменным.Замените строку friendly.example.com на ${var.instance-name} в вашем ресурсе экземпляра и в шаблоне данных, а затем установите переменную:

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

Задания выполнены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...