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 Réponses :
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"
}
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é.
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.
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']
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}
Concernant la première tentative:
local-execs'exécute sur votre appareil "local". Vous voulezremote-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.