【问题标题】:Execute a number of Ansible Plays, one variable list item at a time执行多个 Ansible Plays,一次一个变量列表项
【发布时间】:2019-10-14 19:16:00
【问题描述】:

我有一个 Ansible playbook 可以在环境中自动更改网络。 Play one touches Cisco Nexus 端口通道,需要将多个 vlan 从一个端口通道移动到另一个,play 2 touches Cisco ACI 通过在所需的 ACI 租户中创建新的 vlan(创建 BD 和 EPG) 我的剧本和关联 vars 文件、角色等按预期为 单个 vlan 执行此操作,在端口通道之间移动并进行 ACI 创建,但是当我有我需要的 vlan ID 列表时要迁移,我不需要在 Nexus 上进行所有 vlan 转换,然后以线性方法在 ACI 中创建所有 vlan。我需要像执行单个 vlan 一样执行每个 vlan 移动和创建,然后循环(我假设为 for 循环)到列表中的下一项(vlan)并再次执行。

变量 sn-p

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

任务sn-p

- 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 }}"

当我执行 playbook 时,所有 vlan_id 的任务 1 都完成了,然后所有 vlan_id 的任务 2 都完成了。 我想尝试为第一个 vlan_id 完成任务 1 和任务 2,然后为第二个 vlan_id 完成任务 1 和任务 2,然后为第三个 vlan_id 完成任务 1 和任务 2,等等。

有人有我可以使用的解决方案吗?

【问题讨论】:

    标签: loops for-loop ansible nested-loops


    【解决方案1】:

    我想我明白你在尝试什么。

    在with_nested 的主要部分使用include 怎么样?比如:

    - 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 调用中设置

    【讨论】:

      【解决方案2】:

      经过一个不安的夜晚,早上 5 点起床并着手解决问题,我有了一个。 使用 include_roles、loop、loop_control 和使用 loop_var 定义内部和外部变量名称,我的解决方案现在可以按预期工作

      剧本sn-p

      ---
      # 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
      
      ...
      

      变量 sn-p

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

      我的角色包含我需要执行的所有平台(Cisco Nexus 交换机、Cisco APIC 和 Cisco MSC),并且所有任务的执行都是在每个 VLAN 的基础上完成的,而不是每个任务。即,在 VLAN 888 启动之前,针对 VLAN 666 的 Nexus、ACI 和 MSC 的所有任务都已完成。

      成功!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-06
        • 2022-08-02
        • 2019-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多