首页 > 解决方案 > 按多个测试/条件过滤列表

问题描述

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

一般来说,我想通过对每个对象应用多个测试来过滤一系列对象,并且只选择至少一个测试成功的对象。

以下是更多详细信息:

我有一个来自 ansible 事实的服务器 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 过滤器,可用于过滤指定子网中包含的 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

标签: ansiblejinja2

解决方案


我相信这可能会让你开始寻找你想要的东西。

我创建了一个角色来测试您的要求。我在 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']"
}

所以,也许可以通过使用类似这个循环的东西来获得,或者从这个循环中生成一个列表。

希望这可以帮助。


推荐阅读