是否可以运行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
Run Code Online (Sandbox Code Playgroud)
在多线程模式?
我想在同一时间运行三个"包含"(它正在部署到不同的主机),如下图所示:
http://www.gliffy.com/go/publish/5267618
可能吗?
Ami*_*dor 30
从Ansible 2.0开始,似乎有一个叫做strategy剧本的选项.将策略设置free为时,剧本在每个主机上播放任务而无需等待其他主机.请参阅http://docs.ansible.com/ansible/playbooks_strategies.html.
它看起来像这样(取自上面的链接):
- hosts: all
strategy: free
tasks:
...
Run Code Online (Sandbox Code Playgroud)
请注意,我没有检查这个,我对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
Run Code Online (Sandbox Code Playgroud)
async如果你的任务很漫长,我想你可以指定更长的时间.您可以通过这种方式定义三个并发任务.
Bru*_*e P 27
默认情况下,Ansible将尝试并行运行在所有主机上.有关详细信息,请参阅这些Ansible文档.您还可以使用该serial参数来限制您希望在任何给定时间处理的并行主机的数量,因此,如果您希望一次只在一个主机上运行一个Playbook,则可以指定serial:1等.
Ansible的设计使得每个任务都将在所有主机上运行,然后继续执行下一个任务.因此,如果您有3个任务,它将确保任务1首先在所有主机上运行,然后运行任务2,然后运行任务3.有关详细信息,请参阅Ansible文档的此部分.
xxo*_*rde 20
如前所述:默认情况下,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
Run Code Online (Sandbox Code Playgroud)
如果你的剧本独立工作,你可以这样做:
shell-1 #> ansible-playbook load_balancers.yml
shell-2 #> ansible-playbook webservers.yml
shell-3 #> ansible-playbook dbservers.yml
Run Code Online (Sandbox Code Playgroud)
如果没有,你可以让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]
Run Code Online (Sandbox Code Playgroud)
当然你可以使用一个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] &
Run Code Online (Sandbox Code Playgroud)
使用此方法,您可以在一个终端中将所有输出混合在一起.为避免这种情况,您可以将输出写入不同的文件.
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 &
Run Code Online (Sandbox Code Playgroud)
也许最好使用像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
我花了很长时间研究诸如ls -1 | xargs -P并行化我的剧本运行之类的事情。但为了获得更漂亮的显示效果和简单性,我编写了一个简单的 Python 工具来完成此操作,即ansible-parallel。
事情是这样的:
pip install ansible-parallel
ansible-parallel *.yml
Run Code Online (Sandbox Code Playgroud)
为了准确回答最初的问题(如何首先运行一些任务,然后并行运行其余任务),可以通过删除 3 个包含并运行来解决:
ansible-playbook say_hi.yml
ansible-parallel load_balancers.yml webservers.yml dbservers.yml
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
96635 次 |
| 最近记录: |