Changes in Release 26.01
New Functionality
Complete rewrite of the device configuration file generation process. Device configuration files are created by netlab create (the first step in the netlab up process) and deployed via bash scripts or an Ansible playbook invoked by netlab initial (one of the last steps in the netlab up process). See also breaking changes.
netlab works with Ansible 12+ but still installs version 11.x with the netlab install ansible command. In the future (when the commercial version of Ansible catches up with the Ansible core release 2.17), we’ll continue pinning the Ansible core version to the version used in the commercial product.
EVPN for VXLAN-over-IPv6
The ‘skip_config’ node attribute can be used to deploy partially-provisioned labs
Lightweight netlab API HTTP server by Craig Johnson
Minor improvements
netlab no longer creates the YAML version of the topology snapshot (netlab.snapshot.yml). Set the defaults.netlab.create.output.yaml.output topology default to
netlab.snapshot.ymlto restore this behavior.The default netlab create output formats can be configured in topology defaults
Warn about devices that cannot have their configurations reloaded
Container configuration scripts are run in parallel, resulting in faster deployment of large topologies
New Device Features
Arista EOS:
EVPN for VXLAN-over-IPv6
Citrix Netscaler:
Rudimentary support for CPX containers with initial IPv4 configuration
Fixes in Device Configuration Templates
Arista EOS:
Fix RIPv2 template
Cisco IOS/IOS-XE:
Use paramiko for network_cli on Cisco IOS with new ansible-pylibssh
Cisco IOL:
Change default IOL container tags to release 17.16.01a with SRv6 support
Cisco IOS/XR:
Apply ‘wait for SSH server’ to all IOS XR containers
Cumulus:
Remove regex filter from ISC DHCP relay configuration template
Cumulus NVUE:
Use rr_client flag to configure RR clients in EVPN AF
Remove obscure Ansible J2 filters from configuration templates
Set system MAC to management interface MAC
FRR:
Change default container release to 10.5.1
Junos:
Do not use ‘ipv6’ filter to identify LLA-only interfaces
Mikrotik RouterOS7:
Fix VLAN routed subinterfaces, cleanup config templates
SR Linux:
Replace ‘link-local’ check in SR Linux initial configuration template
SR-OS:
Clean up EVPN template
VyOS:
VyOS needs to reset BGP sessions after changing session attributes
Fix RIP template
Replace reference to netlab_provider in VyOS config template
Breaking changes
Release 26.01 includes numerous potentially-breaking changes. While most of them should not affect casual netlab users, some might break additional tooling one might have built around netlab. We apologize for the inconvenience :(
Configuration Template Changes
netlab no longer uses Ansible to generate device configuration files. The device configuration templates thus cannot use most Ansible-specific Jinja2 filters (more details)
The behavior of the internal ipaddr filter has been modified: when called with an integer argument (e.g.,
ipaddr(0)), it now returns a CIDR prefix (e.g.,10.0.0.1/24) instead of just an IP address (e.g.,10.0.0.1). This makes the behavior consistent with Ansible’s ipaddr filter.The hosts variable (mapping node names to IP addresses) is being renamed to host_addrs to stop Ansible complaints. Both variable names are currently available to maintain backward compatibility, but hosts will be deprecated in a future release.
Configuration Deployment Changes
The netlab create command (the first step in the netlab up process) generates all device configurations. Errors in device configuration templates (including custom configuration templates) are thus identified early in the lab deployment process.
The device configurations are recreated by netlab initial when you run it manually to ease the device configuration template development process.
The netlab initial command can use bash scripts to deploy configurations on Linux-based containers.
netlab initial uses Ansible solely to deploy device configurations and only when needed. This approach works well with Ansible 12+.
The netlab config command has been completely rewritten to support Ansible 12+ while maintaining compatibility with earlier versions. Configuration templates are now rendered by netlab’s internal templating engine before being deployed via Ansible.
The
-e(extra variables) parameter in netlab config now only supports thename=valueformat. Previously, the-eparameter was passed directly to Ansible.When using netlab config –reload, extra variables (
-eparameter) are no longer allowed, as the command reloads previously saved configurations.
File and Directory Changes
clab_files directory has been renamed to node_files and now contains all node configuration snippets, not just containerlab-specific files. Apart from a change in file names, this change does not affect any netlab functionality.
Internal node attribute clab._template_cache, introduced in release 25.12, is no longer used because there’s no longer any need to pass information between netlab create and netlab initial.
Ansible Compatibility
We tested netlab with Ansible release 13.1, but you might still experience problems with rarely-used devices. We recommend using Ansible 11.x (installed with the netlab install ansible command).
netlab now automatically uses paramiko for
network_cliconnections to Cisco IOS/IOS-XE devices whenansible-pylibsshversion 1.3.0 or higher is installed. This change addresses compatibility issues between newer versions of ansible-pylibssh and Cisco IOS devices. You can override this behavior by setting theansible_network_cli_ssh_typevariable at the device or node level.
Other Breaking Changes
Default multilab lab names start with
ml-(previously:ml_) to reduce the underscore-induced problems in some Linux distros and newer versions of the OpenSSH library. Setmultilab.change.nameandmultilab.change.defaults.namedefault values toml_{id}to revert to the old behavior.netlab no longer creates the YAML version of the topology snapshot (netlab.snapshot.yml). Set the defaults.netlab.create.output.yaml.output topology default to
netlab.snapshot.ymlto restore this behavior.
Bug Fixes
Display build instructions for internally-built containers (#3017)
Prune search paths after the plugin output hooks (#3016)
Replace underscores with hyphens in multilab lab names (#3008)
Consistently quote node/group names in DOT graph descriptions (#3007)
Use clab.name as node container name (#2995)
Move callback and YAML messages from ‘verbose’ to ‘debug’ class (#3000)
Initialize attribute validation when re-reading validation tests
Add RIPv2 unnumbered interface validation with device feature flag (#2978)
Add empty nodeset validation to netlab initial and config commands (#2979)
set_fact takes precedence over vars in Ansible release 13
Light cleanup of RP router_id handling (#2960)
Fix the command descriptions in numerous source files
make ipaddr filter available under ansible.netcommon prefix
Compare string values of current and pickled system default paths
Add a unique timestamp to topology data structure (#2953)
combine, difference and to_yaml Jinja2 filters (+ bug fixes) (#2947)
‘make_a_list’ should be able to deal with generic iterators
Fix[B]: Use underscores not hyphens in Ansible device groups
Capture STDOUT or STDERR from external commands in a global var
Return status or abort on Ansible playbook failure
Remove Jinja2 ‘default’ calculation from default system paths
Start Ansible from ‘netlab initial’ only when needed (#2899)
RF: Move initial.py into netsim/cli/initial/init.py (#2898)
Sort node names in ‘hosts’ name-to-address dictionary
Use the common format for ‘custom.files’ file names
sort hostvars when generating /etc/hosts file on Linux VMs
The ‘hwaddr’ J2 filter must use ‘unix_expanded’ MAC format
Make netlab Jinja2 handling more Ansible-like
Cumulus Linux (classic) needs ‘netlab_frr_daemons’ group var
Clean up router_id tests in templates (#2932)
More crazy edge cases in ipaddr Jinja2 filter
Use FQFN for Jinja2 ipv4, ipv6, and ipaddr filters (#2942)
Collect OSPF areas in Python code (#2925) (#2936)
Simplify STP configuration templates by normalizing data model (#2927)
SRLinux: Move normalization of interface descriptions to device quirks (#2926)
ruamel refuses to dump a pathlib.Path object into a YAML file
Documentation Fixes
Describe debugging flags
Update architecture diagrams for netlab commands
Add proxy ARP external connectivity documentation (#2986)
Caveat: Nexus OS VMs don’t run on Ubuntu 24.04 (#2974)
Document the Linux node initialization scripts (#2903/#2907) (#2909)