是否可以运行ansible playbook,它看起来像这样(这是该网站的一个例子: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
在多线程模式下?
我想在同一时间运行三个“包含”(无论如何它正在部署到不同的主机),如下图所示:
http://www.gliffy.com/go/publish/5267618
有可能吗?
答案 0 :(得分:28)
从Ansible 2.0开始,在剧本中似乎有一个名为strategy
的选项。将策略设置为free
时,剧本会在每个主机上播放任务而无需等待其他主机。请参阅http://docs.ansible.com/ansible/playbooks_strategies.html。
它看起来像这样(取自上面的链接):
- hosts: all
strategy: free
tasks:
...
请注意,我没有检查这一点,而且我非常是Ansible的新用户。我只是对你所描述的事情感到好奇,并且碰巧搞砸了这个策略。
编辑:
看起来这并不是你正在尝试做的事情。也许"异步任务"更合适,如下所述: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
次。您可以通过这种方式定义三个并发任务。
答案 1 :(得分:27)
默认情况下,Ansible将尝试并行运行在所有主机上。有关详细信息,请参阅these Ansible docs。您还可以使用serial
参数来限制您希望在任何给定时间处理的并行主机的数量,因此,如果您希望一次只在一个主机上运行一个Playbook,则可以指定{{1等等。
Ansible的设计使得每个任务都可以在所有主机上运行,然后再继续执行下一个任务。因此,如果您有3个任务,它将确保任务1首先在所有主机上运行,然后运行任务2,然后运行任务3。有关详细信息,请参阅this section of the Ansible docs。
答案 2 :(得分:19)
如前所述:默认情况下,Ansible将尝试并行运行在所有主机上,但在任务(串行)之后执行任务。
如果您还想并行运行任务,则必须启动不同的ansible实例。 以下是一些方法。
如果您已有不同的组,则可以为每个组运行一个ansible实例:
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
如果你的剧本独立工作,你可以这样做:
shell-1 #> ansible-playbook load_balancers.yml
shell-2 #> ansible-playbook webservers.yml
shell-3 #> ansible-playbook dbservers.yml
如果没有,你可以让ansible做碎片。 如果您有6台主机并且想要运行3个实例,每个实例有2个主机,则可以执行以下操作:
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]
当然你可以使用一个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] &
使用此方法,您可以在一个终端中将所有输出混合在一起。 为避免这种情况,您可以将输出写入不同的文件。
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 &
使用像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
答案 3 :(得分:2)
Ansible支持的模式可以用于一个/多个主机,组,也可以排除/包括组。 Here是官方文档的链接。
答案 4 :(得分:1)
在我的情况下,我需要配置阶段作为一个整体阻塞,但并行执行每个角色。我使用以下代码解决了这个问题:
echo webserver loadbalancer database | tr ' ' '\n' \
| xargs -I % -P 3 bash -c 'ansible-playbook $1.yml' -- %
xargs中的-P 3参数确保所有命令并行运行,每个命令执行相应的playbook并且命令作为一个整体阻塞,直到所有部分都完成。
答案 5 :(得分:1)
我用ls -1 | xargs -P
之类的游戏玩了很长时间,以并行化我的剧本。但是为了获得更好的显示效果和简单性,我编写了一个简单的Python工具ansible-parallel。
它是这样的:
pip install ansible-parallel
ansible-parallel *.yml
要精确回答最初的问题(如何先运行某些任务,其余任务并行运行),可以通过删除3个包含并运行来解决:
ansible-playbook say_hi.yml
ansible-parallel load_balancers.yml webservers.yml dbservers.yml
答案 6 :(得分:-1)
从每个组中并行运行此POC或MVP(对于所有主机) https://github.com/sirkubax/szkolenie3/tree/master/playbooks/playgroups
您可能会得到灵感