Ansible 按属性过滤包含值

leo*_*587 4 jinja2 ansible

在 Ansible 中,如何根据对象的属性是否包含值来过滤对象?

例如:我想通过过滤contains的对象来返回private_man具有属性的对象。name="a2"private_manaddr"1.2.3.4"

这是 Ansible 代码:

- hosts: localhost
  connection: local
  gather_facts: no
  vars:
    network:
      addresses:
        private_ext:
          - name: a1
            addr:
              - 1.2.3.4
        private_man:
          - name: a2
            addr:
              - 10.10.20.30
              - 1.2.3.4
          - name: a3
            addr:
              - 10.90.80.10
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

- debug:
    msg: "{{ item.name }}"
  with_items: "{{ network.addresses.private_man | selectattr('addr', 'in', '1.2.3.4') | list }}"
Run Code Online (Sandbox Code Playgroud)

我预计会显示此内容,a2因为 a2 对象的 addr 元素包含1.2.3.4

然而,当我运行这个时,它完全失败了,可能是因为selectaddr('addr', 'in', '1.2.3.4')无效。

hel*_*loV 5

这行得通吗?

  - debug:
      msg: "{{ item.name }}"
    with_items: "{{network.addresses.private_man}}"
    when: '"1.2.3.4" in item.addr'
Run Code Online (Sandbox Code Playgroud)


Kon*_*rov 5

您只能在以下位置使用 Jinja2 测试selectattr
http://jinja.pocoo.org/docs/2.9/templates/#builtin-tests http://docs.ansible.com/ansible/latest/playbooks_tests.html

对于你的例子:

- debug:
    msg: "{{ item.name }}"
  with_items: "{{ network.addresses.private_man | selectattr('addr','issuperset',['1.2.3.4']) | list }}"
Run Code Online (Sandbox Code Playgroud)