首页 > 解决方案 > Ansible:使用 yaml 库存的两个主机组的交集

问题描述

我有 2 个组,每个组都有名为dev和的子组test。我正在尝试使用模式定位( ) 中的test主机。group2four.example.comgroup2:&test

鉴于 yaml 库存:

all:
  children:
    group1:
      children:
        dev:
          hosts:
            one.example.com:
        test:
          hosts:
            two.example.com:
    group2:
      children:
        dev:
          hosts:
            three.example.com:
        test:
          hosts:
            four.example.com:
                  

和剧本:

- name: health check
  hosts: group2:&test
  tasks:
    - name: Ping hosts
      ping:

我从two和都收到了 ping 命令four

我只 希望 ping 来自four.

虽然它确实two是一个名为 的组的一部分test,但它不是该组的一部分,group2因此我不希望将它视为相交的一部分。

就好像它在做一个逻辑或 (||),而不是一个逻辑与 (&&)

使用具有非唯一子名称的嵌套组时,这是 Ansible 的限制吗?

标签: ansibleyaml

解决方案


问:在使用具有非唯一子名称的嵌套组时,这是 Ansible 的限制吗?

答:Ansible by design 不存储库存树。这似乎是一个限制。引用 如何合并变量

默认情况下,变量在播放运行之前被合并/展平到特定主机。这使 Ansible 专注于主机和任务,因此组在库存和主机匹配之外并不能真正生存。

引用继承变量值:组组的组变量

任何属于子组成员的主机都会自动成为父组的成员。

有2个含义

  1. 模式“ group2 :&test ”是自相矛盾的。组测试包含主机:。通过尝试过交叉点,您同意这一点。否则,交叉点就没有意义了。但是引用的声明说test的成员自动成为group1group2的成员。换句话说,Ansible 无法区分 1)保留所有主机的组测试和 2) 将组测试作为group1group2的子项。例如,下面的清单等同于问题中的清单
all:
  children:
    group1:
      children:
        dev:
          hosts:
            one.example.com:
            three.example.com:
        test:
          hosts:
            two.example.com:
            four.example.com:
    group2:
      children:
        dev:
        test:
all:
  children:
    dev:
      hosts:
        one.example.com:
        three.example.com:
    test:
      hosts:
        two.example.com:
        four.example.com:
    group1:
      children:
        dev:
        test:
    group2:
      children:
        dev:
        test:
  1. 具有非唯一子名称的嵌套组不符合此用例的目的。试试下面的库存
all:
  children:
    group1:
      hosts:
        one.example.com:
        two.example.com:
    group2:
      hosts:
        three.example.com:
        four.example.com:
    dev:
      hosts:
        one.example.com:
        three.example.com:
    test:
      hosts:
        two.example.com:
        four.example.com:

笔记

  • 如果使用 groups_vars 的合并顺序,库存之间可能存在差异。请参阅如何合并变量

推荐阅读