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.yml to 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 the name=value format. Previously, the -e parameter was passed directly to Ansible.

  • When using netlab config –reload, extra variables (-e parameter) 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_cli connections to Cisco IOS/IOS-XE devices when ansible-pylibssh version 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 the ansible_network_cli_ssh_type variable 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. Set multilab.change.name and multilab.change.defaults.name default values to ml_{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.yml to 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)