Ansible - Loops og Conditions

Ansible - Loops og Conditions


Ansible when er brukt når du ønsker å sette betingelser for når en task skal kjøre.
Innrykket er viktig for when betingelsen. Den tilhører tasken, så den må være på samme innrykk som tasken

---
- name: Nettverk versjon switcher
  hosts: switcher
  connection: network_cli
  gather_facts: no

   
  tasks:
    - name: Gather all legacy facts
      cisco.ios.ios_facts:
        gather_subset: all
      register: output

    - name: Skriv ut versjon på IOS enheter ved å bruke variabel output
      debug:
        msg: "{{ output['ansible_facts']['ansible_net_hostname'] }} er {{ output['ansible_facts']['ansible_net_iostype'] }} på versjon {{ output['ansible_facts']['ansible_net_version'] }} "
      when: output['ansible_facts']['ansible_net_iostype'] == 'IOS'

    - name: Skriv ut versjon på IOS-XE enheter ved å bruke variabel output
      debug:
        msg: "{{ output['ansible_facts']['ansible_net_hostname'] }} er {{ output['ansible_facts']['ansible_net_iostype'] }} på versjon {{ output['ansible_facts']['ansible_net_version'] }} "
      when: output['ansible_facts']['ansible_net_iostype'] == 'IOS-XE'

    - name: Skriv ut versjon på IOS enheter
      debug:
        msg: "{{ ansible_net_hostname }} er {{ ansible_net_iostype }} på versjon {{ ansible_net_version }} "
      when: ansible_net_iostype == 'IOS'

    - name: Skriv ut versjon på IOS-XE enheter
      debug:
        msg: "{{ ansible_net_hostname }} er {{ ansible_net_iostype }} på versjon {{ ansible_net_version }} "
      when: ansible_net_iostype == 'IOS-XE'

    - name: Skriv ut ios og versjon - når begge when statement er sanne
      debug:
        msg: "{{ ansible_net_hostname }} er {{ ansible_net_iostype }} på versjon {{ ansible_net_version }} "
      when: 
        - ansible_net_iostype == 'IOS-XE'
        - ansible_net_version == '17.12.01prd9'

    - name: Skriv ut IOS og IOS-XE enheter - når en when statement er sanne
      debug:
        msg: "{{ ansible_net_hostname }} er {{ ansible_net_iostype }} på versjon {{ ansible_net_version }} "
      when: 
        - ansible_net_iostype == 'IOS-XE' or ansible_net_iostype == 'IOS'
                



Loops

Loops er brukt når du ønsker å gjenta en task flere ganger.
Det er flere typer loops
I Ansible 2.5 ble loop lagt til som en erstatning for with_alternativer.
with_alternativene fungerer fortsatt, men det er anbefalt å bruke loop i stedet.

loop - brukes når du har en liste med elementer
with_nested - brukes når du har en liste med lister
with_sequence - brukes når du har en sekvens med items i en stigende rekkefølge
with_dict - brukes når du har en dictionary

Her er et eksempel på vlan i en liste som vi looper over. vlan100 og vlan200 blir opprettet på alle switcher.

loop:
---
- name: vlan loop switcher
  hosts: switcher
  connection: network_cli
  gather_facts: no

  vars:
    vlan: 
    - name: vlan100
      id: 100
    - name: vlan200
      id: 200

  tasks: 
    - name: Konfigurer vlan
      ios_vlans:
        config:
        - name: "{{ item.name }}"
          vlan_id: "{{ item.id }}"
          state: active
      loop: "{{ vlan }}"
                

ansible-playbook playbook_vlan_loop.yaml -k 


PLAY [vlan loop switcher] **************************************************************************************************************************************************************************************************************

TASK [Konfigurer vlan] *****************************************************************************************************************************************************************************************************************
changed: [IOS_XE_switch_3] => (item={'name': 'vlan100', 'id': 100})
changed: [IOS_switch_1] => (item={'name': 'vlan100', 'id': 100})
changed: [IOS_XE_switch_3] => (item={'name': 'vlan200', 'id': 200})
changed: [IOS_switch_1] => (item={'name': 'vlan200', 'id': 200})
changed: [IOS_XE_switch_4] => (item={'name': 'vlan100', 'id': 100})
changed: [IOS_switch_2] => (item={'name': 'vlan100', 'id': 100})
changed: [IOS_switch_2] => (item={'name': 'vlan200', 'id': 200})
changed: [IOS_XE_switch_4] => (item={'name': 'vlan200', 'id': 200})

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
IOS_XE_switch_3            : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
IOS_XE_switch_4            : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
IOS_switch_1               : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
IOS_switch_2               : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
             



with_nested - Nested loops


---
- name: L2 loop switcher
  hosts: switcher
  connection: network_cli
  gather_facts: no

  vars: 
      interface: [ GigabitEthernet1/0/7, GigabitEthernet1/0/8 ]
      vlan: [ 100 ]

  tasks: 
    - name: sett vlan på L2 interface
      ios_l2_interfaces:
        config:
          - name: "{{ item.0 }}"
            mode: access
            access:
              vlan: "{{ item.1 }}"
        state: merged
      with_nested: 
        - "{{ interface }}"
        - "{{ vlan }}"
            

ansible-playbook playbook_port_nested_loop.yaml -k -l IOS_XE_switch_3

PLAY [L2 loop switcher] ****************************************************************************************************************************************************************************************************************

TASK [sett vlan på L2 interface] *******************************************************************************************************************************************************************************************************
changed: [IOS_XE_switch_3] => (item=['GigabitEthernet1/0/7', 100])
changed: [IOS_XE_switch_3] => (item=['GigabitEthernet1/0/8', 100])

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
IOS_XE_switch_3            : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0           
            


Du kan også bruk loop med filter for å åpne det samme.
- name: sett vlan på L2 interface
  ios_l2_interfaces:
    config:
      - name: "{{ item.0 }}"
        mode: access
        access:
          vlan: "{{ item.1 }}"
    state: merged
  loop: "{{ interface | product(vlan) | list }}"            
            



Du kan lese mer om bruk av filter i Ansible her: Ansible Filters


Loop og conditions sammen
I dette eksempelet endres vlan 100 til 200 på alle aksess porter
---
- name: Hent VLAN facts og endre VLAN 100 til 200
  hosts: switcher
  connection: network_cli
  gather_facts: no

  tasks:
    - name: hent VLAN facts
      ios_facts:
        gather_subset: min
        gather_network_resources: l2_interfaces
      register: ios_facts
   
    - ios_l2_interfaces:
        config:
          - name: "{{ item.name }}"
            mode: access
            access:
              vlan: "200"
        state: merged
      loop: "{{ ios_facts.ansible_facts.ansible_network_resources.l2_interfaces }}"
      when: "'access' in item and 'vlan' in item.access and item.access.vlan == 100"