Ansible:同时部署在多个主机上

是否有可能运行一个正确的剧本,看起来像这样(这是来自这个网站的一个例子: http : //docs.ansible.com/playbooks_roles.html ):

- name: this is a play at the top level of a file hosts: all remote_user: root tasks: - name: say hi tags: foo shell: echo "hi..." - include: load_balancers.yml - include: webservers.yml - include: dbservers.yml 

在multithreading模式?

我想在同一时间运行三个“包含”(它正在部署到不同的主机),如下图所示:

http://www.gliffy.com/go/publish/5267618

可能吗?

默认情况下,Ansible将尝试在所有主机上并行运行。 有关详细信息,请参阅这些Ansible文档 。 您还可以使用serial参数限制在任何给定时间要处理的并行主机的数量,因此,如果您希望一次只在一个主机上运行playbook,则可以指定serial:1等。

Ansible的devise使得每个任务都将在所有主机上运行,​​然后继续执行下一个任务。 所以如果你有3个任务,它将确保任务1先在所有主机上运行,​​然后运行任务2,然后运行任务3。 有关详情,请参阅Ansible文档的这一部分 。

如前所述:默认情况下,Ansible将尝试在所有主机上并行运行,但在任务(串行)之后运行。

如果您还想同时运行任务,则必须启动不同的ansible实例。 以下是一些方法。

1.团体

如果你已经有了不同的组,你可以为每个组运行一个可靠的实例:

 shell-1 #> ansible-playbook site.yml --limit webservers shell-2 #> ansible-playbook site.yml --limit dbservers shell-3 #> ansible-playbook site.yml --limit load_balancers 

2.多个shell

剧本

如果你的手册可以单独工作,你可以这样做:

 shell-1 #> ansible-playbook load_balancers.yml shell-2 #> ansible-playbook webservers.yml shell-3 #> ansible-playbook dbservers.yml 

限制

如果不是的话,你可以让无能为力。 当你有6个主机,并且想要每个主机运行3个实例,你可以这样做:

 shell-1 #> ansible-playbook site.yml --limit all[0-2] shell-2 #> ansible-playbook site.yml --limit all[2-4] shell-3 #> ansible-playbook site.yml --limit all[4-6] 

3.背景

当然你可以使用一个shell,并把任务放在后台,一个简单的例子是:

 shell-1 #> ansible-playbook site.yml --limit all[0-2] & shell-1 #> ansible-playbook site.yml --limit all[2-4] & shell-1 #> ansible-playbook site.yml --limit all[4-6] & 

使用这种方法,您可以将所有输出混合在一个terminal中。 为了避免这种情况,您可以将输出写入不同的文件。

 ansible-playbook site.yml --limit all[0-2] > log1 & ansible-playbook site.yml --limit all[2-4] > log2 & ansible-playbook site.yml --limit all[4-6] > log3 & 

4.更好的解决scheme

也许最好使用像tmux / screen这样的工具来启动虚拟shell中的实例。

或者看看“火球模式”: http : //jpmens.net/2012/10/01/dramatically-speeding-up-ansible-runs/

如果您想了解有关限制的更多信息,请查看: https : //docs.ansible.com/playbooks_best_practices.html#what-this-organization-enables-examples

从Ansible 2.0开始,在手册中似乎有一个叫做strategy的选项。 当将策略设置为free ,剧本在每个主机上播放任务而不等待其他任务。 请参阅http://docs.ansible.com/ansible/playbooks_strategies.html

它看起来像这样(从上面的链接):

 - hosts: all strategy: free tasks: ... 

请注意,我没有检查这个,我对Ansible 新。 我只是好奇你做了什么你所描述的,碰巧来这个策略的事情。

编辑:

这似乎不是你想要做的。 也许“asynchronous任务”更合适,如下所述: http : //docs.ansible.com/ansible/playbooks_async.html 。

这包括指定任务的asyncpoll 。 以下摘自我提到的第二个链接:

 - name: simulate long running op, allow to run for 45 sec, fire and forget command: /bin/sleep 15 async: 45 poll: 0 

我想你可以指定更长的async时间,如果你的任务是冗长的。 你可以这样定义你的三个并发任务。

在我的情况下,我需要configuration阶段作为一个整体阻塞,但并行执行每个angular色。 我已经解决了这个问题,使用下面的代码:

 echo webserver loadbalancer database | tr ' ' '\n' \ | xargs -I % -P 3 bash -c 'ansible-playbook $1.yml' -- % 

xargs中的-P 3参数确保所有命令都并行运行,每个命令都会执行相应的playbook和命令作为一个整体,直到所有部分完成。