Выполнить несколько Ansible Plays, по одному элементу списка переменных за раз - PullRequest
0 голосов
/ 14 октября 2019

У меня есть книга игр Ansible для автоматизации сетевых изменений в среде. Воспроизведение одного касается каналов портов Cisco Nexus, при этом необходимо переместить несколько виртуальных сетей из одного портового канала в другой, воспроизвести два касания ACI Cisco, создав новые требуемые виртуальные сети в рамках требуемого арендатора ACI (создает BD и EPG). Мои файлы Playbook & Associates vars,роли и т. д. выполняют это, как и ожидалось, для одиночного vlan , перемещения между портами-каналами и создания ACI, однако, когда у меня есть список идентификаторов vlan, которые мне нужно перенести, мне не нужно делатьвсе сдвиги vlan на Nexus затем выполняют все создания vlan в ACI линейным методом. Мне нужно выполнить каждое перемещение и создание vlan, как если бы это был один vlan, затем вернуться назад (для цикла, я полагаю) к следующему элементу (vlan) в списке и сделать это снова.

Фрагмент Var

vlan_id:
  - 78
  - 79
  - 80
  - 81
  - 82

Фрагмент задачи

- name: Remove VLAN from port-channel 1 
  nxos_l2_interface:
    name: "{{ item[0] }}"
    mode: "{{ mode }}"
    trunk_vlans: "{{ item[1] }}"
    state: "{{ INTERFACE_REMOVE_state | default('absent') }}"
  with_nested:
  - "{{ INTERFACE_REMOVE_interface }}"
  - "{{ vlan_id }}"

- name: Add VLAN to port-channel 20
  nxos_l2_interface:
    name: "{{ item[0] }}"
    mode: "{{ mode }}"
    trunk_vlans: "{{ item[1] }}"
    state: "{{ INTERFACE_ADD_state | default('present') }}"
  with_nested:
    - "{{ INTERFACE_ADD_interface }}"
    - "{{ vlan_id }}"

Когда я выполняю книгу воспроизведения, задача 1 завершается для всех vlan_id, затем задача 2 завершается для всех vlan_id. Я хочу попробовать и выполнить задачу 1 и задачу 2 для первого vlan_id, затем выполнить задачу 1 и задачу 2 для второго vlan_id, затем выполнить задачу 1 и задачу 2 для третьего vlan_id и т. Д., И т. Д.

У кого-нибудь естьрешение, которое я мог бы использовать?

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

После беспокойной ночи и вставания и 5 утра, чтобы работать над решением, у меня есть один. Используя include_roles, loop, loop_control и определяя имена внутренних и внешних переменных с помощью loop_var, мое решение теперь работает должным образом

Фрагмент Playbook

---
# Author: Albert Short


###############################################################################
#@ Play1 Legacy environment changes
- hosts: <removed>
  connection: local
  gather_facts: yes


#@ The variables required for the main playbook are defined in this variable file
  vars_files:
    - vars/deploy.yml



   tasks:
     - block:
       - name:
         include_role:
           name: combined_roles
         loop: "{{ vlan_id }}"
         loop_control:
           extended: yes
           loop_var: outer_item

...

Фрагмент Vars

vlan_id:
  - "666"
  - "888"
  - "777"
  - "667"
  - "889"
  - "778"

Моя роль содержит все платформы, с которыми мне нужно работать (коммутаторы Cisco Nexus, Cisco APIC и Cisco MSC), и выполнение всех задач выполняется для каждой VLAN, а не для каждой задачи. т. е. все задачи для Nexus, ACI и MSC выполняются для VLAN 666 до запуска VLAN 888.

Успех !!!

0 голосов
/ 15 октября 2019

Мне кажется, я понимаю, что вы пытаетесь.

Как насчет использования include в основной части with_nested. Что-то вроде:

- name: Remove and Add VLAN    
  include add_remove_play.yml name="{{item[0]}}" trunc_vlans="{{item[1]}}"   
  with_nested:
     - "[ {{ INTERFACE_REMOVE_interface }}, {{ INTERFACE_ADD_interface }} ]"
     - "{{ vlan_id }}"

и в add_remove_play.yml кодируйте удаление и добавление поочередно. name и trunc_vlans будут установлены в вызове add_remove_play

...