Ansible按属性过滤包含一个值

时间:2017-10-12 01:34:40

标签: ansible jinja2

在Ansible中,如何根据对象的属性是否包含值来过滤对象?例如:我想通过过滤private_man对象返回具有属性name =“a2”的private_man对象,其中addr包含“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

我尝试了以下内容:

- debug:
    msg: "{{ item.name }}"
  with_items: "{{ network.addresses.private_man | selectattr('addr', 'in', '1.2.3.4'}} | list"

我希望这显示“a2”,因为a2对象的addr元素包含1.2.3.4

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

3 个答案:

答案 0 :(得分:2)

这会有用吗?

  - debug:
      msg: "{{ item.name }}"
    with_items: "{{network.addresses.private_man}}"
    when: '"1.2.3.4" in item.addr'

答案 1 :(得分:1)

您只能在selectattr中使用Jinja2测试:
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 }}"

答案 2 :(得分:0)

我仅能使用以下内容将结果从ec2_asg_facts缩小到launch_configuration_name中仅具有给定变量值的结果。 search测试似乎没有很好的文档记录,它可能是附加软件吗?我以为可以分享,以防别人想做类似的事情。在appRole.name下可能是“员工”或“数据”之类的东西。

  - name: Narrow my list
    set_fact:
      asgList: "{{ autoScalingGroupNames.results | selectattr('launch_configuration_name', 'search', appRole.name) | list }}"