Цикл по списку данных в Ansible playbooks - PullRequest
0 голосов
/ 09 мая 2019

В моем стремлении автоматизировать некоторые из наших сетевых сред, я хотел бы знать, как вы можете перебирать различные элементы во вложенных списках. Чтобы было понятнее, я объясню, что я хочу сделать, используя имеющиеся у меня инвентарь и игровую книгу.

Инвентарь выглядит следующим образом (Пустой контент)

parameters:
- mode: ""
  speed: ""
  duplex: ""
interfaces:
  - Int_One
  - Int_Two

Итак, как вы можете видеть, у меня есть список, содержащий некоторую информацию о сети (параметры), и другой список, содержащий два интерфейса. Действие, которое я хочу выполнить в моей книге воспроизведения, - настроить эти два интерфейса с помощью информации, найденной в списке «параметров». Другими словами, переберите «интерфейсы», используя информацию из списка «параметров». Но на данный момент я не могу заставить его использовать правильные данные в нужное время

Полезно знать, что я использую предопределенный «сетевой модуль Cisco» в своей книге игр.

Playbook выглядит следующим образом,

- name: Deploy Network Interfaces
  "Some network module":
    mode: '{{ item.0.mode }}'
    speed: '{{ item.0.speed }}'
    duplex: '{{ item.0.duplex }}'
    interface: '{{ item.1.interfaces }}'
    state: present
  delegate_to: localhost
  loop: 
    - "{{ parameters }}"
    - "{{ parameters|subelements('interfaces') }}"

Как видите, сетевой модуль требует предоставления "интерфейса". Итак, еще раз я хочу перебрать список «интерфейсы» и развернуть их с определенными данными в списке «параметры».

Кто-нибудь, кто может сказать мне, как решить эту проблему?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Ваш вопрос немного сбивает с толку. У вас есть две переменные; список с именем parameters:

parameters:
- mode: ""
  speed: ""
  duplex: ""

И список с именем interfaces:

interfaces:
  - Int_One
  - Int_Two

parameters имеет один предмет, а interfaces - два. Тот факт, что у них разное количество предметов, затрудняет понимание их взаимосвязи. Если каждый интерфейс имеет уникальные параметры, вы, вероятно, захотите что-то вроде этого:

interfaces:
  - name: Int_One
    mode: ""
    speed: ""
    duplex: ""
  - name: Int_Two
    mode: ""
    speed: ""
    duplex: ""

В этом случае вы бы написали свою пьесу следующим образом:

- name: Deploy Network Interfaces
  "Some network module":
    mode: '{{ item.mode }}'
    speed: '{{ item.speed }}'
    duplex: '{{ item.duplex }}'
    interface: '{{ item.name }}'
    state: present
  delegate_to: localhost
  loop: "{{ interfaces }}"

С другой стороны, если все интерфейсы будут иметь одинаковые параметры, то, возможно, вы бы структурировали свои данные следующим образом:

parameters:
  mode: ""
  speed: ""
  duplex: ""

interfaces:
  - Int_One
  - Int_Two

И напиши свою пьесу так:

- name: Deploy Network Interfaces
  "Some network module":
    mode: '{{ parameters.mode }}'
    speed: '{{ parameters.speed }}'
    duplex: '{{ parameters.duplex }}'
    interface: '{{ item.name }}'
    state: present
  delegate_to: localhost
  loop: "{{ interfaces }}"
0 голосов
/ 09 мая 2019

Учитывая ваш пример, решение будет следующим:

- hosts:
    - localhost
  gather_facts: False

  vars:
    parameters:
    - mode: "auto"
      speed: "1000"
      duplex: "full"
    interfaces:
      - Int_One
      - Int_Two

  tasks:
  - name: DBEUG
    debug:
      msg: >
        mode: {{parameters.0.mode}},
        speed: {{parameters.0.speed}},
        duplex: {{parameters.0.duplex}},
        interface: {{item}}
    loop:
      "{{interfaces}}"
...