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