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

seb*_*szw 50 ansible

是否可以运行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.

这包括指定asyncpoll执行任务.以下是我提到的第二个链接:

- 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如果你的任务很漫长,我想你可以指定更长的时间.您可以通过这种方式定义三个并发任务.

  • 这种"策略"解决方案可能仅适用于特定剧本中的任务,并且当您在网站剧本中"包含"多个剧本时似乎不起作用. (3认同)

Bru*_*e P 27

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

Ansible的设计使得每个任务都将在所有主机上运行,​​然后继续执行下一个任务.因此,如果您有3个任务,它将确保任务1首先在所有主机上运行,​​然后运行任务2,然后运行任务3.有关详细信息,请参阅Ansible文档的此部分.

  • 但他的例子实际上与Ansible本身给出的最佳实践非常相似:http://stackoverflow.com/questions/21158689/ansible-deploy-on-multiple-hosts-in-the-same-time当你的site.yml file只是一堆包含它们本身是特定于组的,然后ansible将以串行而不是并行方式处理每个组.我明白ansible不可能默认并行执行这些任务,但是他正在尝试做他们推荐的事情,这是一个很大的限制,在文档中没有提到. (11认同)
  • 目前,在图表中获得所需内容的唯一方法是同时运行3个ansible实例,一个针对负载均衡器,一个针对您的Web服务器,另一个针对您的数据库服务器.正如我在回答中所说,Ansible的设计是为了在继续执行下一个任务之前在所有适当的主机上运行任务.如果您在一个剧本中将脱节任务和脱节服务器组合在一起,则Ansible将首先将任务1应用于服务器组A,然后将任务2应用于组A,然后将任务3应用于组B,然后将任务4应用于组B等.它不会t基于组并行化. (4认同)
  • 那不是我想要的.我添加了图表,更好地解释了我想要的:) (3认同)

xxo*_*rde 20

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

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

1.团体

如果您已有不同的组,则可以为每个组运行一个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)

2.多个炮弹

剧本

如果你的剧本独立工作,你可以这样做:

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)

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] &
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)

4.更好的解决方案

也许最好使用像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


Jul*_*ard 3

我花了很长时间研究诸如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)