在 Ansible 剧本中,我如何应用具有更多并行性的基于组的角色?

In an Ansible playbook, how do I apply group-based roles with more parallelism?

我正在使用 Ansible 2.1。假设我的主机已经在清单中分组。然后我 运行 一个像这样的剧本:

- hosts: foo
  roles:
    - bar

- hosts: baz
  roles:
    - eek

...more...

无论我设置了多少个fork,Ansible似乎都在一个一个地应用角色。有没有更好的方法来构建我的剧本以获得更多的执行并行性,而不用向控制台发送无用的任务跳过消息?

换句话说,角色 bar 适用于 foo 中的所有主机,同时 eek 适用于所有 baz 主机。如果我以组成员身份为条件应用角色,这似乎有点工作,但是所有的跳过都会使输出变得很难阅读。

如果只是输出中跳过的任务困扰您,您可以在 ansible.cfg.

中设置 display_skipped_hosts=False

If set to False, ansible will not display any status for a task that is skipped. The default behavior is to display skipped tasks.

问题可能在于,这会删除 所有 跳过的任务输出。在某些情况下,用户可能依赖于跳过的任务,并且需要了解正在发生的事情。可能有一个选项可以通过编程方式解决这个问题。 Create a custom callback plugin. The output generated by Ansible actually is a callback plugin. You can change this default callback plugin by changing stdout_callback = your_plugin in your ansible.cfg。然后,在您的插件中,您可以决定在哪些条件下要显示输出或不显示输出。

更改 strategy 甚至创建自定义策略插件对您来说可能也很有趣。尽管据我所知,每次播放都会应用策略,因此无法让两个播放并行执行,而且我很确定第二个播放只有在第一个播放的所有主机都完成后才会开始。 (但说真的,这只是我的理解,我还没有玩过策略插件)