4
votes

Comment définir le nom d'hôte avec cloud-init et Terraform?

Je commence avec Terraform. J'essaie de lui faire définir un nom d'hôte convivial, au lieu de l'habituel ip-10.10.10.10 utilisé par AWS. Cependant, je n'ai pas trouvé comment le faire.

J'ai essayé d'utiliser des provisioners, comme ceci:

$ terraform apply
Error: Error asking for user input: 1 error(s) occurred:
* Cycle: aws_instance.example, data.template_file.user_data

Mais cela ne fonctionne pas, le nom d'hôte n'est pas changé .

Alors maintenant, j'essaye ceci:

hostname = ${hostname}

Et dans user-data.conf j'ai une ligne pour utiliser la variable, comme ceci:

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}"
  }
}

Mais cela me donne une dépendance de cycle:

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

De plus, ce serait signifie que je dois créer une ressource user_data différente pour chaque instance, ce qui semble un peu pénible. Ne pouvez-vous pas les réutiliser? Cela devrait être le but des modèles, non?

Je dois manquer quelque chose, mais je ne trouve pas la réponse. Merci.


3 commentaires

Concernant la première tentative: local-exec s'exécute sur votre appareil "local". Vous voulez remote-exec .


@MattSchuchard ah, merci! Je pensais que c'était local pour l'instance provisionnée. J'essaierai ceci.


@MattSchuchard Je l'ai fait fonctionner, grâce à votre suggestion. Si vous la postez comme réponse, je la marquerai comme choisie.


3 Réponses :


2
votes

Puisque vous fournissez la balise à l'instance sous forme de chaîne, pourquoi ne pas en faire simplement une var?

Remplacez la chaîne friendly.example.com par $ {var. nom-instance} dans votre ressource d'instance et dans votre modèle de données. Ensuite, définissez la variable:

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


3 commentaires

ok, cela résout le problème du cycle et obtient le nom d'hôte correct, yay! Cependant, si j'ajoute maintenant une deuxième instance, je dois créer une variable différente et un modèle user_data différent, non? Cela ne semble pas très flexible.


Lookup utilise count, puis count.index pour parcourir plusieurs instances. Utilisez également aws_launch-configs et non aws_instance


Ce serait une meilleure réponse s'il s'agissait d'un exemple plus complet montrant comment faire référence à la variable / local et était correctement formaté.



4
votes

L'utilisation d'un provisioner Terraform avec le bloc local-exec l'exécutera sur l'appareil à partir duquel Terraform applique: documentation . Notez spécifiquement la ligne:

Ceci appelle un processus sur la machine exécutant Terraform, pas sur la ressource. Consultez le provisioner remote-exec pour exécuter des commandes sur la ressource.

Par conséquent, passer du provisioner d'un local-exec à un remote-exec :

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

devrait résoudre votre problème de configuration du nom d'hôte.


1 commentaires

l'approvisionneur remote-exec utilise inline et non la commande . Assurez-vous également que inline est un tableau de commandes; inline = ['sudo hostnamectl set-hostname friendly.example.com']



0
votes

Je pense que votre user-data.conf devrait être un script bash, pour commencer par #! / usr / bin / env bash .

Cela devrait ressembler à

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


0 commentaires