Node Types¶
Introduction¶
Node Types define the role and capabilities of devices in your AVD fabric. They determine what features are enabled on each device, such as EVPN roles, MLAG support, network services, and routing protocols. AVD provides default node types for common architectures, but you can also create custom node types to match your specific requirements.
This guide explains how to use the default node types, create custom node types, and automatically assign node types based on hostname patterns.
Concepts¶
node_type_keys: The list of node type definitions that specify the properties and capabilities of each node type in the fabric. AVD includes default node types like spine, l3leaf, l2leaf, pe, p, etc.
custom_node_type_keys: Allows you to define additional node types or override default node types without replacing the entire node_type_keys list.
default_node_types: Automatically assigns node types to devices based on hostname regex patterns, eliminating the need to manually set type on each device.
type: The variable set on each device (or group) that references a node type defined in node_type_keys or custom_node_type_keys.
Typical Node Types per Design¶
Data Center or Campus L3LS EVPN VXLAN Fabric Node Types
- spine
- l3leaf
- l2leaf
- super_spine
- overlay_controller
MPLS/SR Node Types
- p
- pe
- rr
L2LS Fabric Node Types
- l3spine
- leaf
- l2spine
WAN Node Types
- wan_router
- wan_rr
Default Node Types¶
AVD provides several built-in node types optimized for different fabric architectures:
| Node Type Key | Underlay Router | Uplink Type | EVPN Role | MPLS Role | L2 Network Services | L3 Network Services | VTEP | MLAG Support | Connected Endpoints | WAN Role | Underlay Routing Protocol | Overlay Routing Protocol | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| spine | ✅ | p2p | server | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | eBGP | eBGP | |
| l3leaf | ✅ | p2p | client | ✘ | ✅ | ✅ | ✅ | ✅ | ✅ | ✘ | eBGP | eBGP | |
| l2leaf | ✘ | port-channel | N/A | ✘ | ✅ | ✘ | ✘ | ✅ | ✅ | ✘ | ✘ | ✘ | |
| l3spine | ✅ | p2p | none | ✘ | ✅ | ✅ | ✘ | ✅ | ✅ | ✘ | none | none | |
| l2spine | ✘ | port-channel | none | ✘ | ✅ | ✘ | ✘ | ✅ | ✅ | ✘ | ✘ | ✘ | |
| super_spine | ✅ | p2p | none | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | eBGP | eBGP | |
| overlay_controller | ✅ | p2p | server | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | eBGP | eBGP | |
| wan_rr | ✅ | p2p | server | ✘ | ✘ | ✅ | ✅ | ✘ | ✘ | server | none | iBGP | AutoVPN RR or Pathfinder depending on the wan_mode value. |
| wan_router | ✅ | p2p | client | ✘ | ✘ | ✅ | ✅ | ✘ | ✘ | client | none | iBGP | Edge routers for AutoVPN or Edge and Transit routers for CV Pathfinder on the wan_mode value. |
| p | ✅ | p2p | none | none, LSR | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ISIS-SR | iBGP | |
| rr | ✅ | p2p | server | server, LSR | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | ISIS-SR | iBGP | EVPN with MPLS encapsulation |
| pe | ✅ | p2p | client | client, LSR | ✅ | ✅ | ✘ | ✘ | ✅ | ✘ | ISIS-SR | iBGP | EVPN with MPLS encapsulation, L1 Network Services (PW) |
Note
All AVD node types can coexist in the same inventory. i.e.: You can mix campus and WAN node types in the same inventory.
Using Default Node Types¶
The simplest way to use node types is to set the type variable on your devices or groups:
---
type: spine
spine:
defaults:
platform: vEOS-lab
loopback_ipv4_pool: 10.255.0.0/27
bgp_as: 65100
nodes:
- name: dc1-spine1
id: 1
mgmt_ip: 172.16.1.11/24
In this example:
- The
type: spinetells AVD to use the built-inspinenode type - The
spine:key contains the device-specific configuration - AVD will configure this device as a spine switch with EVPN route server capabilities
Automatically Assigning Node Types¶
Instead of manually setting type on each group, use default_node_types to automatically assign types based on hostname patterns.
---
default_node_types:
- node_type: spine
match_hostnames:
- ".*-spine.*"
- node_type: service_leaf
match_hostnames:
- ".*-svc-leaf.*"
- node_type: l3leaf
match_hostnames:
- ".*-leaf.*"
With this configuration:
- Devices with hostnames matching
.*-spine.*(likedc1-spine1) automatically gettype: spine - Devices matching
.*-svc-leaf.*(likedc1-svc-leaf1) automatically gettype: service_leaf - Devices matching
.*-leaf.*(likedc1-leaf1a) automatically gettype: l3leaf
Note
The regex patterns are automatically bounded by ^ and $, so they must match the full hostname.
Order matters - the first matching pattern wins.
Now you can define devices without explicitly setting type:
---
# Note: The 'type' variable is not explicitly set here because the hostname
# 'dc1-svc-leaf1' matches the pattern '.*-svc-leaf.*' in default_node_types,
# which automatically assigns it the 'service_leaf' type.
# This demonstrates automatic node type assignment from the node_types how-to.
service_leaf:
defaults:
platform: vEOS-lab
loopback_ipv4_pool: 10.255.0.0/27
vtep_loopback_ipv4_pool: 10.255.1.0/27
uplink_switches: ['dc1-spine1']
uplink_ipv4_pool: 10.255.255.64/26
mlag_peer_ipv4_pool: 10.255.1.64/27
mlag_peer_l3_ipv4_pool: 10.255.1.96/27
virtual_router_mac_address: 00:1c:73:00:00:99
spanning_tree_priority: 8192
spanning_tree_mode: mstp
nodes:
- name: dc1-svc-leaf1
id: 10
mgmt_ip: 172.16.1.111/24
bgp_as: 65110
uplink_switch_interfaces: [Ethernet3]
Notice that there’s no type: variable - it’s automatically assigned based on the hostname pattern!
Creating Custom Node Types¶
Use custom_node_type_keys to define new node types or modify existing ones.
---
custom_node_type_keys:
- key: service_leaf
type: service_leaf
connected_endpoints: true
default_evpn_role: client
mlag_support: true
network_services:
l2: true
l3: true
vtep: true
underlay_router: true
uplink_type: p2p
default_ptp_priority1: 40
cv_tags_topology_type: leaf
This creates a new service_leaf node type with:
- Connected endpoints support: Servers can connect to these switches
- EVPN client role: Participates in EVPN as a client
- MLAG support: Can form MLAG pairs
- Network services: Supports L2 (VLANs) and L3 (VRFs/SVIs)
- VXLAN VTEP: Acts as a VXLAN tunnel endpoint
- Underlay routing: Participates in underlay routing
- P2P uplinks: Uses point-to-point uplinks to spines
Using Your Custom Node Type¶
Once defined, use your custom node type like any default type. Combined with default_node_types, devices are automatically assigned the custom type:
---
# Note: The 'type' variable is not explicitly set here because the hostname
# 'dc1-svc-leaf1' matches the pattern '.*-svc-leaf.*' in default_node_types,
# which automatically assigns it the 'service_leaf' type.
# This demonstrates automatic node type assignment from the node_types how-to.
service_leaf:
defaults:
platform: vEOS-lab
loopback_ipv4_pool: 10.255.0.0/27
vtep_loopback_ipv4_pool: 10.255.1.0/27
uplink_switches: ['dc1-spine1']
uplink_ipv4_pool: 10.255.255.64/26
mlag_peer_ipv4_pool: 10.255.1.64/27
mlag_peer_l3_ipv4_pool: 10.255.1.96/27
virtual_router_mac_address: 00:1c:73:00:00:99
spanning_tree_priority: 8192
spanning_tree_mode: mstp
nodes:
- name: dc1-svc-leaf1
id: 10
mgmt_ip: 172.16.1.111/24
bgp_as: 65110
uplink_switch_interfaces: [Ethernet3]
Modifying Default Node Types¶
To modify a default node type, use custom_node_type_keys with the same key as the default:
---
custom_node_type_keys:
# Override the default l3leaf to disable connected endpoints
- key: l3leaf
type: l3leaf
connected_endpoints: false # Disable connected endpoints
default_evpn_role: client
mlag_support: true
network_services:
l2: true
l3: true
vtep: true
Warning
When overriding a default node type, you must specify all required properties, not just the ones you want to change.
Common Node Type Properties¶
Key Properties¶
| Property | Type | Description |
|---|---|---|
key |
string | The key used in your data model (e.g., spine, l3leaf) |
type |
string | The type value that devices reference |
connected_endpoints |
boolean | Enable connected endpoints configuration |
default_evpn_role |
string | Default EVPN role: none, client, or server |
default_wan_role |
string | Default WAN role for CV Pathfinder: client or server |
mlag_support |
boolean | Enable MLAG support |
vtep |
boolean | Enable VXLAN VTEP functionality |
underlay_router |
boolean | Enable Layer 3 routing (default: true) |
mpls_lsr |
boolean | Enable MPLS Label Switching Router capabilities |
Network Services¶
network_services:
l1: true # Point-to-point services
l2: true # VLANs
l3: true # VRFs and SVIs (requires l2: true and underlay_router: true)
Routing Protocols¶
default_underlay_routing_protocol: ebgp # ebgp, ibgp, ospf, ospf-ldp, isis, isis-sr, isis-ldp, isis-sr-ldp, none
default_overlay_routing_protocol: ebgp # ebgp, ibgp, her, cvx, none
default_mpls_overlay_role: client # client, server, none
Uplink Configuration¶
- p2p: Point-to-point Layer 3 uplinks (default for most routed node types)
- port-channel: LACP port-channel uplinks (default for l2leaf)
- p2p-vrfs: Layer 3 uplinks with subinterfaces per VRF
- lan: LAN uplinks for campus designs
For a complete list of properties, see the Node Type Customization documentation.
Advanced Example: MPLS PE Router¶
Create a custom PE router with specific MPLS and EVPN settings:
---
custom_node_type_keys:
- key: custom_pe
type: custom_pe
mpls_lsr: true
connected_endpoints: true
default_mpls_overlay_role: client
default_evpn_role: client
network_services:
l1: true # Point-to-point services
l2: true # VLANs
l3: true # VRFs
default_overlay_routing_protocol: ibgp
default_underlay_routing_protocol: isis-sr
default_overlay_address_families:
- evpn
- vpn-ipv4
default_evpn_encapsulation: mpls
Best Practices¶
-
Use
custom_node_type_keysfor additions: When adding new node types, usecustom_node_type_keysinstead of replacing the entirenode_type_keyslist. -
Leverage
default_node_types: Use hostname patterns to automatically assign types, reducing manual configuration and errors. -
Consistent naming conventions: Establish clear hostname patterns that align with your
default_node_typesconfiguration. -
Document custom types: When creating custom node types, document their purpose and intended use cases.
-
Test incrementally: When modifying node types, test changes on a small subset of devices first.
-
Review default properties: Before overriding a default node type, review all its properties to ensure you maintain necessary functionality.
Troubleshooting¶
Configuration not applied¶
Issue: Custom node type defined but configuration not applied.
Solution:
- Verify the
keyincustom_node_type_keysmatches the key used in your data model - Check that devices reference the correct
typevalue - Ensure
custom_node_type_keysis defined at the fabric level (not per-device)
Reference¶
For complete details on all available node type properties, see: