Фильтровать список по нескольким тестам / условиям - PullRequest
0 голосов
/ 12 ноября 2018

Что такое способ jinja для фильтрации списка 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 фильтр , который можно использовать для фильтрации списка 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 использует логическое И .

1 Ответ

0 голосов
/ 12 ноября 2018

Я полагаю, что это может привести вас к тому, что вы ищете.

Я создал роль для проверки того, что вы просите. У меня есть следующее в 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']"
}

Так что, возможно, удастся получить что-то вроде этого цикла или сгенерировать список из этого цикла.

Надеюсь, это поможет.

...