问:“match and else。匹配字段应该是循环的当前项。第二个字段应该是下一项。”
答:Extended loop variables 服务于这个目的。例如
- hosts: localhost
vars:
companies:
- name: 'Amazon'
filters:
- 'filter-A1'
- 'filter-A2'
- 'filter-A3'
- name: 'Facebook'
filters:
- 'filter-F1'
- 'filter-F2'
- 'filter-F3'
- name: 'Google'
filters:
- 'filter-G1'
- 'filter-G2'
- 'filter-G3'
tasks:
- debug:
msg:
- "match: {{ item.0.name }} -
{{ item.1 }}"
- "else: {{ ansible_loop.nextitem.0.name|default('last item') }} -
{{ ansible_loop.nextitem.1|default('last subitem') }}"
loop: "{{ companies|subelements('filters', skip_missing=True) }}"
loop_control:
extended: true
给予
"msg": [
"match: Amazon - filter-A1",
"else: Amazon - filter-A2"
]
--
"msg": [
"match: Amazon - filter-A2",
"else: Amazon - filter-A3"
]
--
"msg": [
"match: Amazon - filter-A3",
"else: Facebook - filter-F1"
]
--
"msg": [
"match: Facebook - filter-F1",
"else: Facebook - filter-F2"
]
--
"msg": [
"match: Facebook - filter-F2",
"else: Facebook - filter-F3"
]
--
"msg": [
"match: Facebook - filter-F3",
"else: Google - filter-G1"
]
--
"msg": [
"match: Google - filter-G1",
"else: Google - filter-G2"
]
--
"msg": [
"match: Google - filter-G2",
"else: Google - filter-G3"
]
--
"msg": [
"match: Google - filter-G3",
"else: last item - last subitem"
]
问:“我希望它表现得像这样:”
"msg": [ "match: Facebook - filter-F2",
"else: Facebook - filter-F3" ]
"msg": [ "match: Facebook - filter-F3",
"else: " ]
“例如,当到达 Facebook 的最后一个子项时,next_item 的值应该为空。”
答:试试这个
- debug:
msg: "{{ msg.split('\n') }}"
vars:
msg: |
- match: {{ item.0.name }} - {{ item.1 }}
{% if item.0.name == ansible_loop.nextitem.0.name|default('last item') %}
- else: {{ ansible_loop.nextitem.0.name }} - {{ ansible_loop.nextitem.1 }}
{% else %}
- else: ''
{% endif %}
loop: "{{ companies|subelements('filters', skip_missing=True) }}"
loop_control:
label: "{{ item.0.name }}"
extended: true
最后,如果你想用这个列表创建一个变量,试试
- set_fact:
companies1: "{{ companies1|default([]) + [company|from_yaml] }}"
vars:
company: |
[{match: '{{ item.0.name }} - {{ item.1 }}'},
{%- if item.0.name == ansible_loop.nextitem.0.name|default('last item') %}
{else: '{{ ansible_loop.nextitem.0.name }} - {{ ansible_loop.nextitem.1 }}'}]
{%- else %}
{else: ''}]
{% endif %}
loop: "{{ companies|subelements('filters', skip_missing=True) }}"
loop_control:
label: "{{ item.0.name }}"
extended: true
- debug:
msg: "{{ msg.split('\n') }}"
vars:
msg: "{{ companies1|to_yaml }}"
给
"msg": [
"- - {match: Amazon - filter-A1}",
" - {else: Amazon - filter-A2}",
"- - {match: Amazon - filter-A2}",
" - {else: Amazon - filter-A3}",
"- - {match: Amazon - filter-A3}",
" - {else: ''}",
"- - {match: Facebook - filter-F1}",
" - {else: Facebook - filter-F2}",
"- - {match: Facebook - filter-F2}",
" - {else: Facebook - filter-F3}",
"- - {match: Facebook - filter-F3}",
" - {else: ''}",
"- - {match: Google - filter-G1}",
" - {else: Google - filter-G2}",
"- - {match: Google - filter-G2}",
" - {else: Google - filter-G3}",
"- - {match: Google - filter-G3}",
" - {else: ''}",
""
]