I dette eksempelet så kommer vi til å lage en lag 3 interface på våre rutere.
Vi kommer også til å konfigurere OSPF og BGP på disse rutere.
Oppsett av lag 3 interface
For å lage en lag 3 interface så må vi bruke ios_l3_interface modulen.
Vi kommer til å opprette ne vars fil som vi referer til i playbooken.
vars filen kommer til å inneholde informasjon om l3 interfacene.
vars_files: vars/l3_interfaces.yml
l3_interfaces:
IOS_XE_ruter_3:
- { interface: GigabitEthernet2, ip: 10.190.0.2/28, description: "OSPF interface"}
IOS_XE_ruter_2:
- { interface: GigabitEthernet2, ip: 10.190.0.1/28, description: "OSPF interface"}
IOS_ruter_1:
- { interface: GigabitEthernet0/2, ip: 10.190.0.11/28, description: "OSPF interface"}
---
- name: L3 interface konfigurasjon
hosts: rutere
gather_facts: no
vars_files: vars/l3_interfaces.yaml
tasks:
- name: l3 interfaces
ios_l3_interfaces:
config:
- name: "{{ item.interface }}"
ipv4:
- address: "{{ item.ip }}"
state: merged
loop: "{{ l3_interfaces[inventory_hostname] }}"
ansible-playbook playbook_l3_interfaces.yaml -k
SSH password:
PLAY [L3 interface konfigurasjon] ************************************************************************************************************************************************************************************
TASK [l3 interfaces] *************************************************************************************************************************************************************************************************
changed: [IOS_ruter_1] => (item={'interface': 'GigabitEthernet0/2', 'ip': '10.190.0.11/28', 'description': 'OSPF interface'})
changed: [IOS_XE_ruter_2] => (item={'interface': 'GigabitEthernet2', 'ip': '10.190.0.1/28', 'description': 'OSPF interface'})
changed: [IOS_XE_ruter_3] => (item={'interface': 'GigabitEthernet2', 'ip': '10.190.0.2/28', 'description': 'OSPF interface'})
PLAY RECAP ***********************************************************************************************************************************************************************************************************
IOS_XE_ruter_2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
IOS_XE_ruter_3 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
IOS_ruter_1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
l3_interfaces:
IOS_XE_ruter_3:
- name: GigabitEthernet2
ipv4:
- address: 10.190.0.2/28
- name: GigabitEthernet3
ipv4:
- address: 10.190.1.2/28
IOS_XE_ruter_2:
- { name: GigabitEthernet2, ipv4: [{ address: "10.190.0.1/28" }] }
- { name: GigabitEthernet3, ipv4: [{ address: "10.190.1.1/28" }] }
IOS_ruter_1:
- { name: GigabitEthernet0/2, ipv4: [{address: 10.190.0.11/28}] }
- { name: GigabitEthernet0/3, ipv4: [{address: 10.190.1.11/28}] }
l3_interfaces:
IOS_XE_ruter_3:
- { interface: GigabitEthernet2, ip: 10.190.0.2/28, description: "OSPF interface"}
- { interface: GigabitEthernet3, ip: 10.190.1.2/28, description: "OSPF interface"}
IOS_XE_ruter_2:
- { interface: GigabitEthernet2, ip: 10.190.0.1/28, description: "OSPF interface"}
- { interface: GigabitEthernet3, ip: 10.190.1.1/28, description: "OSPF interface"}
IOS_ruter_1:
- { interface: GigabitEthernet0/2, ip: 10.190.0.11/28, description: "OSPF interface"}
- { interface: GigabitEthernet0/3, ip: 10.190.1.11/28, description: "OSPF interface"}
[defaults]
inventory = inventory
# Vi setter host_key_checking til false for å ikke verifisere host keys
host_key_checking = False
# aktivere tidtaking for å se hvor lang tid det tar å kjøre playbook
callbacks_enabled = profile_tasks
[persistent_connection]
# Vi setter timeout verdiene høyere for å unngå timeout feil ved kjøring av playbook
command_timeout = 180
connect_timeout = 100
connect_retry_timeout = 100
---
- name: L3 interface konfigurasjon
hosts: rutere
gather_facts: no
vars_files: vars/l3_interfaces.yaml
tasks:
- name: l3 interfaces
ios_l3_interfaces:
config:
- name: "{{ item.interface }}"
ipv4:
- address: "{{ item.ip }}"
state: deleted
loop: "{{ l3_interfaces[inventory_hostname] }}"
ansible-playbook playbook_l3_interfaces.yaml -k
SSH password:
PLAY [L3 interface konfigurasjon] ************************************************************************************************************************************************************************************
TASK [l3 interfaces] *************************************************************************************************************************************************************************************************
Thursday 27 June 2024 15:49:58 +0200 (0:00:00.151) 0:00:00.151 *********
changed: [IOS_ruter_1] => (item={'interface': 'GigabitEthernet0/2', 'ip': '10.190.0.11/28', 'description': 'OSPF interface'})
changed: [IOS_ruter_1] => (item={'interface': 'GigabitEthernet0/3', 'ip': '10.190.1.11/28', 'description': 'OSPF interface'})
changed: [IOS_XE_ruter_2] => (item={'interface': 'GigabitEthernet2', 'ip': '10.190.0.1/28', 'description': 'OSPF interface'})
changed: [IOS_XE_ruter_3] => (item={'interface': 'GigabitEthernet2', 'ip': '10.190.0.2/28', 'description': 'OSPF interface'})
changed: [IOS_XE_ruter_2] => (item={'interface': 'GigabitEthernet3', 'ip': '10.190.1.1/28', 'description': 'OSPF interface'})
changed: [IOS_XE_ruter_3] => (item={'interface': 'GigabitEthernet3', 'ip': '10.190.1.2/28', 'description': 'OSPF interface'})
PLAY RECAP ***********************************************************************************************************************************************************************************************************
IOS_XE_ruter_2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
IOS_XE_ruter_3 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
IOS_ruter_1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Thursday 27 June 2024 15:50:14 +0200 (0:00:16.421) 0:00:16.573 *********
===============================================================================
l3 interfaces ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 16.42s
ansible-playbook playbook_l3_interfaces_aggregate.yaml -k
SSH password:
PLAY [L3 interface konfigurasjon] ************************************************************************************************************************************************************************************
TASK [l3 interfaces aggregate] ***************************************************************************************************************************************************************************************
Thursday 27 June 2024 15:50:59 +0200 (0:00:00.171) 0:00:00.171 *********
changed: [IOS_ruter_1]
changed: [IOS_XE_ruter_2]
changed: [IOS_XE_ruter_3]
PLAY RECAP ***********************************************************************************************************************************************************************************************************
IOS_XE_ruter_2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
IOS_XE_ruter_3 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
IOS_ruter_1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Thursday 27 June 2024 15:51:14 +0200 (0:00:14.918) 0:00:15.089 *********
===============================================================================
l3 interfaces aggregate -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 14.92s
{% for int in l2interfaces %}
{% if int.switchport_mode == 'trunk' %}
interface {{ int.name }}
description {{ int.description }}
switchport mode {{ int.switchport_mode }}
switchport trunk allowed vlan {{ int.switchport_allowed_vlan }}
{% endif %}
{% if int.switchport_mode == 'access' %}
interface {{ int.name }}
description {{ int.description }}
switchport mode {{ int.switchport_mode }}
switchport access vlan {{ int.switchport_allowed_vlan }}
{% endif %}
{% endfor %}
---
- name: Opprett l2 med jinja2
ios_config:
src: "l2.j2"
match: line
- name: Opprett l2 interfaces
import_tasks: l2int.yaml
tags: l2
l2interfaces:
- name: GigabitEthernet1/0/4
description: "L2 trunk mellom core"
switchport_mode: trunk
switchport_allowed_vlan: 170,309
- name: GigabitEthernet1/0/5
description: "mot IOS-XE-ruter interface g2"
switchport_mode: access
switchport_allowed_vlan: 309
---
- name: L3 interface konfigurasjon
hosts: rutere
gather_facts: no
vars_files: vars/l3_interfaces_aggregate.yaml
tasks:
- name: l3 interfaces aggregate
ios_l3_interfaces:
config: "{{ l3_interfaces[inventory_hostname] }}"
- name: Enable interface
cisco.ios.ios_interfaces:
config:
- name: "{{ item.name }}"
enabled: true
state: replaced
loop: "{{ l3_interfaces[inventory_hostname] }}"
router ospf 1
network 10.190.0.0 0.0.0.15 area 0
---
- name: L3 interface konfigurasjon
hosts: IOS_XE_rutere
gather_facts: no
tasks:
- name: OSPF
ios_config:
src: templates/ospf.j2
ansible -m ios_command -a "commands='show ip ospf neighbor'" IOS_XE_rutere -k
SSH password:
IOS_XE_ruter_2 | SUCCESS => {
"changed": false,
"stdout": [
"Neighbor ID Pri State Dead Time Address Interface
10.170.0.253 1 FULL/DR 00:00:30 10.190.0.2 GigabitEthernet2"
],
"stdout_lines": [
[
"Neighbor ID Pri State Dead Time Address Interface",
"10.170.0.253 1 FULL/DR 00:00:30 10.190.0.2 GigabitEthernet2"
]
]
}
IOS_XE_ruter_3 | SUCCESS => {
"changed": false,
"stdout": [
"Neighbor ID Pri State Dead Time Address Interface
10.170.0.252 1 FULL/BDR 00:00:36 10.190.0.1 GigabitEthernet2"
],
"stdout_lines": [
[
"Neighbor ID Pri State Dead Time Address Interface",
"10.170.0.252 1 FULL/BDR 00:00:36 10.190.0.1 GigabitEthernet2"
]
]
}
- name: OSPFV2 modul konfigurasjon
cisco.ios.ios_ospfv2:
config:
processes:
- process_id: 2
network:
- address: "10.170.0.0"
wildcard_bits: "0.0.0.255"
area: 0
ansible -m ios_command -a "commands='show ip ospf neighbor'" IOS_XE_rutere -k
SSH password:
IOS_XE_ruter_2 | SUCCESS => {
"changed": false,
"stdout": [
"Neighbor ID Pri State Dead Time Address Interface
10.190.1.2 1 FULL/DR 00:00:38 10.170.0.253 GigabitEthernet1
10.170.0.253 1 FULL/DR 00:00:35 10.190.0.2 GigabitEthernet2"
],
"stdout_lines": [
[
"Neighbor ID Pri State Dead Time Address Interface",
"10.190.1.2 1 FULL/DR 00:00:38 10.170.0.253 GigabitEthernet1",
"10.170.0.253 1 FULL/DR 00:00:35 10.190.0.2 GigabitEthernet2"
]
]
}
IOS_XE_ruter_3 | SUCCESS => {
"changed": false,
"stdout": [
"Neighbor ID Pri State Dead Time Address Interface
10.190.1.1 1 FULL/BDR 00:00:38 10.170.0.252 GigabitEthernet1
10.170.0.252 1 FULL/BDR 00:00:38 10.190.0.1 GigabitEthernet2"
],
"stdout_lines": [
[
"Neighbor ID Pri State Dead Time Address Interface",
"10.190.1.1 1 FULL/BDR 00:00:38 10.170.0.252 GigabitEthernet1",
"10.170.0.252 1 FULL/BDR 00:00:38 10.190.0.1 GigabitEthernet2"
]
]
}
router bgp {{ bgp_data[inventory_hostname]['as'] }}
{% for net in bgp_data[inventory_hostname]['networks'] %}
network {{ net['address'] }} mask {{ net['netmask'] }}
{% endfor %}
{% for nei in bgp_data[inventory_hostname]['neighbors'] %}
neighbor {{ nei['address'] }} remote-as {{ nei['remote_as'] }}
{% endfor %}
bgp_data:
IOS_XE_ruter_2:
as: 65500
networks:
- { address: 10.190.2.0, netmask: 255.255.255.0 }
- { address: 10.190.3.0, netmask: 255.255.255.0 }
neighbors:
- { address: 10.190.1.2, remote_as: 65500 }
IOS_XE_ruter_3:
as: 65500
networks:
- { address: 10.190.2.0, netmask: 255.255.255.0 }
- { address: 10.190.3.0, netmask: 255.255.255.0 }
neighbors:
- { address: 10.190.1.1, remote_as: 65500 }
---
- name: iBGP
hosts: IOS_XE_rutere
gather_facts: no
vars_files: vars/ibgp.yaml
tasks:
- name: iBGP
ios_config:
src: templates/ibgp.j2
ansible-playbook playbook_ibgp.yaml -k
SSH password:
PLAY [iBGP] *****************************************************************************************************************************************************************************
TASK [iBGP] *****************************************************************************************************************************************************************************
changed: [IOS_XE_ruter_3]
changed: [IOS_XE_ruter_2]
PLAY RECAP ******************************************************************************************************************************************************************************
IOS_XE_ruter_2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
IOS_XE_ruter_3 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansible -m ios_command -a "commands='show ip bgp summary'" IOS_XE_rutere -k
SSH password:
IOS_XE_ruter_3 | SUCCESS => {
"changed": false,
"stdout": [
"BGP router identifier 10.170.0.253, local AS number 65500
BGP table version is 1, main routing table version 1
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
10.190.1.1 4 65500 7 7 1 0 0 00:03:32 0"
],
"stdout_lines": [
[
"BGP router identifier 10.170.0.253, local AS number 65500",
"BGP table version is 1, main routing table version 1",
"",
"Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd",
"10.190.1.1 4 65500 7 7 1 0 0 00:03:32 0"
]
]
}
IOS_XE_ruter_2 | SUCCESS => {
"changed": false,
"stdout": [
"BGP router identifier 10.170.0.252, local AS number 65500
BGP table version is 1, main routing table version 1
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
10.190.1.2 4 65500 7 7 1 0 0 00:03:32 0"
],
"stdout_lines": [
[
"BGP router identifier 10.170.0.252, local AS number 65500",
"BGP table version is 1, main routing table version 1",
"",
"Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd",
"10.190.1.2 4 65500 7 7 1 0 0 00:03:32 0"
]
]
}