在Ansible中使用ipaddr筛选对象列表

在Ansible中使用ipaddr筛选对象列表,ansible,jinja2,Ansible,Jinja2,如果我在Ansible中有一个ip地址列表,我可以使用ipaddr过滤器,只返回传递的值: - debug: msg: "{{ ['127.0.0.1', 'foo', '2001:db8:32c:faad::'] | ipaddr('address') }}" 不幸的是,我使用的是对象列表(精确地说是组成员的hostvars)。我想在列表上做一些测试,只让条目通过,但作为对象 阅读Jinja文档时,我偶然发现selectattr。不幸的是,ipaddr似乎不是一个测试,所以它不起作用

如果我在Ansible中有一个ip地址列表,我可以使用
ipaddr
过滤器,只返回传递的值:

- debug:
    msg: "{{ ['127.0.0.1', 'foo', '2001:db8:32c:faad::'] | ipaddr('address') }}"
不幸的是,我使用的是对象列表(精确地说是组成员的hostvars)。我想在列表上做一些测试,只让条目通过,但作为对象

阅读Jinja文档时,我偶然发现
selectattr
。不幸的是,
ipaddr
似乎不是一个测试,所以它不起作用:

- debug:
    msg: "{{ [{'ip':'127.0.0.1'}, {'ip':'foo'}, {'ip':'2001:db8:32c:faad::'}] | selectattr('ip', 'ipaddr', 'address') | list}} "
导致

jinja2.exceptions.TemplateRuntimeError:没有名为“ipaddr”的测试

是否有任何方法可以使用
ipaddr
过滤对象列表

是否有任何方法可以使用ipaddr筛选对象列表

当然!您可以使用
map
功能将过滤器应用于列表,以获得(有效的)
true
/
false
值列表,然后将其与原始列表结合使用,仅选择具有有效地址的条目。例如:

---
- hosts: localhost
  gather_facts: false
  vars:
    addresses:
      - name: host0
        ip: 127.0.0.1
      - name: host1
        ip: foo
      - name: host2
        ip: '2001:db8:32c:faad::'
  tasks:
    - set_fact:
        valid_addresses: "{{ addresses|json_query('[*].ip')|map('ipaddr')|list }}"

    - debug:
        msg: "host {{ item.0.name }} has valid address {{ item.0.ip }}"
      when: item.1
      loop: "{{ addresses|zip(valid_addresses)|list }}"
是否有任何方法可以使用ipaddr筛选对象列表

当然!您可以使用
map
功能将过滤器应用于列表,以获得(有效的)
true
/
false
值列表,然后将其与原始列表结合使用,仅选择具有有效地址的条目。例如:

---
- hosts: localhost
  gather_facts: false
  vars:
    addresses:
      - name: host0
        ip: 127.0.0.1
      - name: host1
        ip: foo
      - name: host2
        ip: '2001:db8:32c:faad::'
  tasks:
    - set_fact:
        valid_addresses: "{{ addresses|json_query('[*].ip')|map('ipaddr')|list }}"

    - debug:
        msg: "host {{ item.0.name }} has valid address {{ item.0.ip }}"
      when: item.1
      loop: "{{ addresses|zip(valid_addresses)|list }}"