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 。
这包括指定任务的async
和poll
。 以下摘自我提到的第二个链接:
- 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和命令作为一个整体,直到所有部分完成。