按多个测试/条件过滤列表

时间:2018-11-12 11:32:12

标签: ansible jinja2

使用子网列表过滤IP地址列表以获取那些子网中存在的IP地址列表的方法是什么?

总的来说,我想通过对每个对象应用多个测试来筛选一系列对象,并仅选择至少进行一次测试的对象。

更多详细信息:

我从明显的事实中获得了服务器的IP地址列表:

"ansible_all_ipv4_addresses": [
    "192.168.1.108",
    "192.168.10.108",
    "192.168.20.108",
    "192.168.30.108"
]

我有一个应该在其中启用服务的IP子网列表(通过this获得):

"allowed_subnets": [
    "192.168.1.0/24",
    "192.168.5.0/24",
    "192.168.10.0/24",
    "192.168.30.0/24"
]

Ansible中还有一个ipaddr filtercan be used可以过滤指定子网中包含的IP地址列表,如下所示:

# {{ test_list | ipaddr('192.0.0.0/8') }}
['192.24.2.1', '192.168.32.0/24']

我已经尝试过了:

subnet_list:
  - "192.168.1.1"
  - "192.168.2.1"
  - "192.168.3.1"
  - "192.168.4.1"
  - "192.168.5.1"

{{ subnet_list | ipaddr("192.168.1.0/23", "192.168.5.0/24") }}

但结果为空列表,因此我假设ipaddr过滤器正在使用逻辑AND

1 个答案:

答案 0 :(得分:0)

我相信这可能会让您踏上寻找的方向。

我创建了一个角色来测试您的要求。我在vars / main.yml中有以下内容:

---
my_ipv4_addresses: [
  '192.168.1.108',
  '192.168.10.108',
  '192.168.20.108',
  '192.168.30.108'
]
my_allowed_subnets: [
  '192.168.1.0/24',
  '192.168.5.0/24',
  '192.168.10.0/24',
  '192.168.30.0/24'
]
...

我有以下任务:

---
- name: "Get list of IPv4 only addresses within a given subnet"
  debug:  msg="For {{ item }}= {{ my_ipv4_addresses | ipv4(item) }}"
  with_items: "{{ my_allowed_subnets }}"
...

它生成以下输出:

TASK [ipaddr : Get list of IPv4 only addresses within a given subnet] **********
ok: [localhost] => (item=None) => {
    "msg": "For 192.168.1.0/24= [u'192.168.1.108']"
}
ok: [localhost] => (item=None) => {
    "msg": "For 192.168.5.0/24= []"
}
ok: [localhost] => (item=None) => {
    "msg": "For 192.168.10.0/24= [u'192.168.10.108']"
}
ok: [localhost] => (item=None) => {
    "msg": "For 192.168.30.0/24= [u'192.168.30.108']"
}

因此,也许可以使用类似此循环的内容,或从此循环生成列表。

希望这会有所帮助。