2016-11-28 86 views
2

我使用的是流浪汉,ansible本地提供一堆DEV最小的CentOS虚拟机的设置群模式泊坞群。 的虚拟机都运行泊坞窗1.12.x,现在我期待在自动创建一个群模式集群。目标是做vagrant up,当cli返回时,我有一个集群正在运行。使用流浪

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

我不能编程,Ruby和我真的宁可不与泊坞远程API开始,如果我能避免它。

我已经试过从测试VM安装程序请求hostid尝试并将guest cmd输出分配给Vagrantfile中的变量,但是我的Ruby没有达到要求。

不论,问题是如何最好地创建配置与ansible本地虚拟机在使用放浪一大群模式集群。

编辑:我刚刚看过vagrant scp,我至少可以用它来提取文件形式的标记并将其复制到相关机器中。我希望让事情变得纯粹而不是插入,避免炮击了红宝石的运行更多的无业游民命令(有没有更好的方式来做到这一点?),但至少,让使用流浪汉,ansible本地的。

+0

那不使用Swarm模式,所以不是这个用例的一个好例子。至于OP,你可以使用shell脚本来运行vagrant ssh等,以便做你需要做的事情(使用'docker swarm join-token -q manager'然后'docker swarm join --token等来获取令牌。 “'在其他人上。 – johnharris85

+0

好吧,我很高兴你说过,因为我认为它看起来不错。但是,使用脚本在客户端上运行'docker swarm join-token -q manager'我不认为它的作品因为命令会在init swrm管理器上运行,并且返回的令牌'trapped'在客户端上,流浪主机因此无法将其交给在Vagrantfile中定义的下一台机器用于加入群集,除非你可以提供和它的工作的例子?谢谢 – volvox

回答

1

万一有人(包括我在内)OK认为这,如@ abronan的文章中提到,我需要出去获得令牌以某种方式。我这样做了。流浪主机上

Ansible本地剧本代码用于令牌提取:使用流浪汉SCP特定

## 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代码到我的搬运工群工作节点:

## 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'd到流浪的主人,然后当流浪者处理码头群工人设置时,如果令牌被写入与Vagrantfile相同的目录,他们将自动在工作客人/vagrant其中您的ansible local代码可以将它们读入docker swarm join命令。勉强和一起销售,但在自己的笔记本电脑上学习很好。

1

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

您可以:

  • 检查使用Docker Remote API\swarm端点群和第一台机器init后提取相关JoinTokens

    [...] 
    "JoinTokens" : { 
        "Worker" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-6qmn92w6bu3jdvnglku58u11a", 
        "Manager" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-8llk83c4wm9lwioey2s316r9l" 
    } 
    [...] 
    
  • 正如你提到的,使用vagrant scp后将令牌写入文件。

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

但无论如何,您需要手动同步引导过程。

有关码头工人的问题https://github.com/docker/docker/issues/26743