在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')无效。
答案 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 }}"