2017-02-27 162 views
0

我有一个在Jenkins每晚构建后调用的ansible playbook。正如你可以看到每行包含不同的产品组件被安装。 有没有办法让它们并行运行?因此,所有到server1的剧本文件都将以串行方式运行,但适用于server1和server2的剧本应该并行运行。ansible - 平行运行剧本

- include: "componentA.yml target=server1" 
- include: "componentB.yml target=server1" 

- include: "componentC.yml target=server2" 
- include: "componentD.yml target=server2" 

回答

0

您可以重构您的剧本,一次定位所有服务器,并使用动态包含的任务使用strategy: free。像这样:

--- 
- hosts: server* 
    strategy: free 
    tasks: 
    - include: componentA_tasks.yml 
     when: inventory_hostname == 'server1' 
    - include: componentB_tasks.yml 
     when: inventory_hostname == 'server1' 
    - include: componentC_tasks.yml 
     when: inventory_hostname == 'server2' 
    - include: componentD_tasks.yml 
     when: inventory_hostname == 'server2' 

这样server2不会等待server1上的每个任务完成,并且会快进到componentC任务。

或者您可以将Jenkins管道拆分为并行任务并在server1和server2的单独线程中执行ansible。

+0

我有很多服务器和组件,不想由詹金斯管理它。使用策略:免费选项,所以我将不得不每次运行这个剧本循环以传递不同的服务器名称?在一个剧本文件中没有其他方法来管理它,只是将块中的“包含”分组并且并行运行它们? –

+0

恐怕不是。剧本应该被分成剧本,每部剧本应该在一组服务器上完成相同的任务。例如,首先部署数据库服务器,然后部署应用程序服务器。 –

+0

感谢您的快速响应! 管理这种情况的最佳做法是什么?我们有大约20个以不同方式部署的组件。所以我必须为每个组件保留playback.yml。如何管理大约7台服务器上的所有这些服务器的安装,其中一些是Windows,一些是Linux?现在,我只保存install_all.yml,其中包含像上面发布的帖子那样的包含列表。 –