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

时间:2014-01-16 10:05:29

标签: 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

在多线程模式下?

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

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

有可能吗?

7 个答案:

答案 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

这包括在任务上指定asyncpoll。以下内容来自我提到的第二个链接:

- 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实例。 以下是一些方法。

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

2。多个炮弹

剧本

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

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]

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

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

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。更好的解决方案

使用像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

您可能会得到灵感