Ansible L oop Получить следующее значение - PullRequest
1 голос
/ 28 февраля 2020

В настоящее время у меня возникли проблемы с заданием c задачи в al oop. Прежде всего мне нужно l oop по заданной c структуре:

companies:
  - name: Facebook
    company_url: "https://www.facebook.com"
    company_certificate: "Facebook.crt"
    port_type: "AS2"
    create_filematch: "yes"
    filters:
        - name: "ORDERS"
          regex: "ORDER*"
        - name: "INVOICES"
          regex: "INVOICE*"
  - name: Google
    company_url: "https://www.google.com"
    company_certificate: "Google.crt"
    port_type: "AS2"
    create_filematch: "yes"
    filters:
        - name: "ORDERS"
          regex: "ORDER*"
        - name: "INVOICES"
          regex: "INVOICE*"

Мне нужно l oop по подэлементам "фильтров". Я использую следующее l oop:

loop: "{{ companies | subelements('filters', skip_missing=True) }}"

Проблема в том, что мне нужно заполнить два поля в шаблоне: match и else . Поле match должно быть текущим элементом l oop. Второе поле должно быть следующим элементом.

Например, если у меня есть такая структура подэлементов: подэлементы: sub1: значение sub2: значение sub3: значение

Тогда я использую al oop для этих подэлементы и два поля в моем шаблоне должны выглядеть следующим образом:

match_send=sub1
else_send=sub2

, а затем на следующем элементе

match_send=sub2
else_send=sub3

Как я могу это сделать?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

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: ''}", 
        ""
    ]
0 голосов
/ 28 февраля 2020

Несмотря на мои комментарии, я думаю, что нашел решение. Вы могли бы использовать with_together.

Я пришел с рабочим примером:

---
- hosts: localhost
  vars:
  - list1:
    - a
    - b
    - c
  tasks:
  - name: with_together
    debug:
      msg: "{{ item.0 }} - {{ item.1 }}"
    with_together:
      - "{{ list1 }}"
      - "{{ list1[1:] }}"

, который дает:

TASK [with_together] ************************************************************************************************************************************************
ok: [localhost] => (item=[u'a', u'b']) => {
    "msg": "a - b"
}
ok: [localhost] => (item=[u'b', u'c']) => {
    "msg": "b - c"
}
ok: [localhost] => (item=[u'c', None]) => {
    "msg": "c - "
}

Я думаю, вы могли бы адаптироваться это для вашего случая использования.

...