This is my Ansible Playbook for a simple Cisco BGP routing topology and using a CICD pipeline for integration testing. The virtual network environment is created on-demand by using Vagrant, see my post about Cisco IOSv and XE network simulation using Vagrant.
Network overview:

Here’s my Github repository where you can find the complete Ansible Playbook: https://github.com/berndonline/cisco-lab-provision
You can find all the variables for the interface and routing configuration under host_vars. Below is an example for router rtr-1:
---
hostname: rtr-1
domain_name: lab.local
loopback:
address: 10.255.0.1
mask: 255.255.255.255
interfaces:
0/1:
alias: connection rtr-2
address: 10.0.255.1
mask: 255.255.255.252
0/2:
alias: connection rtr-3
address: 10.0.255.5
mask: 255.255.255.252
bgp:
asn: 65001
neighbor:
- {address: 10.0.255.2, remote_as: 65000}
- {address: 10.0.255.6, remote_as: 65000}
networks:
- {network: 10.0.255.0, mask: 255.255.255.252}
- {network: 10.0.255.4, mask: 255.255.255.252}
- {network: 10.255.0.1, mask: 255.255.255.255}
maxpath: 2
Roles:
- Hostname: The task in main.yml uses the Ansible module ios_system and configures hostname, domain name and disables dns lookups.
- Interfaces: This role uses the Ansible module ios_config to deploy the template interfaces.j2 to configure the interfaces. In the main.yml is a second task to enable the interfaces when the previous template applied the configuration.
- Routing: Very similar to the interfaces role and uses also the ios_config module to deploy the template routing.j2 for the BGP routing configuration.
Main Ansible Playbook site.yml:
---
- hosts: all
connection: local
user: vagrant
gather_facts: 'no'
roles:
- hostname
- interfaces
- routing
When a change triggers the gitlab-ci pipeline it spins up the Vagrant instances and executes the main Ansible Playbook:


After the main site.yml ran, a second Playbook is executed for basic connectivity testing cisco_check_icmp.yml. This uses the Ansible module ios_ping and can be useful in my case to validate if the configuration was correctly applied:


If everything goes well, like in this example, the job is successful:
I will continue to improve the Playbook and the CICD pipeline so come back later to check it out.