Estoy tratando de construir un clúster Docker Swarm en AWS usando Terraform. Inicié con éxito un administrador de Swarm, pero estoy tratando de encontrar la mejor manera de pasar la clave de unión a los trabajadores (que se creará después del administrador).
Me gustaría alguna forma de ejecutar el comando docker swarm join-token worker -q que se puede configurar en una variable de Terraform. De esa manera, los trabajadores pueden tener un comando remote_exec, algo así como docker swarm join ${var.swarm_token} ${aws_instance.swarm-manager.private_ip}
¿Cómo puedo hacer esto?
Mi configuración está a continuación:
resource "aws_instance" "swarm-manager" { ami = "${var.manager_ami}" instance_type = "${var.manager_instance}" tags = { Name = "swarm-manager${count.index + 1}" } provisioner "remote-exec" { inline = [ "sleep 30", "docker swarm init --advertise-addr ${aws_instance.swarm-manager.private_ip}" "docker swarm join-token worker -q" // This is the value I want to store as a variable/output/etc ] } }Gracias
Puede usar una fuente de datos externa como complemento a su script de aprovisionamiento remoto.
Esto puede bombardear a sus administradores de enjambres y obtener el token después de que se aprovisionen.
Si tiene N administradores de enjambre, probablemente tendrá que hacerlo todo a la vez después de crear los administradores. Las fuentes de datos externas devuelven un mapa de cadenas simples, por lo que es necesario usar claves que le permitan seleccionar el resultado correcto para cada nodo, o devolver el conjunto completo como una cadena delimitada, y usar element() y split() para obtener el resultado correcto. artículo.
resource "aws_instance" "swarm_manager" { ami = "${var.manager_ami}" instance_type = "${var.manager_instance}" tags = { Name = "swarm-manager${count.index + 1}" } provisioner "remote-exec" { inline = [ "sleep 30", "docker swarm init --advertise-addr ${aws_instance.swarm-manager.private_ip}" ] } } data "external" "swarm_token" { program = ["bash", "${path.module}/get_swarm_tokens.sh"] query = { swarms = ["${aws_instance.swarm_manager.*.private_ip}"] } } resource "aws_instance" "swarm_node" { count = "${var.swarm_size}" ami = "${var.node_ami}" tags = { Name = "swarm-node-${count.index}" } provisioner "remote-exec" { inline = [ "# Enrol me in the right swarm, distributed over swarms available", "./enrol.sh ${element(split("|", data.swarm_token.result.tokens), count.index)}" ] } }