data:
- { name: foo, app: foo, isweb: true }
- { name: bar, app: bar, isweb: true }
- { name: foobar, app: foobar, isweb: false }
- { name: baz, app: baz, isweb: false }
Run Code Online (Sandbox Code Playgroud)
期望的结果如下:
{% set list= [] %}
{% for item in data %}
{% if item.isweb == true %}
{{list.append(item.app)}}
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
这可以使用过滤器实现吗:
{{ data | map(attribute='app') | list | join(' ') }}
Run Code Online (Sandbox Code Playgroud)
基本上问题是如何使用单行过滤器(如上)实现上述 for 循环,但只获取值为isweb true.
有几种方法可以做到这一点(使用 ansible 2.7。不确定较低版本):
纯过滤方式(使用selectattr和map):
- set_fact: app_list="{{ data | selectattr("isweb", "equalto", true) | map(attribute='app') | list }}"
Run Code Online (Sandbox Code Playgroud)
loop在过滤器中使用 ansible条件:
- set_fact: app_list="{{ (app_list | default([])) + ([ item.app ] if (item.isweb == True) else []) }}"
loop: "{{ data }}"
Run Code Online (Sandbox Code Playgroud)
将 Ansibleloop与when语句一起使用:
- set_fact: app_list="{{ (app_list | default([])) + [ item.app ] }}"
loop: "{{ data }}"
when: item.app is defined and item.app == true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4125 次 |
| 最近记录: |