[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details [WARNING]: Could not match supplied host pattern, ignoring: unprovisioned [WARNING]: Found variable using reserved name: hosts PLAY [Deploy initial device configuration] ************************************* TASK [Set variables that cannot be set with VARS] ****************************** ok: [spine] ok: [l2] ok: [l1] ok: [h1] ok: [h2] TASK [Find device readiness script] ******************************************** ok: [l2] ok: [spine] ok: [h1] ok: [l1] ok: [h2] TASK [Wait for device to become ready] ***************************************** skipping: [l2] skipping: [h1] skipping: [h2] included: /home/pipi/netlab_gh/netsim/ansible/tasks/readiness-check/vjunos-switch-clab.yml for spine, l1 TASK [Wait for SSH server] ***************************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/readiness-check/vm-clab-ssh-check.yml for spine, l1 TASK [Check if 'sshpass' is installed] ***************************************** ok: [spine -> localhost] TASK [Check for 'timeout' command] ********************************************* ok: [spine -> localhost] ok: [l1 -> localhost] TASK [Execute local ssh command to check vjunos-switch readiness] ************** FAILED - RETRYING: [spine -> localhost]: Execute local ssh command to check vjunos-switch readiness (40 retries left). FAILED - RETRYING: [l1 -> localhost]: Execute local ssh command to check vjunos-switch readiness (40 retries left). FAILED - RETRYING: [spine -> localhost]: Execute local ssh command to check vjunos-switch readiness (39 retries left). FAILED - RETRYING: [l1 -> localhost]: Execute local ssh command to check vjunos-switch readiness (39 retries left). FAILED - RETRYING: [spine -> localhost]: Execute local ssh command to check vjunos-switch readiness (38 retries left). FAILED - RETRYING: [l1 -> localhost]: Execute local ssh command to check vjunos-switch readiness (38 retries left). FAILED - RETRYING: [spine -> localhost]: Execute local ssh command to check vjunos-switch readiness (37 retries left). FAILED - RETRYING: [l1 -> localhost]: Execute local ssh command to check vjunos-switch readiness (37 retries left). FAILED - RETRYING: [spine -> localhost]: Execute local ssh command to check vjunos-switch readiness (36 retries left). ok: [l1 -> localhost] ok: [spine -> localhost] TASK [Confirm spine SSH server works] ****************************************** ok: [spine] => msg: Node spine is ready. ok: [l1] => msg: Node l1 is ready. TASK [Wait for ge-0/0/0 interface] ********************************************* included: /home/pipi/netlab_gh/netsim/ansible/tasks/readiness-check/vjunos-switch.yml for spine, l1 TASK [Wait for ge-0/0/0 to appear] ********************************************* ok: [l1] ok: [spine] TASK [Normalize config on bridge-like devices] ********************************* included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for spine, l1, l2, h1, h2 TASK [Figure out whether to deploy the module normalize on current device] ***** ok: [l2] ok: [h1] ok: [h2] ok: [spine] ok: [l1] TASK [Find configuration template for normalize] ******************************* ok: [l2] ok: [h1] ok: [h2] ok: [spine] ok: [l1] TASK [fail] ******************************************************************** skipping: [spine] skipping: [l1] skipping: [l2] skipping: [h1] skipping: [h2] TASK [Find configuration deployment deploy_script for normalize] *************** ok: [l2] ok: [h1] ok: [h2] ok: [spine] ok: [l1] TASK [Print deployed configuration when running in verbose mode] *************** skipping: [spine] skipping: [l1] skipping: [l2] skipping: [h1] skipping: [h2] TASK [Deploy normalize configuration] ****************************************** skipping: [spine] skipping: [l1] skipping: [l2] skipping: [h1] skipping: [h2] TASK [Deploy initial configuration] ******************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for spine, l1, l2, h1, h2 TASK [Figure out whether to deploy the module initial on current device] ******* ok: [l2] ok: [h1] ok: [h2] ok: [spine] ok: [l1] TASK [Find configuration template for initial] ********************************* ok: [l2] ok: [h1] ok: [h2] ok: [spine] ok: [l1] TASK [fail] ******************************************************************** skipping: [spine] skipping: [l1] skipping: [l2] skipping: [h1] skipping: [h2] TASK [Find configuration deployment deploy_script for initial] ***************** ok: [l2] ok: [h1] ok: [h2] ok: [spine] ok: [l1] TASK [Print deployed configuration when running in verbose mode] *************** ok: [h1] => msg: |- initial configuration for h1 ========================================= #!/bin/bash # # This script contains the 'ip' commands needed to set up container # interfaces and route table. It's executed within the container # network namespace on the container host. # # /etc/hosts file is generated as a clab bind. # set -e ### One-Shot configuration (non-Ubuntu VM or container) # # Disable IPv4 and IPv6 forwarding # sysctl -w net.ipv4.ip_forward=0 sysctl -w net.ipv6.conf.all.forwarding=0 # # Interface addressing, create any bond devices # ip link set dev eth1 up set +e ip addr del 172.31.1.4/24 dev eth1 2>/dev/null set -e ip addr add 172.31.1.4/24 dev eth1 ip link set dev eth1 mtu 1500 # # Add static routes (usually IPv4 routes pointing to the first usable gateway) # # # # # Print the final routing table ip route ok: [h2] => msg: |- initial configuration for h2 ========================================= #!/bin/bash # # This script contains the 'ip' commands needed to set up container # interfaces and route table. It's executed within the container # network namespace on the container host. # # /etc/hosts file is generated as a clab bind. # set -e ### One-Shot configuration (non-Ubuntu VM or container) # # Disable IPv4 and IPv6 forwarding # sysctl -w net.ipv4.ip_forward=0 sysctl -w net.ipv6.conf.all.forwarding=0 # # Interface addressing, create any bond devices # ip link set dev eth1 up set +e ip addr del 172.31.1.5/24 dev eth1 2>/dev/null set -e ip addr add 172.31.1.5/24 dev eth1 ip link set dev eth1 mtu 1500 # # Add static routes (usually IPv4 routes pointing to the first usable gateway) # # # # # Print the final routing table ip route ok: [spine] => msg: |- initial configuration for spine ========================================= system { host-name spine; static-host-mapping { l1 inet 10.0.0.2; l2 inet 10.0.0.3; h1 inet 172.31.1.4; h2 inet 172.31.1.5; } } interfaces { ge-0/0/0 { mtu 1614; } ge-0/0/1 { mtu 1614; } lo0.0 { family inet { address 10.0.0.1/32; } } ge-0/0/0.0 { description "spine -> l1 [external]"; family inet { address 10.1.0.2/30; } } ge-0/0/1.0 { description "spine -> l2 [external]"; family inet { address 10.1.0.6/30; } } } protocols { lldp { interface fxp0 { disable; } interface all; } } ok: [l2] => msg: |- initial configuration for l2 ========================================= #!/bin/bash # set -e set -x # # Create bash profile script # cat <<SCRIPT >/root/.bash_profile #!/bin/bash # export PS1="\h(bash)# " echo echo "Use vtysh to connect to FRR daemon" echo SCRIPT # # Get the current next hop for the default route # def_nh=$(ip route list default|awk '{ print $3 }') # # Create the management VRF and add eth0 to it # if [ ! -e /sys/devices/virtual/net/mgmt ]; then ip link add mgmt type vrf table 42 fi ip link set mgmt up sysctl -qw net.ipv6.conf.eth0.keep_addr_on_down=1 ip link set eth0 master mgmt # # Reinstall the default route if we had it before # if [[ -n "$def_nh" ]]; then ip route add 0.0.0.0/0 vrf mgmt via $def_nh fi # # Enable FRR modules (if not using containerlab bind-mounted /etc/frr/daemons) # # # Create loopbacks, stub and lag/bond devices # if [ ! -e /sys/class/net/lo ]; then if [ ! -e /sys/devices/virtual/net/lo ]; then ip link add lo type dummy ip link set dev lo up fi fi # Disable IPv6 (for IPv4-only interfaces) or SLAAC (if the device is a router) # sysctl -qw net.ipv6.conf.eth1.disable_ipv6=1 ip link set dev eth1 mtu 1600 sysctl -qw net.ipv6.conf.eth2.disable_ipv6=1 ip link set dev eth2 mtu 1500 # # Add vtysh.conf file echo "service integrated-vtysh-config" >/etc/frr/vtysh.conf # # Rest of initial configuration done through VTYSH # cat >/tmp/config <<CONFIG hostname l2 ! vrf mgmt exit-vrf ! frr defaults datacenter ! interface lo no shutdown ip address 10.0.0.3/32 ! interface eth1 no shutdown description l2 -> spine [external] ip address 10.1.0.5/30 ! interface eth2 no shutdown description [Access VLAN red] l2 -> h2 ! no ip address ! interface vlan1000 no shutdown description VLAN red (1000) -> [h1,l1,h2] ! no ip address ! do write CONFIG vtysh -f /tmp/config exit 0 ok: [l1] => msg: |- initial configuration for l1 ========================================= system { host-name l1; static-host-mapping { spine inet 10.0.0.1; l2 inet 10.0.0.3; h1 inet 172.31.1.4; h2 inet 172.31.1.5; } } interfaces { } interfaces { ge-0/0/0 { mtu 1614; } ge-0/0/1 { mtu 1514; } lo0.0 { family inet { address 10.0.0.2/32; } } ge-0/0/0.0 { description "l1 -> spine [external]"; family inet { address 10.1.0.1/30; } } ge-0/0/1.0 { description "[Access VLAN red] l1 -> h1"; } irb.1000 { description "VLAN red (1000) -> [h1,h2,l2]"; } } protocols { lldp { interface fxp0 { disable; } interface all; } } TASK [Deploy initial configuration] ******************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/junos.yml for spine, l1 included: /home/pipi/netlab_gh/netsim/ansible/tasks/frr/initial-clab.yml for l2 included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/linux-clab.yml for h1, h2 TASK [junos_config: deploying initial from /home/pipi/netlab_gh/netsim/ansible/templates/initial/junos.j2] *** [WARNING]: mgd: statement has no contents; ignored changed: [l1] changed: [spine] TASK [Attempt to load VRF kernel module] *************************************** changed: [l2 -> localhost] TASK [Disable FRR management VRF when modprobe fails] ************************** skipping: [l2] TASK [include_tasks] *********************************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/frr/deploy-config.yml for l2 TASK [template] **************************************************************** changed: [l2] TASK [set_fact] **************************************************************** ok: [l2] TASK [run /tmp/config.sh to deploy initial config from /home/pipi/netlab_gh/netsim/ansible/templates/initial/frr.j2] *** changed: [l2] TASK [run vtysh to import initial config from /home/pipi/netlab_gh/netsim/ansible/templates/initial/frr.j2] *** skipping: [l2] TASK [Define script filename and determine whether to execute in netns] ******** ok: [h1] ok: [h2] TASK [Create a temporary file for the rendered script] ************************* changed: [h1 -> localhost] changed: [h2 -> localhost] TASK [Create container setup script from /home/pipi/netlab_gh/netsim/ansible/templates/initial/linux-clab.j2] *** changed: [h2 -> localhost] changed: [h1 -> localhost] TASK [Copy script into running container at /tmp/config-h1_initial.sh] ********* skipping: [h1] skipping: [h2] TASK [Execute /tmp/config-h1_initial.sh to deploy initial config based on /home/pipi/netlab_gh/netsim/ansible/templates/initial/linux-clab.j2] *** skipping: [h1] skipping: [h2] TASK [Container configuration for initial based on /home/pipi/netlab_gh/netsim/ansible/templates/initial/linux-clab.j2 executed in netns] *** changed: [h1 -> localhost] changed: [h2 -> localhost] TASK [Remove temporary file /tmp/h1_initial-v1nu7olm.sh] *********************** changed: [h1 -> localhost] changed: [h2 -> localhost] PLAY [Deploy module-specific configurations] *********************************** TASK [Set variables that cannot be set with VARS] ****************************** ok: [l2] ok: [l1] ok: [spine] TASK [Deploy individual configuration modules] ********************************* included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, l2, spine => (item=vlan) included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, l2, spine => (item=bgp) included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, l2, spine => (item=vxlan) included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-module.yml for l1, l2, spine => (item=evpn) TASK [Figure out whether to deploy the module vlan on current device] ********** ok: [l2] ok: [l1] ok: [spine] TASK [Find configuration template for vlan] ************************************ skipping: [spine] ok: [l2] ok: [l1] TASK [fail] ******************************************************************** skipping: [l1] skipping: [l2] skipping: [spine] TASK [Find configuration deployment deploy_script for vlan] ******************** skipping: [spine] ok: [l2] ok: [l1] TASK [Print deployed configuration when running in verbose mode] *************** skipping: [spine] ok: [l1] => msg: |- vlan configuration for l1 ========================================= vlans { red { vlan-id 1000; } } interfaces { ge-0/0/1.0 { family ethernet-switching { vlan { members red; } } } } ok: [l2] => msg: |- vlan configuration for l2 ========================================= #!/bin/bash # set -e # Exit immediately when any command fails # if [ ! -e /sys/devices/virtual/net/vlan1000 ]; then brctl addbr vlan1000 ip link set dev vlan1000 address 52:dc:ca:fd:03:00 ip addr flush dev vlan1000 fi brctl addif vlan1000 eth2 ip link set dev vlan1000 up exit 0 TASK [Deploy vlan configuration] *********************************************** skipping: [spine] included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/junos.yml for l1 included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/frr.yml for l2 TASK [junos_config: deploying vlan from /home/pipi/netlab_gh/netsim/ansible/templates/vlan/vjunos-switch.j2] *** changed: [l1] TASK [template] **************************************************************** changed: [l2] TASK [set_fact] **************************************************************** ok: [l2] TASK [run /tmp/config.sh to deploy vlan config from /home/pipi/netlab_gh/netsim/ansible/templates/vlan/frr.j2] *** changed: [l2] TASK [run vtysh to import vlan config from /home/pipi/netlab_gh/netsim/ansible/templates/vlan/frr.j2] *** skipping: [l2] TASK [Figure out whether to deploy the module bgp on current device] *********** ok: [l2] ok: [l1] ok: [spine] TASK [Find configuration template for bgp] ************************************* ok: [l2] ok: [spine] ok: [l1] TASK [fail] ******************************************************************** skipping: [l1] skipping: [l2] skipping: [spine] TASK [Find configuration deployment deploy_script for bgp] ********************* ok: [l2] ok: [spine] ok: [l1] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => msg: |- bgp configuration for l1 ========================================= routing-options { autonomous-system 65200; router-id 10.0.0.2 } policy-options { delete: policy-statement ibgp-export; delete: policy-statement ebgp-export; } policy-options { policy-statement ibgp-export { term advertise { from { protocol direct; interface [ lo0.0 ]; } then accept; } term next-hop-self { from { route-type external; } then { next-hop self; } } } policy-statement ebgp-export { term advertise { from { protocol direct; interface [ lo0.0 ]; } then accept; } } } protocols { delete: bgp; } protocols { bgp { group ibgp-peers-ipv4 { type internal; export ibgp-export; advertise-inactive; local-address 10.0.0.2; } group ebgp-peers { export ebgp-export; advertise-inactive; neighbor 10.1.0.2 { peer-as 65100; description spine; family inet { unicast; } } neighbor 10.0.0.1 { peer-as 65100; description spine; } } } } ok: [l2] => msg: |- bgp configuration for l2 ========================================= ! router bgp 65201 no bgp ebgp-requires-policy no bgp default ipv4-unicast bgp default show-hostname bgp default show-nexthop-hostname ! Consider AS paths of same length but with different AS as ECMP candidates bgp bestpath as-path multipath-relax bgp router-id 10.0.0.3 ! neighbor 10.1.0.6 remote-as 65100 neighbor 10.1.0.6 description spine ! neighbor 10.0.0.1 remote-as 65100 neighbor 10.0.0.1 description spine neighbor 10.0.0.1 update-source lo ! address-family ipv4 unicast ! ! network 10.0.0.3/32 ! ! ! neighbor 10.1.0.6 activate no neighbor 10.1.0.6 send-community all neighbor 10.1.0.6 send-community standard neighbor 10.1.0.6 send-community large neighbor 10.1.0.6 send-community extended ! ! ! do write ok: [spine] => msg: |- bgp configuration for spine ========================================= routing-options { autonomous-system 65100; router-id 10.0.0.1 } policy-options { delete: policy-statement ibgp-export; delete: policy-statement ebgp-export; } policy-options { policy-statement ibgp-export { term advertise { from { protocol direct; interface [ lo0.0 ]; } then accept; } term next-hop-self { from { route-type external; } then { next-hop self; } } } policy-statement ebgp-export { term advertise { from { protocol direct; interface [ lo0.0 ]; } then accept; } } } protocols { delete: bgp; } protocols { bgp { group ibgp-peers-ipv4 { type internal; export ibgp-export; advertise-inactive; local-address 10.0.0.1; } group ebgp-peers { export ebgp-export; advertise-inactive; neighbor 10.1.0.1 { peer-as 65200; description l1; family inet { unicast; } } neighbor 10.1.0.5 { peer-as 65201; description l2; family inet { unicast; } } neighbor 10.0.0.2 { peer-as 65200; description l1; } neighbor 10.0.0.3 { peer-as 65201; description l2; } } } } TASK [Deploy bgp configuration] ************************************************ included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/junos.yml for l1, spine included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/frr.yml for l2 TASK [junos_config: deploying bgp from /home/pipi/netlab_gh/netsim/ansible/templates/bgp/junos.j2] *** [WARNING]: statement not found changed: [l1] changed: [spine] TASK [template] **************************************************************** changed: [l2] TASK [set_fact] **************************************************************** ok: [l2] TASK [run /tmp/config.sh to deploy bgp config from /home/pipi/netlab_gh/netsim/ansible/templates/bgp/frr.j2] *** skipping: [l2] TASK [run vtysh to import bgp config from /home/pipi/netlab_gh/netsim/ansible/templates/bgp/frr.j2] *** changed: [l2] TASK [Figure out whether to deploy the module vxlan on current device] ********* ok: [l2] ok: [spine] ok: [l1] TASK [Find configuration template for vxlan] *********************************** skipping: [spine] ok: [l2] ok: [l1] TASK [fail] ******************************************************************** skipping: [l1] skipping: [l2] skipping: [spine] TASK [Find configuration deployment deploy_script for vxlan] ******************* skipping: [spine] ok: [l2] ok: [l1] TASK [Print deployed configuration when running in verbose mode] *************** skipping: [spine] ok: [l1] => msg: |- vxlan configuration for l1 ========================================= policy-options { policy-statement ecmp { then { load-balance per-flow; } } } routing-options { forwarding-table { export ecmp; } } switch-options { vtep-source-interface lo0.0; } vlans { red { vxlan { vni 1000; } } } switch-options { route-distinguisher 10.0.0.2:65535; vrf-target target:65200:65535; } protocols evpn encapsulation vxlan; ok: [l2] => msg: |- vxlan configuration for l2 ========================================= #!/bin/bash # set -e # Exit immediately when any command fails # # Create L3 VNIs with bridges and add to correct vrf table # Create VXLAN L2 interface per vni ip link add vxlan1000 type vxlan \ id 1000 \ dstport 4789 \ local 10.0.0.3 nolearning # # Add it to the VLAN bridge (create if needed for l3 vnis); disable STP if [ ! -e /sys/devices/virtual/net/vlan1000 ]; then brctl addbr vlan1000 ip link set up dev vlan1000 fi brctl addif vlan1000 vxlan1000 brctl stp vlan1000 off # Do not generate ipv6 link-local address for VXLAN devices ip link set mtu 1500 addrgenmode none dev vxlan1000 # Disable dynamic MAC learning for evpn, see https://docs.frrouting.org/en/latest/evpn.html bridge link set dev vxlan1000 learning off ip link set up dev vxlan1000 exit $? TASK [Deploy vxlan configuration] ********************************************** skipping: [spine] included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/junos.yml for l1 included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/frr.yml for l2 TASK [junos_config: deploying vxlan from /home/pipi/netlab_gh/netsim/ansible/templates/vxlan/vjunos-switch.j2] *** changed: [l1] TASK [template] **************************************************************** changed: [l2] TASK [set_fact] **************************************************************** ok: [l2] TASK [run /tmp/config.sh to deploy vxlan config from /home/pipi/netlab_gh/netsim/ansible/templates/vxlan/frr.j2] *** changed: [l2] TASK [run vtysh to import vxlan config from /home/pipi/netlab_gh/netsim/ansible/templates/vxlan/frr.j2] *** skipping: [l2] TASK [Figure out whether to deploy the module evpn on current device] ********** ok: [l2] ok: [l1] ok: [spine] TASK [Find configuration template for evpn] ************************************ ok: [l2] ok: [spine] ok: [l1] TASK [fail] ******************************************************************** skipping: [l1] skipping: [l2] skipping: [spine] TASK [Find configuration deployment deploy_script for evpn] ******************** ok: [l2] ok: [l1] ok: [spine] TASK [Print deployed configuration when running in verbose mode] *************** ok: [l1] => msg: |- evpn configuration for l1 ========================================= protocols { bgp { group ibgp-peers-ipv4 { } group ebgp-peers { neighbor 10.0.0.1 { accept-remote-nexthop; multihop no-nexthop-change; family evpn { signaling; } } } } } protocols { evpn { encapsulation vxlan; default-gateway no-gateway-community; extended-vni-list all; vni-options { vni 1000 { vrf-target target:65000:1000; } } } } ok: [l2] => msg: |- evpn configuration for l2 ========================================= #!/bin/bash # set -e cat >/tmp/evpn_config <<CONFIG router bgp 65201 address-family l2vpn evpn advertise-all-vni advertise-svi-ip advertise ipv4 unicast ! Configure explicit Route Targets and RD per L2 VNI; auto-derived differs vni 1000 rd 10.0.0.3:1000 route-target export 65000:1000 route-target import 65000:1000 exit-vni neighbor 10.0.0.1 activate neighbor 10.0.0.1 soft-reconfiguration inbound exit-address-family ! exit ! L3 VRF EVPN handling ! do write CONFIG vtysh -f /tmp/evpn_config vtysh -c 'clear bgp *' ok: [spine] => msg: |- evpn configuration for spine ========================================= protocols { bgp { group ibgp-peers-ipv4 { } group ebgp-peers { neighbor 10.0.0.2 { accept-remote-nexthop; multihop no-nexthop-change; family evpn { signaling; } } neighbor 10.0.0.3 { accept-remote-nexthop; multihop no-nexthop-change; family evpn { signaling; } } } } } TASK [Deploy evpn configuration] *********************************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/junos.yml for l1, spine included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/frr.yml for l2 TASK [junos_config: deploying evpn from /home/pipi/netlab_gh/netsim/ansible/templates/evpn/vjunos-switch.j2] *** changed: [spine] changed: [l1] TASK [template] **************************************************************** changed: [l2] TASK [set_fact] **************************************************************** ok: [l2] TASK [run /tmp/config.sh to deploy evpn config from /home/pipi/netlab_gh/netsim/ansible/templates/evpn/frr.j2] *** changed: [l2] TASK [run vtysh to import evpn config from /home/pipi/netlab_gh/netsim/ansible/templates/evpn/frr.j2] *** skipping: [l2] PLAY [Deploy custom deployment templates] ************************************** TASK [Run custom configuration deployment scripts] ***************************** included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-custom-config.yml for l1, l2, spine => (item=ebgp.multihop) TASK [Find configuration template] ********************************************* ok: [l2] ok: [spine] ok: [l1] TASK [fail] ******************************************************************** skipping: [l1] skipping: [l2] skipping: [spine] TASK [Check is the configuration template is a file] *************************** ok: [l1 -> localhost] ok: [spine -> localhost] ok: [l2 -> localhost] TASK [fail] ******************************************************************** skipping: [l1] skipping: [l2] skipping: [spine] TASK [Process template /home/pipi/netlab_gh/netsim/extra/ebgp.multihop/junos.j2 for l1] *** skipping: [l2] skipping: [l1] skipping: [spine] TASK [Find custom configuration deployment script] ***************************** ok: [l1] ok: [l2] ok: [spine] TASK [Run the configuration deployment script] ********************************* included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/junos.yml for l1, spine included: /home/pipi/netlab_gh/netsim/ansible/tasks/deploy-config/frr.yml for l2 TASK [junos_config: deploying ebgp.multihop from /home/pipi/netlab_gh/netsim/extra/ebgp.multihop/junos.j2] *** changed: [spine] changed: [l1] TASK [template] **************************************************************** changed: [l2] TASK [set_fact] **************************************************************** ok: [l2] TASK [run /tmp/config.sh to deploy ebgp.multihop config from /home/pipi/netlab_gh/netsim/extra/ebgp.multihop/frr.j2] *** skipping: [l2] TASK [run vtysh to import ebgp.multihop config from /home/pipi/netlab_gh/netsim/extra/ebgp.multihop/frr.j2] *** changed: [l2] PLAY RECAP ********************************************************************* h1 : ok=17 changed=4 unreachable=0 failed=0 skipped=7 rescued=0 ignored=0 h2 : ok=17 changed=4 unreachable=0 failed=0 skipped=7 rescued=0 ignored=0 l1 : ok=55 changed=6 unreachable=0 failed=0 skipped=11 rescued=0 ignored=0 l2 : ok=62 changed=13 unreachable=0 failed=0 skipped=19 rescued=0 ignored=0 spine : ok=46 changed=4 unreachable=0 failed=0 skipped=19 rescued=0 ignored=0 The devices under test are EVPN switches (leaf and spine) using EVPN-over-multihop-EBGP. The leaf switch should generate and accept EVPN AF routes, and the spine switch should propagate them without changing the BGP next hop. * h1 and h2 should be able to ping each other Please note it might take a while for the lab to work due to STP learning phase