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-exec
s'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.