使用子网列表过滤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 filter,can 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 。
答案 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']"
}
因此,也许可以使用类似此循环的内容,或从此循环生成列表。
希望这会有所帮助。