ansible: как использовать selectattr с фильтром ipaddr - PullRequest
0 голосов
/ 05 июля 2019

Использование ansible 2.7.1, с установленным netaddr, в MacOS, python 3.7.3.

Почему-то не получается заставить selectattr и ipaddr работать вместе в ansible.

---
# simple test of ipaddr with selectattr
- hosts: localhost
  vars:
    x:
      - i: 'a'
        a: '1.2.3.4'
      - i: 'b'
        a: '192.168.3.23'
      - i: 'c'
        a: '0.0.0.0'
  tasks:
  - debug: var="x|selectattr('a', 'ipaddr','192.168.3.0/24')|list"

вывод:

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [debug] *******************************************************************
fatal: [localhost]: FAILED! => {"msg": "Unexpected failure during module execution."}
    to retry, use: --limit @/Users/chris.kiick/IIQ/services-performance-lab/scripts/ansible/tp2.retry

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=1

Почему это не работает?Я могу использовать ipaddr напрямую, и он работает с map ().Selectattr () отлично работает с другими фильтрами.Запуск с отладкой (-vvv) не дает никакой полезной информации.Использование других типов хостов (centos, ubuntu) не имеет значения.

Есть идеи?

1 Ответ

1 голос
/ 06 июля 2019

x - список. В списке есть элементы, без атрибутов. Элемент, например, x.1 может быть проверен

"{{ x.1|selectattr('a', 'ipaddr','192.168.3.0/24')|list }}"

, но selectattr не распознает ipaddr как тест . Это фильтр .

The error was: TemplateRuntimeError: no test named 'ipaddr'

Есть несколько вариантов действий. Можно зациклить список. Задание ниже

- debug:
    msg: "{{ item.a|ipaddr('192.168.3.0/24') }}"
  loop: "{{ x }}"

дает

"msg": ""
"msg": "192.168.3.23"
"msg": ""

или добавьте троичный фильтр. Задание ниже

- debug:
    msg: "{{ item.a|ipaddr('192.168.3.0/24')|ternary( item.a, 'not in range') }}"
  loop: "{{ x }}"

дает

"msg": "not in range"
"msg": "192.168.3.23"
"msg": "not in range"

, или задачи ниже

- set_fact:
    a_list: "{{ a_list|default([]) + [ item.a|ipaddr('192.168.3.0/24') ] }}"
  loop: "{{ x }}"
- debug:
    var: a_list

дать список

"a_list": [
    null, 
    "192.168.3.23", 
    null
]
...