【问题标题】:Can Terraform set a variable from a remote_exec command?Terraform 可以通过 remote_exec 命令设置变量吗?
【发布时间】:2017-03-24 18:51:59
【问题描述】:

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

我想要一些运行docker swarm join-token worker -q 命令的方法,该命令可以设置为 Terraform 变量。这样,worker 就可以拥有一个 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
    ]
  }
}

谢谢

【问题讨论】:

    标签: amazon-web-services docker docker-swarm terraform


    【解决方案1】:

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

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

    如果您有 N 个集群管理器,您可能必须在创建管理器后一次完成所有操作。外部数据源返回纯字符串的映射,因此需要使用使您能够为每个节点选择正确结果的键,或者将整个集合作为分隔字符串返回,并使用 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)}"
        ]
      }
    }
    

    【讨论】:

    • 是的,我希望避免这一切。哼哼。我猜使用 Ansible 可能会比脚本更好地进行配置
    • 试图在这里提出一个适用于 Vagrant / Docker / Centos 映像的统一配置...许多令人生气的小差异。
    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2016-06-16
    • 2022-01-27
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多