我有一个看起来像这样的剧本:
--- - hosts: group1 roles: - role1 - role2 - hosts: group2 roles: - role2 - role3
现在说我有一个有这样的条目的主机文件:
[group1] host1.example.com [group2] host1.example.com
Ansible将在role2 TWICE中为host1.example.com运行任务,因为它出现在两个组中,并且每个都有role2分配给它们。
我怎样才能使Ansible认识到它有两次相同的作用,所以它只应该运行一次?
如前所述,这是devise。 Ansible每次只执行一个游戏。 您的手册包含两个播放(由Playbook文件定义的根级别YAML列表中的两个项目)。 第一个play将role1和role2应用于group1。 该游戏首先执行,只有一次完成后才开始第二个游戏。 但Ansible并不试图将逻辑上的戏剧合并在一起。 毕竟,你可能实际上想让angular色2中的任务运行两次。
至于解决这个问题,有几种方法可以解决这个问题,你select哪一个取决于组和angular色的细节。
如果angular色2中的所有任务都是幂等的,也就是说,如果它们可以多次运行并且每次都以相同的结果结束,那么你真正失去的就是时间,可以重复angular色。 如果angular色需要很长时间才能申请,或者如果您不能使其具有幂等性,请考虑以下几点:
你可以把剧本分成三部分,分别应用angular色:
--- - hosts: group1 roles: - role1 - hosts: group1:group2 roles: - role2 - hosts: group2 roles: - role3
或者,如果您的angular色需要组合在一起,则可以为需要所有三个angular色的服务器创build第三个组。 你不需要把他们从另外两个小组中拿走。 您可以像这样在您的库存文件中创build组:
[group1and2:children] group1 group2
然后在你的剧本中,你可以再分成三个剧本,但是使用第三组来避免重演angular色:
--- - hosts: group1:!group1and2 roles: - role1 - role2 - hosts: group1and2 roles: - role1 - role2 - role3 - hosts: group2:!group1and2 roles: - role2 - role3
这非常难看,但在某些情况下可能会有用。
这是devise。 唯一的办法是将angular色2只应用于一个特定的组,而不是在可能拥有共同成员的组中的任何其他剧本中使用angular色2。