Skip to content
Open
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
cc40d32
Create fabric_workflow_manager.yml
VidhyaGit Sep 23, 2025
a40aa62
Create fabric_overlay_topology_devices.yml
VidhyaGit Sep 23, 2025
a5c920c
Update fabric_workflow_manager.yml
VidhyaGit Sep 23, 2025
398ad24
Create fabric_border_cli.j2
VidhyaGit Sep 23, 2025
69143fb
Create fabric_leaf_cli.j2
VidhyaGit Sep 23, 2025
5506cde
Create fabric_spine_cli.j2
VidhyaGit Sep 23, 2025
6de5bed
Create l3vn_unicast_leaf_cli.j2
VidhyaGit Sep 23, 2025
16af5ee
Create l3vn_unicast_border_cli.j2
VidhyaGit Sep 23, 2025
77d53fd
Create l3vn_multicast_anycast_rp_leaf_cli.j2
VidhyaGit Sep 23, 2025
726d830
Create l3vn_multicast_anycast_rp_border_cli.j2
VidhyaGit Sep 23, 2025
12d22d3
Create l3vn_multicast_internal_rp_border_cli.j2
VidhyaGit Sep 23, 2025
e77e174
Create l3vn_multicast_internal_rp_leaf_cli.j2
VidhyaGit Sep 23, 2025
684cc4d
Create l3vn_multicast_external_rp_border_cli.j2
VidhyaGit Sep 23, 2025
90e5b6b
Create l3vn_multicast_external_rp_leaf_cli.j2
VidhyaGit Sep 23, 2025
567a300
Merge branch 'cisco-en-programmability:main' into main
VidhyaGit Oct 16, 2025
cba9c16
Ansible playbooks and jinja templates for EVPN L2VN configurations
Oct 22, 2025
00384be
Merge branch 'cisco-en-programmability:main' into main
VidhyaGit Oct 22, 2025
082e8b6
Ansible playbooks and jinja templates for EVPN static host onboarding
vivekraj2000 Oct 23, 2025
d04cfcf
Merge branch 'cisco-en-programmability:main' into private/vpenke/evpn…
vivekraj2000 Oct 23, 2025
bf5fa27
Merge pull request #1 from VidhyaGit/private/vpenke/evpnL2vnTemplates
vivekraj2000 Oct 23, 2025
99e5f4a
Handled delete cases too
Oct 23, 2025
c94faa8
Delete playbooks/bgpevpn/jinja_templates/fabric_spine_cli.j2
VidhyaGit Oct 23, 2025
4bfe899
Delete playbooks/bgpevpn/jinja_templates/fabric_border_cli.j2
VidhyaGit Oct 23, 2025
ac566bb
Delete playbooks/bgpevpn/jinja_templates/fabric_leaf_cli.j2
VidhyaGit Oct 23, 2025
061746f
Delete playbooks/bgpevpn/fabric_workflow_manager.yml
VidhyaGit Oct 23, 2025
61a4a76
evpn l2vn playbook changes
vivekraj2000 Oct 24, 2025
1135e2f
Merge pull request #2 from VidhyaGit/private/vpenke/evpnL2vnTemplates
vivekraj2000 Oct 24, 2025
7b14a51
added mutiple device support for l2vn
vivekraj2000 Oct 27, 2025
bf84c09
Merge pull request #3 from VidhyaGit/private/vpenke/evpnL2vnTemplates
vivekraj2000 Oct 27, 2025
2cde1d3
Merge branch 'cisco-en-programmability:main' into main
VidhyaGit Oct 28, 2025
7abd0b8
bug fixes
Oct 28, 2025
9fda996
l2vn sample var file changes
vivekraj2000 Oct 28, 2025
74d17dc
Merge pull request #4 from VidhyaGit/private/vpenke/evpnL2vnTemplates
vivekraj2000 Oct 28, 2025
336783c
Added evpn_l2vn_template_workflow_manager for validating l2vn input
vivekraj2000 Nov 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions playbooks/bgpevpn/evpn_l2vn_anycast_delete_deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
- name: Deploy BGP EVPN L2VN Configuration
hosts: localhost
gather_facts: false
vars_files:
- ../credentials.yml
- ./vars/evpn_l2vn_anycast_delete_var.yml
tasks:
- name: Validate top-level L2VN delete input
ansible.builtin.assert:
that:
- l2vns is defined
- l2vns is iterable
- l2vns | length > 0
fail_msg: "Invalid top-level vars: need non-empty 'l2vns' list."

- name: Validate each L2VN entry mandatory fields
ansible.builtin.assert:
that:
- item.l2vn_name is defined
- item.vlan_id is defined
- item.vni is defined
fail_msg: >-
L2VN validation failed for index {{ idx }} (name={{ item.l2vn_name|default('UNNAMED') }}): Required fields missing or malformed. Item={{ item | to_nice_yaml }}
loop: "{{ l2vns }}"
loop_control:
index_var: idx
label: "{{ item.l2vn_name | default('UNNAMED') }}"

- name: Render l2vn_anycast_delete_cli.j2 to a variable
ansible.builtin.set_fact:
rendered_l2vn_anycast_delete: "{{ lookup('template', '/Users/vpenke/ansible/dev/collections/ansible_collections/cisco/dnac/playbooks/bgpevpn/jinja_templates/l2vn_anycast_delete_cli.j2') }}"

- name: Print rendered_l2vn_anycast_delete
ansible.builtin.debug:
var: rendered_l2vn_anycast_delete

- name: Create new l2vn anycast delete template.
cisco.dnac.template_workflow_manager:
dnac_host: "{{ dnac_host }}"
dnac_port: "{{ dnac_port }}"
dnac_username: "{{ dnac_username }}"
dnac_password: "{{ dnac_password }}"
dnac_verify: "{{ dnac_verify }}"
dnac_version: "{{ dnac_version }}"
dnac_debug: "{{ dnac_debug }}"
dnac_log_level: DEBUG
dnac_log: true
config_verify: true
state: merged
config:
- configuration_templates:
project_name: "evpn_l2vn_anycast_delete"
template_name: "evpn_l2vn_anycast_delete_template"
template_content: "{{ rendered_l2vn_anycast_delete }}"
version_description: "Auto-generated BGP EVPN L2VN anycast delete config"
language: JINJA
software_type: "IOS-XE"
device_types:
- product_family: Switches and Hubs
- deploy_template:
project_name: "evpn_l2vn_anycast_delete"
template_name: "evpn_l2vn_anycast_delete_template"
force_push: true
template_parameters:
- param_name: "vlan_id"
param_value: "1431"
- param_name: "vlan_name"
param_value: "testvlan31"
device_details:
device_ips: ["172.27.248.81"]
82 changes: 82 additions & 0 deletions playbooks/bgpevpn/evpn_l2vn_anycast_deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
---
- name: Deploy BGP EVPN L2VN Configuration
hosts: localhost
gather_facts: false
vars_files:
- ../credentials.yml
- ./vars/evpn_l2vn_anycast_var.yml
tasks:
- name: Validate top-level L2VN input
ansible.builtin.assert:
that:
- asn is defined
- mac_address is defined
- l2vns is defined
- l2vns is iterable
- l2vns | length > 0
fail_msg: "Missing or invalid top-level vars: need 'asn' and non-empty 'l2vns' list."

- name: Validate each L2VN entry mandatory fields
ansible.builtin.assert:
that:
- item.l2vn_name is defined
- item.vlan_id is defined
- item.vni is defined
- item.associated_l3vn is defined
- item.l2vn_pool is defined
- item.l2vn_pool.ipv4_address is defined
- item.l2vn_pool.ipv4_netmask is defined
- (item.l2vn_pool.ipv6_address is not defined) or (item.l2vn_pool.ipv6_netmask is defined)
- (item.dhcp_relay is not defined) or (item.dhcp_relay.dhcpv4_relay is not defined) or (item.dhcp_relay.dhcpv4_relay.dhcpv4_server_ip is defined)
- (item.dhcp_relay is not defined) or (item.dhcp_relay.dhcpv4_relay is not defined) or (item.dhcp_relay.dhcpv4_relay.dhcpv4_server_vrf is defined)
- (item.dhcp_relay is not defined) or (item.dhcp_relay.dhcpv6_relay is not defined) or (item.dhcp_relay.dhcpv6_relay.dhcpv6_server_ip is defined)
- (item.dhcp_relay is not defined) or (item.dhcp_relay.dhcpv6_relay is not defined) or (item.dhcp_relay.dhcpv6_relay.dhcpv6_server_vrf is defined)
fail_msg: >-
L2VN validation failed for index {{ idx }} (name={{ item.l2vn_name|default('UNNAMED') }}): Required fields missing or malformed. Item={{ item | to_nice_yaml }}
loop: "{{ l2vns }}"
loop_control:
index_var: idx
label: "{{ item.l2vn_name | default('UNNAMED') }}"

- name: Render l2vn_anycast_cli.j2 to a variable
ansible.builtin.set_fact:
rendered_l2vn_anycast: "{{ lookup('template', '/Users/vpenke/ansible/dev/collections/ansible_collections/cisco/dnac/playbooks/bgpevpn/jinja_templates/l2vn_anycast_cli.j2') }}"

- name: Print rendered_l2vn_anycast
ansible.builtin.debug:
var: rendered_l2vn_anycast

- name: Create new l2vn anycast template.
cisco.dnac.template_workflow_manager:
dnac_host: "{{ dnac_host }}"
dnac_port: "{{ dnac_port }}"
dnac_username: "{{ dnac_username }}"
dnac_password: "{{ dnac_password }}"
dnac_verify: "{{ dnac_verify }}"
dnac_version: "{{ dnac_version }}"
dnac_debug: "{{ dnac_debug }}"
dnac_log_level: DEBUG
dnac_log: true
config_verify: true
state: merged
config:
- configuration_templates:
project_name: "evpn_l2vn_anycast"
template_name: "evpn_l2vn_anycast_template"
template_content: "{{ rendered_l2vn_anycast }}"
version_description: "Auto-generated BGP EVPN L2VN anycast config"
language: JINJA
software_type: "IOS-XE"
device_types:
- product_family: Switches and Hubs
- deploy_template:
project_name: "evpn_l2vn_anycast"
template_name: "evpn_l2vn_anycast_template"
force_push: true
template_parameters:
- param_name: "vlan_id"
param_value: "1431"
- param_name: "vlan_name"
param_value: "testvlan31"
device_details:
device_ips: ["172.27.248.81"]
72 changes: 72 additions & 0 deletions playbooks/bgpevpn/evpn_l2vn_anycast_mcast_delete_deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
- name: Deploy BGP EVPN L2VN Configuration
hosts: localhost
gather_facts: false
vars_files:
- ../credentials.yml
- ./vars/evpn_l2vn_anycast_mcast_delete_var.yml
tasks:
- name: Validate top-level L2VN delete input
ansible.builtin.assert:
that:
- l2vns is defined
- l2vns is iterable
- l2vns | length > 0
fail_msg: "Invalid top-level vars: need non-empty 'l2vns' list."

- name: Validate each L2VN entry mandatory fields
ansible.builtin.assert:
that:
- item.l2vn_name is defined
- item.vlan_id is defined
- item.vni is defined
- item.multicast_group is defined
fail_msg: >-
L2VN validation failed for index {{ idx }} (name={{ item.l2vn_name|default('UNNAMED') }}): Required fields missing or malformed. Item={{ item | to_nice_yaml }}
loop: "{{ l2vns }}"
loop_control:
index_var: idx
label: "{{ item.l2vn_name | default('UNNAMED') }}"

- name: Render l2vn_anycast_mcast_delete_cli.j2 to a variable
ansible.builtin.set_fact:
rendered_l2vn_anycast_mcast_delete: "{{ lookup('template', '/Users/vpenke/ansible/dev/collections/ansible_collections/cisco/dnac/playbooks/bgpevpn/jinja_templates/l2vn_anycast_mcast_delete_cli.j2') }}"

- name: Print rendered_l2vn_anycast_mcast_delete
ansible.builtin.debug:
var: rendered_l2vn_anycast_mcast_delete

- name: Create new l2vn anycast multicast delete template.
cisco.dnac.template_workflow_manager:
dnac_host: "{{ dnac_host }}"
dnac_port: "{{ dnac_port }}"
dnac_username: "{{ dnac_username }}"
dnac_password: "{{ dnac_password }}"
dnac_verify: "{{ dnac_verify }}"
dnac_version: "{{ dnac_version }}"
dnac_debug: "{{ dnac_debug }}"
dnac_log_level: DEBUG
dnac_log: true
config_verify: true
state: merged
config:
- configuration_templates:
project_name: "evpn_l2vn_anycast_mcast_delete"
template_name: "evpn_l2vn_anycast_mcast_delete_template"
template_content: "{{ rendered_l2vn_anycast_mcast_delete }}"
version_description: "Auto-generated BGP EVPN L2VN anycast multicast delete config"
language: JINJA
software_type: "IOS-XE"
device_types:
- product_family: Switches and Hubs
- deploy_template:
project_name: "evpn_l2vn_anycast_mcast_delete"
template_name: "evpn_l2vn_anycast_mcast_delete_template"
force_push: true
template_parameters:
- param_name: "vlan_id"
param_value: "1431"
- param_name: "vlan_name"
param_value: "testvlan31"
device_details:
device_ips: ["172.27.248.81"]
83 changes: 83 additions & 0 deletions playbooks/bgpevpn/evpn_l2vn_anycast_mcast_deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
---
- name: Deploy BGP EVPN L2VN Configuration
hosts: localhost
gather_facts: false
vars_files:
- ../credentials.yml
- ./vars/evpn_l2vn_anycast_mcast_var.yml
tasks:
- name: Validate top-level L2VN input
ansible.builtin.assert:
that:
- asn is defined
- mac_address is defined
- l2vns is defined
- l2vns is iterable
- l2vns | length > 0
fail_msg: "Missing or invalid top-level vars: need 'asn' and non-empty 'l2vns' list."

- name: Validate each L2VN entry mandatory fields
ansible.builtin.assert:
that:
- item.l2vn_name is defined
- item.vlan_id is defined
- item.vni is defined
- item.associated_l3vn is defined
- item.multicast_group is defined
- item.l2vn_pool is defined
- item.l2vn_pool.ipv4_address is defined
- item.l2vn_pool.ipv4_netmask is defined
- (item.l2vn_pool.ipv6_address is not defined) or (item.l2vn_pool.ipv6_netmask is defined)
- (item.dhcp_relay is not defined) or (item.dhcp_relay.dhcpv4_relay is not defined) or (item.dhcp_relay.dhcpv4_relay.dhcpv4_server_ip is defined)
- (item.dhcp_relay is not defined) or (item.dhcp_relay.dhcpv4_relay is not defined) or (item.dhcp_relay.dhcpv4_relay.dhcpv4_server_vrf is defined)
- (item.dhcp_relay is not defined) or (item.dhcp_relay.dhcpv6_relay is not defined) or (item.dhcp_relay.dhcpv6_relay.dhcpv6_server_ip is defined)
- (item.dhcp_relay is not defined) or (item.dhcp_relay.dhcpv6_relay is not defined) or (item.dhcp_relay.dhcpv6_relay.dhcpv6_server_vrf is defined)
fail_msg: >-
L2VN validation failed for index {{ idx }} (name={{ item.l2vn_name|default('UNNAMED') }}): Required fields missing or malformed. Item={{ item | to_nice_yaml }}
loop: "{{ l2vns }}"
loop_control:
index_var: idx
label: "{{ item.l2vn_name | default('UNNAMED') }}"

- name: Render l2vn_anycast_mcast_cli.j2 to a variable
ansible.builtin.set_fact:
rendered_l2vn_anycast_mcast: "{{ lookup('template', '/Users/vpenke/ansible/dev/collections/ansible_collections/cisco/dnac/playbooks/bgpevpn/jinja_templates/l2vn_anycast_mcast_cli.j2') }}"

- name: Print rendered_l2vn_anycast_mcast
ansible.builtin.debug:
var: rendered_l2vn_anycast_mcast

- name: Create new l2vn anycast multicast template.
cisco.dnac.template_workflow_manager:
dnac_host: "{{ dnac_host }}"
dnac_port: "{{ dnac_port }}"
dnac_username: "{{ dnac_username }}"
dnac_password: "{{ dnac_password }}"
dnac_verify: "{{ dnac_verify }}"
dnac_version: "{{ dnac_version }}"
dnac_debug: "{{ dnac_debug }}"
dnac_log_level: DEBUG
dnac_log: true
config_verify: true
state: merged
config:
- configuration_templates:
project_name: "evpn_l2vn_anycast_mcast"
template_name: "evpn_l2vn_anycast_mcast_template"
template_content: "{{ rendered_l2vn_anycast_mcast }}"
version_description: "Auto-generated BGP EVPN L2VN anycast multicast config"
language: JINJA
software_type: "IOS-XE"
device_types:
- product_family: Switches and Hubs
- deploy_template:
project_name: "evpn_l2vn_anycast_mcast"
template_name: "evpn_l2vn_anycast_mcast_template"
force_push: true
template_parameters:
- param_name: "vlan_id"
param_value: "1431"
- param_name: "vlan_name"
param_value: "testvlan31"
device_details:
device_ips: ["172.27.248.81"]
70 changes: 70 additions & 0 deletions playbooks/bgpevpn/evpn_l2vn_localized_delete_deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
- name: Deploy BGP EVPN L2VN Configuration
hosts: localhost
gather_facts: false
vars_files:
- ../credentials.yml
- ./vars/evpn_l2vn_localized_delete_var.yml
tasks:
- name: Validate top-level L2VN delete input
ansible.builtin.assert:
that:
- l2vns is defined
- l2vns is iterable
- l2vns | length > 0
fail_msg: "Invalid top-level vars: need non-empty 'l2vns' list."

- name: Validate each L2VN entry mandatory fields
ansible.builtin.assert:
that:
- item.l2vn_name is defined
- item.vlan_id is defined
fail_msg: >-
L2VN validation failed for index {{ idx }} (name={{ item.l2vn_name|default('UNNAMED') }}): Required fields missing or malformed. Item={{ item | to_nice_yaml }}
loop: "{{ l2vns }}"
loop_control:
index_var: idx
label: "{{ item.l2vn_name | default('UNNAMED') }}"

- name: Render l2vn_localized_delete_cli.j2 to a variable
ansible.builtin.set_fact:
rendered_l2vn_localized_delete: "{{ lookup('template', '/Users/vpenke/ansible/dev/collections/ansible_collections/cisco/dnac/playbooks/bgpevpn/jinja_templates/l2vn_localized_delete_cli.j2') }}"

- name: Print rendered_l2vn_localized_delete
ansible.builtin.debug:
var: rendered_l2vn_localized_delete

- name: Create new l2vn localized delete template.
cisco.dnac.template_workflow_manager:
dnac_host: "{{ dnac_host }}"
dnac_port: "{{ dnac_port }}"
dnac_username: "{{ dnac_username }}"
dnac_password: "{{ dnac_password }}"
dnac_verify: "{{ dnac_verify }}"
dnac_version: "{{ dnac_version }}"
dnac_debug: "{{ dnac_debug }}"
dnac_log_level: DEBUG
dnac_log: true
config_verify: true
state: merged
config:
- configuration_templates:
project_name: "evpn_l2vn_localized_delete"
template_name: "evpn_l2vn_localized_delete_template"
template_content: "{{ rendered_l2vn_localized_delete }}"
version_description: "Auto-generated BGP EVPN L2VN localized delete config"
language: JINJA
software_type: "IOS-XE"
device_types:
- product_family: Switches and Hubs
- deploy_template:
project_name: "evpn_l2vn_localized_delete"
template_name: "evpn_l2vn_localized_delete_template"
force_push: true
template_parameters:
- param_name: "vlan_id"
param_value: "1431"
- param_name: "vlan_name"
param_value: "testvlan31"
device_details:
device_ips: ["172.27.248.81"]
Loading