Terraform 可以通过 remote_exec 命令设置变量吗?

Can Terraform set a variable from a remote_exec command?

我正在尝试使用 Terraform 在 AWS 中构建 Docker Swarm 集群。我已经成功启动了 Swarm 管理器,但我正在尝试找出如何最好地将连接密钥传递给工作人员(将在管理器之后创建)。

我想要 运行 可以设置为 Terraform 变量的 docker swarm join-token worker -q 命令的某种方式。这样,工作人员可以有一个 remote_exec 命令,比如 docker swarm join ${var.swarm_token} ${aws_instance.swarm-manager.private_ip}

我该怎么做?

我的配置如下:

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

谢谢

您可以使用 external data source 作为远程配置脚本的补充。

这可以 shell 进入您的群管理器并在配置后获取令牌。

如果您有 N 个 swarm 管理器,您可能必须在创建管理器后一次完成所有操作。外部数据源 return 纯字符串映射,因此需要使用使您能够 select 每个节点的正确结果的键,或者 return 整个集合作为分隔字符串,并且使用 element()split() 得到正确的项目。



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