Q: "match и др. Поле соответствия должно быть текущим элементом l oop. Второе поле должно быть следующим элементом."
A: Расширенные l oop переменные служат этой цели. Например,
- 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"
]
Q: "Я хочу, чтобы он вел себя так:"
"msg": [ "match: Facebook - filter-F2",
"else: Facebook - filter-F3" ]
"msg": [ "match: Facebook - filter-F3",
"else: " ]
"Например, когда он попадает в последний подраздел Facebook, значение next_item должно быть пустым."
A: Попробуйте это
- 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 }}"
give
"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: ''}",
""
]