Фильтрация адресов, соответствующих условию - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу предоставить список разрешенных VLAN в качестве переменной для моего сервера.

Ansible playbook должен иметь возможность фильтровать IP-адреса сервера на основе этой VLAN.

  • У меня есть список всех IP-адресов, доступных на сервере (ansible_all_ipv4_addresses из доступных фактов)

  • У меня есть глобальная переменная my_subnets:

    my_subnets:
      - vlan: 2
        subnet: "192.168.2.0/24"
        gateway: "192.168.2.10"
      - vlan: 3
        subnet: "192.168.3.0/24"
        dns: "192.168.3.12"
      - vlan: 4
        subnet: "192.168.4.0/24"
      - vlan: 5
        subnet: "192.168.5.0/24"
    
  • И у меня есть переменная для каждой услуги allowed_vlans:

    allowed_vlans:
      - 2
      - 5
    

Я ищу способ шаблонирования только "192.168.2.0/24" и "192.168.5.0/24"


Я думал о:

1. Путь дзиндзя

Что-то вроде извлечение из my_subnets элементов сопоставление allowed_vlans и сопоставление их с ansible_all_ipv4_addresses через ipaddr () фильтр.

2. Способ запроса JSON

Я пробовал:

{{ my_subnets | json_query('[?vlan in allowed_vlans].subnet') }}

но, похоже, json_query не использует синтаксис python для оценки, если что-то находится в массиве.

1 Ответ

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

Функция contains() - это то, как JMESPath проверяет членство, но, насколько я могу судить, она не имеет возможности ссылаться на вверх в дереве объектов и не присваивать выражения внутренним переменные, как и язык jq. Но можно обмануть и сериализовать выражение в JSON, а затем использовать буквальное выражение синтаксиса JMESPath:

tasks:
- debug:
    verbosity: 0
    msg: |
      {{ my_subnets | json_query(jq) }}
  vars:
    # this "vars" trick was recommended by the json_query docs, but isn't required
    jq: |
      [? contains(`{{ allowed_subnets | to_json }}`, vlan) ].subnet
...