This microservice validates network state (when devices run Junos).
It is based on Ansible and Docker
It:
- connects to the network devices
- collects the actual state of the network devices
- compare the actual state with the desired state (described by a human or a program in the
inputsdirectory)
No commit is done on the devices.
This microservice currently supports these features with Junos devices:
- validate management ip address is reachable
- validate management ports are reachable
- validate device model
- validate software release
- validate interfaces status (both admin status and operational status)
- validate physical topology
- validate VLANs configuration
- validate BGP (works with both EBGP and IBGP)
- validate the device can ping his BGP peers
- validate sessions state is Established
- validate the number of routes received by peers is greater than a certain value
- validate ip reachability (running PING on Junos devices, from source addresses located in the device to destination addresses not located in the device)
- validate VTEP endpoints address (used for VXLAN data plane validation)
The desired state is described in the inputs directory.
If you do not provide a description of the desired state for a feature, the tests related to this feature will be skept. As example if you do not describe the physical topology, the microservice will skip the physical topology validation
This microservice:
- instanciates a container
- executes the service
- stops the container
- removes the container
The Docker image is ksator/validate-network-state
$ docker pull ksator/validate-network-state Verify
$ docker images ksator/validate-network-state REPOSITORY TAG IMAGE ID CREATED SIZE ksator/validate-network-state latest a762d1a736d2 2 hours ago 543MB Create this structure:
- An inputs directory. With these files:
- An Ansible Inventory file (hosts.ini) with following variables:
- ansible_host: IP of the device
- ansible_ssh_user: Username to use for the connection
- ansible_ssh_pass: Password to use for the connection
- a file
audit_option.yamlto indicate the ansible behavior when a test fails. By the defaut, when an ansible task fails for an ansible host, that ansible host is removed from the ansible inventory for the next tasks of the playbook.- if you set the audit.mode.loose to False, you keep the Ansible default behavior
- if you prefer to keep that faulty ansible host in the inventory during the next tests, set the audit.mode.loose to True.
- a directory
host_varswith a subdirectory for each device- the device subdirectory has one or several yaml files with the device specific variables
- An Ansible Inventory file (hosts.ini) with following variables:
Inputs directory structure example:
$ tree inputs inputs ├── audit_option.yaml ├── hosts.ini └── host_vars ├── demo-qfx5110-11 │  └── validation.yml └── demo-qfx5110-12 └── validation.yml Ansible inventory example:
$ more inputs/hosts.ini [spines] demo-qfx10k2-14 ansible_host=172.25.90.67 demo-qfx10k2-15 ansible_host=172.25.90.68 demo-qfx5110-9 ansible_host=172.25.90.63 demo-qfx5110-10 ansible_host=172.25.90.64 [leaves] demo-qfx5110-11 ansible_host=172.25.90.65 demo-qfx5110-12 ansible_host=172.25.90.66 [all:vars] netconf_port=830 ansible_ssh_user=ansible ansible_ssh_pass=juniper123 Indicate the Ansible behavior when an Ansible task fails for an Ansible host
$ more inputs/audit_option.yaml --- audit: mode: loose: True Indicate the device specific variables for each Ansible host you want to test
Example for the device demo-qfx5110-11
$ more inputs/host_vars/demo-qfx5110-11/validation.yml # used to validate management ports are reachable from your server management_ports: - 22 - 830 # used to validate device model # compare collected device model VS expected device model (described below) # examples QFX5100-48S, qfx5110-32q, QFX10002-36Q device_model: qfx5110-32q # used to validate SW release # compare collected SW release VS expected SW release (described below) sw_release: 18.2R1-S4.1 # used to validate Interfaces status # interfaces between spines and leaves are expected to be administratively up and operationaly up # non used interfaces are expected to be administratively down interfaces: admin_up_and_oper_up: - et-0/0/0 - et-0/0/1 - et-0/0/2 - et-0/0/3 admin_down: - xe-0/0/6:3 admin_up: - xe-0/0/6:1 - xe-0/0/6:2 - ae100 # used to Validate physical topology # compare the actual LLDP neighbors vs the expected ones (described below) # can be used to validate how devices are connected between them (connection between spines and leaves as example) # can be used to validate how servers running LLDP are connected to Junos devices (connection of a server to an access port of a leaf as example) LLDP_neighbors: - local_interface: et-0/0/0 remote_name: demo-qfx10k2-14 - local_interface: et-0/0/1 remote_name: demo-qfx10k2-15 - local_interface: et-0/0/2 remote_name: demo-qfx5110-9 - local_interface: et-0/0/3 remote_name: demo-qfx5110-10 # used to validate these VLANs exist vlans: - name: tenant1_dmz - name: tenant1_trust - name: tenant1_untrust - name: tenant2_dmz - name: tenant2_trust - name: tenant2_untrust - name: tenant3_dmz - name: tenant3_trust - name: tenant3_untrust # used to validate BGP # works with both EBGP and IBGP # validate the device can ping his BGP peers # validate sessions state is Established # validate the number of routes learnt from `peer_ip` is greater than a certain value BGP_neighbors: - peer_ip: 10.0.0.1 number_of_routes_learnt_greater_than: 2 - peer_ip: 10.0.0.2 number_of_routes_learnt_greater_than: 2 - peer_ip: 10.0.0.11 number_of_routes_learnt_greater_than: 2 - peer_ip: 10.0.0.12 number_of_routes_learnt_greater_than: 2 - peer_ip: 172.16.0.0 number_of_routes_learnt_greater_than: 2 - peer_ip: 172.16.0.4 number_of_routes_learnt_greater_than: 2 - peer_ip: 172.16.0.8 number_of_routes_learnt_greater_than: 2 - peer_ip: 172.16.0.12 number_of_routes_learnt_greater_than: 2 # used to validate the device can run these PING (ttl=1) PING: - local_ip: 10.0.0.21 peer_ip: 10.0.0.1 - local_ip: 10.0.0.21 peer_ip: 10.0.0.2 - local_ip: 10.0.0.21 peer_ip: 10.0.0.11 - local_ip: 10.0.0.21 peer_ip: 10.0.0.12 - local_ip: 172.16.0.1 peer_ip: 172.16.0.0 - local_ip: 172.16.0.5 peer_ip: 172.16.0.4 - local_ip: 172.16.0.9 peer_ip: 172.16.0.8 - local_ip: 172.16.0.13 peer_ip: 172.16.0.12 # Used to validate VTEP endpoints address. Used for VXLAN data plane validation # Use output of `show interfaces vtep` command and check if below remote endpoint address are presents vtep: - address: "10.0.0.21" - address: "10.0.0.22" Example for the device demo-qfx5110-12
$ more inputs/host_vars/demo-qfx5110-12/validation.yml # used to validate management ports are reachable from your server management_ports: - 22 - 830 # used to validate device model # compare collected device model VS expected device model (described below) # examples QFX5100-48S, qfx5110-32q, QFX10002-36Q device_model: qfx5110-32q # used to validate SW release # compare collected SW release VS expected SW release (described below) sw_release: 17.3R3.9 # used to validate Interfaces status # interfaces between spines and leaves are expected to be administratively up and operationaly up # non used interfaces are expected to be administratively down interfaces: admin_up_and_oper_up: - et-0/0/0 - et-0/0/1 - et-0/0/2 - et-0/0/3 admin_down: - xe-0/0/6:3 admin_up: - xe-0/0/6:1 - xe-0/0/6:2 - ae100 # used to Validate physical topology # compare the actual LLDP neighbors vs the expected ones (described below) # can be used to validate how devices are connected between them (connection between spines and leaves as example) # can be used to validate how servers running LLDP are connected to Junos devices (connection of a server to an access port of a leaf as example) LLDP_neighbors: - local_interface: et-0/0/0 remote_name: demo-qfx10k2-14 - local_interface: et-0/0/1 remote_name: demo-qfx10k2-15 - local_interface: et-0/0/2 remote_name: demo-qfx5110-9 - local_interface: et-0/0/3 remote_name: demo-qfx5110-10 # used to validate these VLANs exist vlans: - name: tenant1_dmz - name: tenant1_trust - name: tenant1_untrust - name: tenant2_dmz - name: tenant2_trust - name: tenant2_untrust - name: tenant3_dmz - name: tenant3_trust - name: tenant3_untrust # used to validate BGP # works with both EBGP and IBGP # validate the device can ping his BGP peers # validate sessions state is Established # validate the number of routes learnt from `peer_ip` is greater than a certain value BGP_neighbors: - peer_ip: 10.0.0.1 number_of_routes_learnt_greater_than: 2 - peer_ip: 10.0.0.2 number_of_routes_learnt_greater_than: 2 - peer_ip: 10.0.0.11 number_of_routes_learnt_greater_than: 2 - peer_ip: 10.0.0.12 number_of_routes_learnt_greater_than: 2 - peer_ip: 172.16.0.2 number_of_routes_learnt_greater_than: 2 - peer_ip: 172.16.0.6 number_of_routes_learnt_greater_than: 2 - peer_ip: 172.16.0.10 number_of_routes_learnt_greater_than: 2 - peer_ip: 172.16.0.14 number_of_routes_learnt_greater_than: 2 # used to validate the device can run these PING (ttl=1) PING: - local_ip: 10.0.0.22 peer_ip: 10.0.0.1 - local_ip: 10.0.0.22 peer_ip: 10.0.0.2 - local_ip: 10.0.0.22 peer_ip: 10.0.0.11 - local_ip: 10.0.0.22 peer_ip: 10.0.0.12 - local_ip: 172.16.0.3 peer_ip: 172.16.0.2 - local_ip: 172.16.0.7 peer_ip: 172.16.0.6 - local_ip: 172.16.0.11 peer_ip: 172.16.0.10 - local_ip: 172.16.0.15 peer_ip: 172.16.0.14 # Used to validate VTEP endpoints address. Used for VXLAN data plane validation # Use output of `show interfaces vtep` command and check if below remote endpoint address are presents vtep: - address: "10.0.0.21" - address: "10.0.0.22" $ docker run -it --rm -v ${PWD}/inputs/host_vars:/host_vars -v ${PWD}/inputs:/inputs -v ${PWD}/outputs:/outputs ksator/validate-network-state Validate Junos devices state PLAY [Validate Junos devices state] ************************************************************************************************************************* TASK [include_vars] ***************************************************************************************************************************************** ok: [demo-qfx5110-11] ok: [demo-qfx10k2-14] ok: [demo-qfx5110-12] ok: [demo-qfx5110-9] ok: [demo-qfx10k2-15] ok: [demo-qfx5110-10] TASK [validate-management-ports-reachability : Check management ports reachability from your server] ******************************************************** skipping: [demo-qfx10k2-14] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-11] => (item=22) ok: [demo-qfx5110-12] => (item=22) ok: [demo-qfx5110-12] => (item=830) ok: [demo-qfx5110-11] => (item=830) TASK [validate-device-model-and-SW-release : Retrieve junos facts from devices] ***************************************************************************** ok: [demo-qfx5110-11] ok: [demo-qfx5110-12] ok: [demo-qfx5110-9] ok: [demo-qfx10k2-14] ok: [demo-qfx10k2-15] ok: [demo-qfx5110-10] TASK [validate-device-model-and-SW-release : Print some junos facts] **************************************************************************************** ok: [demo-qfx5110-11] => { "msg": "device demo-qfx5110-11 is a qfx5110-32q running junos version 18.2R1-S4.1" } ok: [demo-qfx5110-12] => { "msg": "device demo-qfx5110-12 is a qfx5110-32q running junos version 17.3R3.9" } ok: [demo-qfx10k2-14] => { "msg": "device demo-qfx10k2-14 is a qfx10002-36q running junos version 17.4R1-S3.3" } ok: [demo-qfx10k2-15] => { "msg": "device demo-qfx10k2-15 is a qfx10002-36q running junos version 17.4R1-S3.3" } ok: [demo-qfx5110-9] => { "msg": "device demo-qfx5110-9 is a qfx5110-32q running junos version 17.3R3.9" } ok: [demo-qfx5110-10] => { "msg": "device demo-qfx5110-10 is a qfx5110-32q running junos version 17.3R3.9" } TASK [validate-device-model-and-SW-release : validate device model] ***************************************************************************************** skipping: [demo-qfx10k2-15] skipping: [demo-qfx10k2-14] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-11] => { "changed": false, "msg": "All assertions passed" } ok: [demo-qfx5110-12] => { "changed": false, "msg": "All assertions passed" } TASK [validate-device-model-and-SW-release : validate software version] ************************************************************************************* skipping: [demo-qfx10k2-15] skipping: [demo-qfx10k2-14] skipping: [demo-qfx5110-10] skipping: [demo-qfx5110-9] ok: [demo-qfx5110-11] => { "changed": false, "msg": "All assertions passed" } ok: [demo-qfx5110-12] => { "changed": false, "msg": "All assertions passed" } TASK [validate-interfaces-status : validate interfaces status is admin up] ********************************************************************************** skipping: [demo-qfx10k2-14] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-12] => (item=et-0/0/0) ok: [demo-qfx5110-11] => (item=et-0/0/0) ok: [demo-qfx5110-12] => (item=et-0/0/1) ok: [demo-qfx5110-11] => (item=et-0/0/1) ok: [demo-qfx5110-12] => (item=et-0/0/2) ok: [demo-qfx5110-11] => (item=et-0/0/2) ok: [demo-qfx5110-12] => (item=et-0/0/3) ok: [demo-qfx5110-11] => (item=et-0/0/3) ok: [demo-qfx5110-12] => (item=xe-0/0/6:1) ok: [demo-qfx5110-11] => (item=xe-0/0/6:1) ok: [demo-qfx5110-12] => (item=xe-0/0/6:2) ok: [demo-qfx5110-11] => (item=xe-0/0/6:2) ok: [demo-qfx5110-12] => (item=ae100) ok: [demo-qfx5110-11] => (item=ae100) TASK [validate-interfaces-status : validate interfaces status is operationaly up] *************************************************************************** skipping: [demo-qfx10k2-14] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-12] => (item=et-0/0/0) ok: [demo-qfx5110-11] => (item=et-0/0/0) ok: [demo-qfx5110-12] => (item=et-0/0/1) ok: [demo-qfx5110-11] => (item=et-0/0/1) ok: [demo-qfx5110-12] => (item=et-0/0/2) ok: [demo-qfx5110-11] => (item=et-0/0/2) ok: [demo-qfx5110-12] => (item=et-0/0/3) ok: [demo-qfx5110-11] => (item=et-0/0/3) TASK [validate-interfaces-status : validate interfaces status is admin down] ******************************************************************************** skipping: [demo-qfx10k2-14] skipping: [demo-qfx5110-9] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-12] => (item=xe-0/0/6:3) ok: [demo-qfx5110-11] => (item=xe-0/0/6:3) TASK [validate-lldp-neighbors : validate lldp neighbors are the ones we excpect] **************************************************************************** skipping: [demo-qfx10k2-14] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-12] => (item={u'local_interface': u'et-0/0/0', u'remote_name': u'demo-qfx10k2-14'}) ok: [demo-qfx5110-11] => (item={u'local_interface': u'et-0/0/0', u'remote_name': u'demo-qfx10k2-14'}) ok: [demo-qfx5110-12] => (item={u'local_interface': u'et-0/0/1', u'remote_name': u'demo-qfx10k2-15'}) ok: [demo-qfx5110-11] => (item={u'local_interface': u'et-0/0/1', u'remote_name': u'demo-qfx10k2-15'}) ok: [demo-qfx5110-12] => (item={u'local_interface': u'et-0/0/2', u'remote_name': u'demo-qfx5110-9'}) ok: [demo-qfx5110-11] => (item={u'local_interface': u'et-0/0/2', u'remote_name': u'demo-qfx5110-9'}) ok: [demo-qfx5110-12] => (item={u'local_interface': u'et-0/0/3', u'remote_name': u'demo-qfx5110-10'}) ok: [demo-qfx5110-11] => (item={u'local_interface': u'et-0/0/3', u'remote_name': u'demo-qfx5110-10'}) TASK [validate-vlans-configuration : validate vlan] ********************************************************************************************************* skipping: [demo-qfx10k2-14] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-12] => (item={u'name': u'tenant1_dmz'}) ok: [demo-qfx5110-11] => (item={u'name': u'tenant1_dmz'}) ok: [demo-qfx5110-12] => (item={u'name': u'tenant1_trust'}) ok: [demo-qfx5110-11] => (item={u'name': u'tenant1_trust'}) ok: [demo-qfx5110-12] => (item={u'name': u'tenant1_untrust'}) ok: [demo-qfx5110-11] => (item={u'name': u'tenant1_untrust'}) ok: [demo-qfx5110-12] => (item={u'name': u'tenant2_dmz'}) ok: [demo-qfx5110-11] => (item={u'name': u'tenant2_dmz'}) ok: [demo-qfx5110-12] => (item={u'name': u'tenant2_trust'}) ok: [demo-qfx5110-11] => (item={u'name': u'tenant2_trust'}) ok: [demo-qfx5110-12] => (item={u'name': u'tenant2_untrust'}) ok: [demo-qfx5110-11] => (item={u'name': u'tenant2_untrust'}) ok: [demo-qfx5110-12] => (item={u'name': u'tenant3_dmz'}) ok: [demo-qfx5110-11] => (item={u'name': u'tenant3_dmz'}) ok: [demo-qfx5110-12] => (item={u'name': u'tenant3_trust'}) ok: [demo-qfx5110-11] => (item={u'name': u'tenant3_trust'}) ok: [demo-qfx5110-12] => (item={u'name': u'tenant3_untrust'}) ok: [demo-qfx5110-11] => (item={u'name': u'tenant3_untrust'}) TASK [validate-bgp-sessions : validate devices can ping their bgp peers] ************************************************************************************ skipping: [demo-qfx10k2-14] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.1'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.1'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.2'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.2'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.11'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.11'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.12'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.12'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.2'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.0'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.6'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.4'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.10'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.8'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.14'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.12'}) TASK [validate-bgp-sessions : validate bgp sessions are Established] **************************************************************************************** skipping: [demo-qfx10k2-14] skipping: [demo-qfx5110-9] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.1'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.1'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.2'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.2'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.11'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.11'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.12'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.12'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.2'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.0'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.6'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.4'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.10'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.8'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.14'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.12'}) TASK [validate-bgp-sessions : validate the number of BGP routes received] *********************************************************************************** skipping: [demo-qfx10k2-14] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.1'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.1'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.2'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.2'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.11'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.11'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.12'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'10.0.0.12'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.2'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.0'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.6'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.4'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.10'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.8'}) ok: [demo-qfx5110-12] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.14'}) ok: [demo-qfx5110-11] => (item={u'number_of_routes_learnt_greater_than': 2, u'peer_ip': u'172.16.0.12'}) TASK [validate-ip-reachability-using-ping-from-Junos-device : ping from Junos devices] ********************************************************************** skipping: [demo-qfx10k2-14] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-12] => (item={u'local_ip': u'10.0.0.22', u'peer_ip': u'10.0.0.1'}) ok: [demo-qfx5110-11] => (item={u'local_ip': u'10.0.0.21', u'peer_ip': u'10.0.0.1'}) ok: [demo-qfx5110-11] => (item={u'local_ip': u'10.0.0.21', u'peer_ip': u'10.0.0.2'}) ok: [demo-qfx5110-12] => (item={u'local_ip': u'10.0.0.22', u'peer_ip': u'10.0.0.2'}) ok: [demo-qfx5110-12] => (item={u'local_ip': u'10.0.0.22', u'peer_ip': u'10.0.0.11'}) ok: [demo-qfx5110-11] => (item={u'local_ip': u'10.0.0.21', u'peer_ip': u'10.0.0.11'}) ok: [demo-qfx5110-11] => (item={u'local_ip': u'10.0.0.21', u'peer_ip': u'10.0.0.12'}) ok: [demo-qfx5110-12] => (item={u'local_ip': u'10.0.0.22', u'peer_ip': u'10.0.0.12'}) ok: [demo-qfx5110-12] => (item={u'local_ip': u'172.16.0.3', u'peer_ip': u'172.16.0.2'}) ok: [demo-qfx5110-11] => (item={u'local_ip': u'172.16.0.1', u'peer_ip': u'172.16.0.0'}) ok: [demo-qfx5110-12] => (item={u'local_ip': u'172.16.0.7', u'peer_ip': u'172.16.0.6'}) ok: [demo-qfx5110-11] => (item={u'local_ip': u'172.16.0.5', u'peer_ip': u'172.16.0.4'}) ok: [demo-qfx5110-12] => (item={u'local_ip': u'172.16.0.11', u'peer_ip': u'172.16.0.10'}) ok: [demo-qfx5110-11] => (item={u'local_ip': u'172.16.0.9', u'peer_ip': u'172.16.0.8'}) ok: [demo-qfx5110-12] => (item={u'local_ip': u'172.16.0.15', u'peer_ip': u'172.16.0.14'}) ok: [demo-qfx5110-11] => (item={u'local_ip': u'172.16.0.13', u'peer_ip': u'172.16.0.12'}) TASK [validate-vtep-endpoints : collect interfaces vtep] **************************************************************************************************** ok: [demo-qfx5110-12] ok: [demo-qfx5110-9] ok: [demo-qfx10k2-14] ok: [demo-qfx10k2-15] ok: [demo-qfx5110-10] ok: [demo-qfx5110-11] TASK [validate-vtep-endpoints : validate VTEP remote endpoints address] ************************************************************************************* skipping: [demo-qfx10k2-14] skipping: [demo-qfx10k2-15] skipping: [demo-qfx5110-9] skipping: [demo-qfx5110-10] ok: [demo-qfx5110-11] => (item={u'address': u'10.0.0.21'}) => { "changed": false, "item": { "address": "10.0.0.21" }, "msg": "All assertions passed" } ok: [demo-qfx5110-11] => (item={u'address': u'10.0.0.22'}) => { "changed": false, "item": { "address": "10.0.0.22" }, "msg": "All assertions passed" } ok: [demo-qfx5110-12] => (item={u'address': u'10.0.0.21'}) => { "changed": false, "item": { "address": "10.0.0.21" }, "msg": "All assertions passed" } ok: [demo-qfx5110-12] => (item={u'address': u'10.0.0.22'}) => { "changed": false, "item": { "address": "10.0.0.22" }, "msg": "All assertions passed" } PLAY RECAP ************************************************************************************************************************************************** demo-qfx10k2-14 : ok=4 changed=0 unreachable=0 failed=0 demo-qfx10k2-15 : ok=4 changed=0 unreachable=0 failed=0 demo-qfx5110-10 : ok=4 changed=0 unreachable=0 failed=0 demo-qfx5110-11 : ok=17 changed=0 unreachable=0 failed=0 demo-qfx5110-12 : ok=17 changed=0 unreachable=0 failed=0 demo-qfx5110-9 : ok=4 changed=0 unreachable=0 failed=0