Creating Device configuration snippets [CREATED] h1: initial,routing [CREATED] h2: initial,routing [CREATED] h3: initial,routing [CREATED] h4: initial,routing [CREATED] l1: normalize,initial,vlan,ospf,bgp,vrf,vxlan,evpn [CREATED] l2: initial,vlan,ospf,bgp,vrf,vxlan,evpn [CREATED] spine: normalize,initial,vlan,ospf,bgp,vrf,vxlan,evpn Checking Are lab devices ready to be configured? [INFO] Checking SSH server(s) on l1,spine [SSH] SSH server on node l1 (device ioll2) is ready after 7.4 seconds [SSH] SSH server on node spine (device ioll2) is ready after 7.4 seconds Config Deploying device configurations [INFO] Executing initial configuration for node h1 (namespace clab- ml-17-h1) [INFO] Executing initial configuration for node h2 (namespace clab- ml-17-h2) [INFO] Executing initial configuration for node h3 (namespace clab- ml-17-h3) [INFO] Executing initial configuration for node h4 (namespace clab- ml-17-h4) [INFO] Executing initial configuration for node l2 [INFO] Executing routing configuration for node h1 (namespace clab- ml-17-h1) [INFO] Executing routing configuration for node h2 (namespace clab- ml-17-h2) [INFO] Executing routing configuration for node h3 (namespace clab- ml-17-h3) [INFO] Executing routing configuration for node h4 (namespace clab- ml-17-h4) [INFO] Executing vlan configuration for node l2 [INFO] Executing ospf configuration for node l2 [INFO] Executing bgp configuration for node l2 [INFO] Executing vrf configuration for node l2 [INFO] Executing vxlan configuration for node l2 [INFO] Executing evpn configuration for node l2 [INFO] Starting Ansible playbook to deploy the rest of the configurations [WARNING]: Found variable using reserved name: hosts PLAY [Deploy initial device configuration] ************************************* TASK [Set variables that cannot be set with VARS] ****************************** ok: [l1] ok: [spine] TASK [Normalize config on bridge-like devices] ********************************* included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, spine TASK [Figure out whether to deploy the module normalize on current device] ***** ok: [l1] ok: [spine] TASK [Find configuration template for normalize] ******************************* ok: [l1] ok: [spine] TASK [fail] ******************************************************************** skipping: [l1] skipping: [spine] TASK [Find configuration deployment deploy_script for normalize] *************** ok: [l1] ok: [spine] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => { "msg": "normalize configuration for l1\n=========================================\n!\ninterface Ethernet0/1\n shutdown\n!\ninterface Ethernet0/2\n shutdown\n!\ninterface Ethernet0/3\n shutdown\n" } ok: [spine] => { "msg": "normalize configuration for spine\n=========================================\n!\ninterface Ethernet0/1\n shutdown\n!\ninterface Ethernet0/2\n shutdown\n" } TASK [Deploy normalize configuration] ****************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/ios.yml for l1, spine TASK [ios_config: deploying normalize from /work/netlab_cicd/node_files/l1/normalize] *** [WARNING]: To ensure idempotency and correct diff the input configuration lines should be similar to how they appear if present in the running configuration on device including the indentation changed: [spine] changed: [l1] TASK [Deploy initial configuration] ******************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, spine TASK [Figure out whether to deploy the module initial on current device] ******* ok: [l1] ok: [spine] TASK [Find configuration template for initial] ********************************* ok: [l1] ok: [spine] TASK [fail] ******************************************************************** skipping: [l1] skipping: [spine] TASK [Find configuration deployment deploy_script for initial] ***************** ok: [l1] ok: [spine] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => { "msg": "initial configuration for l1\n=========================================\nhostname l1\n!\nno ip domain lookup\nlogging buffered 256000\n\n!\nlldp run\n!\nip host h1 172.16.0.1\nip host h2 172.16.0.2\nip host h3 172.16.1.3\nip host h4 172.16.1.4\nip host l2 10.0.0.6 10.1.0.5\nip host spine 10.0.0.7 10.1.0.2 10.1.0.6\nip host spine-customer 172.16.0.7 172.16.1.7\n!\nip routing\n!\nno ipv6 unicast-routing\n!\nvrf definition customer\n rd 65000:1\n route-target import 65000:1\n route-target export 65000:1\n!\n\n!\nvlan 1000\n name red\n!\nvlan 1001\n name blue\n!\n\n!\n!\ninterface Loopback0\n ip address 10.0.0.5 255.255.255.255\n!\ninterface Ethernet0/0\n no lldp transmit\n no lldp receive\n!\ninterface Ethernet0/1\n no switchport\n description l1 -> spine\n ip mtu 1500\n ip address 10.1.0.1 255.255.255.252\n mac-address caf0.0005.0001\n no shutdown\n!\ninterface Ethernet0/2\n no switchport\n description [Access VLAN red] l1 -> h1\n no shutdown\n!\ninterface Ethernet0/3\n no switchport\n description [Access VLAN blue] l1 -> h3\n no shutdown\n!\ninterface Vlan1000\n vrf forwarding customer\n description VLAN red (1000) -> [h1,h2,l2,spine] [external]\n mac-address caf4.0005.0000\n no shutdown\n!\ninterface Vlan1001\n vrf forwarding customer\n description VLAN blue (1001) -> [h3,h4,l2,spine] [external]\n mac-address caf4.0005.0001\n no shutdown\n!\n!\nline vty 0 4\n exec-timeout 0 0 \n!\nno banner exec\nno banner login\nno banner incoming\n" } ok: [spine] => { "msg": "initial configuration for spine\n=========================================\nhostname spine\n!\nno ip domain lookup\nlogging buffered 256000\n\n!\nlldp run\n!\nip host h1 172.16.0.1\nip host h2 172.16.0.2\nip host h3 172.16.1.3\nip host h4 172.16.1.4\nip host l1 10.0.0.5 10.1.0.1\nip host l2 10.0.0.6 10.1.0.5\nip host spine-customer 172.16.0.7 172.16.1.7\n!\nip routing\n!\nno ipv6 unicast-routing\n!\nvrf definition customer\n rd 65000:1\n route-target import 65000:1\n route-target export 65000:1\n!\n address-family ipv4\n exit-address-family\n!\n\n!\nvlan 1000\n name red\n!\nvlan 1001\n name blue\n!\n\n!\n!\ninterface Loopback0\n ip address 10.0.0.7 255.255.255.255\n!\ninterface Ethernet0/0\n no lldp transmit\n no lldp receive\n!\ninterface Ethernet0/1\n no switchport\n description spine -> l1\n ip mtu 1500\n ip address 10.1.0.2 255.255.255.252\n mac-address caf0.0007.0001\n no shutdown\n!\ninterface Ethernet0/2\n no switchport\n description spine -> l2\n ip mtu 1500\n ip address 10.1.0.6 255.255.255.252\n mac-address caf0.0007.0002\n no shutdown\n!\ninterface Vlan1000\n vrf forwarding customer\n description VLAN red (1000) -> [h1,l1,h2,l2] [external]\n ip mtu 1500\n ip address 172.16.0.7 255.255.255.0\n mac-address caf4.0007.0000\n no shutdown\n!\ninterface Vlan1001\n vrf forwarding customer\n description VLAN blue (1001) -> [h3,l1,h4,l2] [external]\n ip mtu 1500\n ip address 172.16.1.7 255.255.255.0\n mac-address caf4.0007.0001\n no shutdown\n!\n!\nline vty 0 4\n exec-timeout 0 0 \n!\nno banner exec\nno banner login\nno banner incoming\n" } TASK [Deploy initial configuration] ******************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/ios.yml for l1, spine TASK [ios_config: deploying initial from /work/netlab_cicd/node_files/l1/initial] *** changed: [l1] changed: [spine] PLAY [Deploy module-specific configurations] *********************************** TASK [Set variables that cannot be set with VARS] ****************************** ok: [l1] ok: [spine] TASK [Deploy individual configuration modules] ********************************* included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, spine => (item=vlan) included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, spine => (item=routing) included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, spine => (item=ospf) included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, spine => (item=bgp) included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, spine => (item=vrf) included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, spine => (item=vxlan) included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, spine => (item=evpn) TASK [Figure out whether to deploy the module vlan on current device] ********** ok: [l1] ok: [spine] TASK [Find configuration template for vlan] ************************************ ok: [l1] ok: [spine] TASK [fail] ******************************************************************** skipping: [l1] skipping: [spine] TASK [Find configuration deployment deploy_script for vlan] ******************** ok: [l1] ok: [spine] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => { "msg": "vlan configuration for l1\n=========================================\nvlan 1000\n name red\n!\nvlan 1001\n name blue\n!\n\n!\ninterface Ethernet0/2\n\n switchport\n switchport access vlan 1000\n\n!\ninterface Ethernet0/3\n\n switchport\n switchport access vlan 1001\n\n" } ok: [spine] => { "msg": "vlan configuration for spine\n=========================================\nvlan 1000\n name red\n!\nvlan 1001\n name blue\n!\n\n" } TASK [Deploy vlan configuration] *********************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/ios.yml for l1, spine TASK [ios_config: deploying vlan from /work/netlab_cicd/node_files/l1/vlan] **** changed: [spine] changed: [l1] TASK [Figure out whether to deploy the module routing on current device] ******* ok: [l1] ok: [spine] TASK [Find configuration template for routing] ********************************* skipping: [l1] skipping: [spine] TASK [fail] ******************************************************************** skipping: [l1] skipping: [spine] TASK [Find configuration deployment deploy_script for routing] ***************** skipping: [l1] skipping: [spine] TASK [Print deployed configuration when running in verbose mode] *************** skipping: [l1] skipping: [spine] TASK [Deploy routing configuration] ******************************************** skipping: [l1] skipping: [spine] TASK [Figure out whether to deploy the module ospf on current device] ********** ok: [l1] ok: [spine] TASK [Find configuration template for ospf] ************************************ ok: [l1] ok: [spine] TASK [fail] ******************************************************************** skipping: [l1] skipping: [spine] TASK [Find configuration deployment deploy_script for ospf] ******************** ok: [l1] ok: [spine] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => { "msg": "ospf configuration for l1\n=========================================\nrouter ospf 1\n router-id 10.0.0.5\n\n!\ninterface Loopback0\n! \n ip ospf 1 area 0.0.0.0\n!\ninterface Ethernet0/1\n! l1 -> spine\n ip ospf 1 area 0.0.0.0\n ip ospf network point-to-point\n!\n\n" } ok: [spine] => { "msg": "ospf configuration for spine\n=========================================\nrouter ospf 1\n router-id 10.0.0.7\n\n!\ninterface Loopback0\n! \n ip ospf 1 area 0.0.0.0\n!\ninterface Ethernet0/1\n! spine -> l1\n ip ospf 1 area 0.0.0.0\n ip ospf network point-to-point\n!\ninterface Ethernet0/2\n! spine -> l2\n ip ospf 1 area 0.0.0.0\n ip ospf network point-to-point\n!\n\n" } TASK [Deploy ospf configuration] *********************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/ios.yml for l1, spine TASK [ios_config: deploying ospf from /work/netlab_cicd/node_files/l1/ospf] **** changed: [l1] changed: [spine] TASK [Figure out whether to deploy the module bgp on current device] *********** ok: [l1] ok: [spine] TASK [Find configuration template for bgp] ************************************* ok: [l1] ok: [spine] TASK [fail] ******************************************************************** skipping: [l1] skipping: [spine] TASK [Find configuration deployment deploy_script for bgp] ********************* ok: [l1] ok: [spine] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => { "msg": "bgp configuration for l1\n=========================================\n!\nip bgp-community new-format\n!\nrouter bgp 65000\n no bgp default ipv4-unicast\n bgp update-delay 5\n bgp nopeerup-delay cold-boot 1\n bgp nopeerup-delay user-initiated 1\n bgp router-id 10.0.0.5\n neighbor 10.0.0.7 remote-as 65000\n neighbor 10.0.0.7 description spine\n neighbor 10.0.0.7 update-source Loopback0\n\n!\n address-family ipv4\n bgp scan-time 5\n!\n!\n! Originate networks from connected subnets\n!\n network 10.0.0.5 mask 255.255.255.255\n\n!\n neighbor 10.0.0.7 activate\n neighbor 10.0.0.7 advertisement-interval 0\n neighbor 10.0.0.7 next-hop-self\n neighbor 10.0.0.7 send-community both\n\n!\n" } ok: [spine] => { "msg": "bgp configuration for spine\n=========================================\n!\nip bgp-community new-format\n!\nrouter bgp 65000\n no bgp default ipv4-unicast\n bgp update-delay 5\n bgp nopeerup-delay cold-boot 1\n bgp nopeerup-delay user-initiated 1\n bgp router-id 10.0.0.7\n bgp cluster-id 10.0.0.7\n neighbor 10.0.0.5 remote-as 65000\n neighbor 10.0.0.5 description l1\n neighbor 10.0.0.5 update-source Loopback0\n\n neighbor 10.0.0.6 remote-as 65000\n neighbor 10.0.0.6 description l2\n neighbor 10.0.0.6 update-source Loopback0\n\n!\n address-family ipv4\n bgp scan-time 5\n!\n!\n! Originate networks from connected subnets\n!\n network 10.0.0.7 mask 255.255.255.255\n\n!\n neighbor 10.0.0.5 activate\n neighbor 10.0.0.5 advertisement-interval 0\n neighbor 10.0.0.5 next-hop-self\n neighbor 10.0.0.5 route-reflector-client\n neighbor 10.0.0.5 send-community both\n\n neighbor 10.0.0.6 activate\n neighbor 10.0.0.6 advertisement-interval 0\n neighbor 10.0.0.6 next-hop-self\n neighbor 10.0.0.6 route-reflector-client\n neighbor 10.0.0.6 send-community both\n\n!\n" } TASK [Deploy bgp configuration] ************************************************ included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/ios.yml for l1, spine TASK [ios_config: deploying bgp from /work/netlab_cicd/node_files/l1/bgp] ****** changed: [l1] changed: [spine] TASK [Figure out whether to deploy the module vrf on current device] *********** ok: [l1] ok: [spine] TASK [Find configuration template for vrf] ************************************* ok: [l1] ok: [spine] TASK [fail] ******************************************************************** skipping: [l1] skipping: [spine] TASK [Find configuration deployment deploy_script for vrf] ********************* ok: [l1] ok: [spine] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => { "msg": "vrf configuration for l1\n=========================================\n!\nrouter bgp 65000\n!\nexit\n!\n!\n!\n" } ok: [spine] => { "msg": "vrf configuration for spine\n=========================================\n!\nrouter bgp 65000\n!\n address-family ipv4 vrf customer\n bgp router-id 10.0.0.7\n redistribute connected\n\n!\n!\n exit-address-family\n!\nexit\n!\n!\n!\n" } TASK [Deploy vrf configuration] ************************************************ included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/ios.yml for l1, spine TASK [ios_config: deploying vrf from /work/netlab_cicd/node_files/l1/vrf] ****** changed: [l1] changed: [spine] TASK [Figure out whether to deploy the module vxlan on current device] ********* ok: [l1] ok: [spine] TASK [Find configuration template for vxlan] *********************************** ok: [l1] ok: [spine] TASK [fail] ******************************************************************** skipping: [l1] skipping: [spine] TASK [Find configuration deployment deploy_script for vxlan] ******************* ok: [l1] ok: [spine] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => { "msg": "vxlan configuration for l1\n=========================================\ninterface nve1\n no shutdown\n source-interface Loopback0\n host-reachability protocol bgp\n member vni 6000 ingress-replication\n member vni 6001 ingress-replication\n" } ok: [spine] => { "msg": "vxlan configuration for spine\n=========================================\ninterface nve1\n no shutdown\n source-interface Loopback0\n host-reachability protocol bgp\n member vni 6000 ingress-replication\n member vni 6001 ingress-replication\n" } TASK [Deploy vxlan configuration] ********************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/ios.yml for l1, spine TASK [ios_config: deploying vxlan from /work/netlab_cicd/node_files/l1/vxlan] *** changed: [spine] changed: [l1] TASK [Figure out whether to deploy the module evpn on current device] ********** ok: [l1] ok: [spine] TASK [Find configuration template for evpn] ************************************ ok: [spine] ok: [l1] TASK [fail] ******************************************************************** skipping: [l1] skipping: [spine] TASK [Find configuration deployment deploy_script for evpn] ******************** ok: [l1] ok: [spine] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => { "msg": "evpn configuration for l1\n=========================================\n! \nvlan configuration 1000\n member evpn-instance 1000 vni 6000\n! \nvlan configuration 1001\n member evpn-instance 1001 vni 6001\n!\nl2vpn evpn instance 1000 vlan-based\n encapsulation vxlan\n replication-type ingress\n rd 10.0.0.5:1000\n route-target import 65000:1000\n route-target export 65000:1000\n!\nl2vpn evpn instance 1001 vlan-based\n encapsulation vxlan\n replication-type ingress\n rd 10.0.0.5:1001\n route-target import 65000:1001\n route-target export 65000:1001\n!\n!\nrouter bgp 65000\n address-family l2vpn evpn\n neighbor 10.0.0.7 encap vxlan\n neighbor 10.0.0.7 activate\n neighbor 10.0.0.7 send-community both\n" } ok: [spine] => { "msg": "evpn configuration for spine\n=========================================\n! \nvlan configuration 1000\n member evpn-instance 1000 vni 6000\n!\ninterface Vlan1000\n no autostate\n! \nvlan configuration 1001\n member evpn-instance 1001 vni 6001\n!\ninterface Vlan1001\n no autostate\n!\nl2vpn evpn instance 1000 vlan-based\n encapsulation vxlan\n replication-type ingress\n rd 10.0.0.7:1000\n route-target import 65000:1000\n route-target export 65000:1000\n!\nl2vpn evpn instance 1001 vlan-based\n encapsulation vxlan\n replication-type ingress\n rd 10.0.0.7:1001\n route-target import 65000:1001\n route-target export 65000:1001\n!\n!\nrouter bgp 65000\n address-family l2vpn evpn\n neighbor 10.0.0.5 encap vxlan\n neighbor 10.0.0.5 activate\n neighbor 10.0.0.5 send-community both\n neighbor 10.0.0.5 route-reflector-client\n neighbor 10.0.0.6 encap vxlan\n neighbor 10.0.0.6 activate\n neighbor 10.0.0.6 send-community both\n neighbor 10.0.0.6 route-reflector-client\n" } TASK [Deploy evpn configuration] *********************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/ios.yml for l1, spine TASK [ios_config: deploying evpn from /work/netlab_cicd/node_files/l1/evpn] **** changed: [l1] changed: [spine] PLAY [Deploy custom deployment templates] ************************************** skipping: no hosts matched PLAY RECAP ********************************************************************* l1 : ok=60 changed=8 unreachable=0 failed=0 skipped=13 rescued=0 ignored=0 spine : ok=60 changed=8 unreachable=0 failed=0 skipped=13 rescued=0 ignored=0 Results of configuration script deployments ================================================================================ h1 Script: initial,routing h2 Script: initial,routing h3 Script: initial,routing h4 Script: initial,routing l2 Script: initial,vlan,ospf,bgp,vrf,vxlan,evpn The devices under test are a layer-2 leaf and a spine performing centralized routing. All hosts should be able to ping each other and all switch loopback IPs Please note it might take a while for the lab to work due to STP learning phase.