Ansible:主机出现在多个组中,并且两个组中的任务相同;任何方式一次运行任务?


9

我有一本剧本,看起来像这样:

---
- hosts: group1
  roles:
    - role1
    - role2

- hosts: group2
  roles:
    - role2
    - role3

现在说我有一个hosts文件,该文件具有这样的条目:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible将在host1.example.com的role2 TWICE中运行任务,因为它出现在2个组中,并且每个组都分配有role2。

我如何使Ansible意识到它具有两次包含的相同角色,因此应该只运行一次?


最好给我们真实的例子,而不是“ role1”,“ role2”等,因为也许您应该做不同的事情。但这取决于您实际想要实现的目标。
Antonis Christofides 2015年

Answers:


10

如前所述,这是设计使然。Ansible一次只执行一次播放。您的剧本包含两个剧本(剧本文件定义的根级别YAML列表中的两个项目)。第一场比赛将role1和role2应用于group1。该播放首先执行,并且仅在完成后才开始第二播放。但是Ansible不会尝试将这些剧本逻辑上合并在一起。毕竟,您实际上可能希望role2中的任务运行两次。

至于解决该问题,有几种方法可以解决此问题,并且选择哪种方法取决于组和角色的详细信息。

如果role2中的所有任务都是幂等的,即,如果它们可以多次运行并每次都以相同的结果结束,那么您真正失去的只是时间,让角色重复是可以的。如果角色需要很长的时间才能申请,或者您无法使其成为幂等,请考虑以下建议:


您可以将剧本分为三个剧本,然后分别应用角色:

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

或者,如果需要将角色分组在一起,则可以为需要所有三个角色的服务器创建第三组。您无需将它们从其他两组中删除。您可以像这样在库存文件中创建组:

[group1and2:children]
group1
group2

然后,在您的剧本中,您可以再次分为三部剧,但使用第三组剧本可以避免重新运行角色:

---
- hosts: group1:!group1and2
  roles:
    - role1
    - role2

 - hosts: group1and2
   roles:
     - role1
     - role2
     - role3

 - hosts: group2:!group1and2
   roles:
     - role2
     - role3

这很丑陋,但在某些情况下可能有用。


谢谢,我想我会使用选项(2)的变体-我将使我的组和角色更加精细,以将服务器分组在一起。
Asfand Qazi 2015年

如果我通过变量{{host1}}和{{host2}}调用主机,如何将它们放在一起?
宝马

如果您搜索文档部分:常见模式
Sahap Asci

3

这是设计使然。唯一的方法是仅在一个剧本中将role2应用于一个特定的组,而不在可能具有共同成员的组中的任何其他剧本中使用role2,例如此处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.