使用 Vagrant 设置 swarm 模式 Docker Swarm

Set up swarm mode Docker Swarm using Vagrant

我正在使用 Vagrant 和 ansible local 来提供一堆 DEV 最小的 centos 虚拟机。 虚拟机全部 运行 Docker 1.12.x 我现在正在考虑自动创建群模式集群。目的是做 vagrant up 并且当 cli returns 时,我有一个集群并且 运行ning.

我遇到的问题是我可以 运行 a docker swarm init --advertise-addr <my init swarm mgr> 在其中一个盒子上,但是我需要从这个盒子中取出管理器和工作节点的令牌并将它们注入随后设置虚拟机。

我不会编程 Ruby,如果可以避免,我真的宁愿不从 Docker 远程 API 开始。

我已经尝试从测试 VM 设置中请求 hostid,以尝试将来宾 cmd 输出分配给 Vagrantfile 中的变量,但我的 Ruby 还没有达到标准。

无论如何,问题是在使用 ansible local 配置 VM 时如何最好地使用 Vagrant 创建 swarm 模式集群。

编辑:我刚刚看到 vagrant scp,我至少可以用它来提取文件形式的令牌并将其复制到相关机器中。我希望保持纯粹而不是插入,并避免从 Ruby 到 运行 更多无所事事的命令(有没有更好的方法来做到这一点?),但至少可以使用流浪者和 ansible 本地人。

从 Docker 1.12.3 开始,没有简单的方法可以做到这一点。您必须以某种方式取出令牌。

您可以:

  • 使用Docker Remote API\swarm端点检查Swarm,并在第一台机器init:[=18之后提取相关的JoinTokens =]

    [...]
    "JoinTokens" : {
        "Worker" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-6qmn92w6bu3jdvnglku58u11a",
        "Manager" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-8llk83c4wm9lwioey2s316r9l"
    }
    [...]
    
  • 如您所述,在将 令牌 写入文件后使用 vagrant scp

  • 使用同步文件夹并将其安装到所有虚拟机上。因此,第一个 VM 将令牌写入文件,而其他虚拟机正在从中读取令牌。

但无论如何,您需要手动同步bootstrap进程。

Relevant Docker issue: https://github.com/docker/docker/issues/26743

好的,如果有人(包括我)发现了这个,正如@abronan post 中提到的,我需要以某种方式取出令牌。我是这样做的。

用于提取令牌的 Vagrant 主机上的 Ansible 本地剧本代码:

## docker swarm mgr
  #
  - name: docker swarm join-token -q manager
    shell: docker swarm join-token -q manager
    register: dockerswarmjointokenmgr

  - name: copy content={{ dockerswarmjointokenmgr.stdout.split() }} dest=/vagrant/myswarmwkr.token
    local_action: copy content={{ dockerswarmjointokenmgr.stdout.split() }} dest=/vagrant/myswarmwkr.token

  - name: make swarm wkr token readable
    file: path=/vagrant/myswarmwkr.token owner=vagrant group=vagrant recurse=no

Vagrantfile 代码特定于我的 docker 使用 vagrant scp 的 swarm worker 节点:

## now handle docker swarm tokens
#
config.vm.provision :host_shell do |host_shell|
  host_shell.inline = 'vagrant scp dockerwkr:/vagrant/myswarmwkr.token .'
end
config.vm.provision :host_shell do |host_shell|
  host_shell.inline = 'vagrant scp dockerwkr:/vagrant/myswarmwkr.token .'
end

这会导致将令牌输出到客户机上的一个文件,scp 输出到 vagrant 主机,然后当 vagrant 处理 docker swarm worker 设置时,如果令牌被写入与 Vagrantfile 相同的目录,它们将自动在 worker guest /vagrant 中运行,您的 ansible local 代码可以将它们读取到 docker swarm join 命令中。笨拙地和 sellotaped 在一起,但适合在自己的笔记本电脑上学习。