All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Configurable device roles (
NODE_ROLES,SWITCH_ROLES) viasettings.tomlwith fallback to upstream defaults (#216) - Auto-detection of numbered site folders for per-site autoconf output using x99 prefix (#216)
- Autoconf output consolidated under a single prefix split by resource type instead of separate output files (#216)
- typer 0.21.2 → 0.24.1 (#212, #213, #214)
- sushy 5.9.0 → 5.10.0 (#215)
- setuptools 82.0.0 → 82.0.1 (#217)
- Dependency typing_extensions 4.15.0 (#211)
- Export archive now includes COMMIT_INFO.txt with git commit hash, date, branch, and message information (#195)
- Use e2 tools instead of loop devices for export-archive image creation, removing the need for sudo and mount operations (#202)
- gitpython 3.1.45 → 3.1.46 (#200)
- pynetbox 7.5.0 → 7.6.0 (#201)
- setuptools 80.9.0 → 80.10.1 (#203)
- sushy 5.8.0 → 5.9.0 (#197)
- typer 0.20.0 → 0.21.1 (#198, #199)
- yamale 6.0.0 → 6.1.0 (#194)
- frr_local_pref custom field support to autoconf device interface labeling (#193)
- Python 3.14 classifier (#192)
- sushy 5.7.1 → 5.8.0 (#191)
--ignore-errorsoption to theruncommand, allowing Ansible tasks to continue execution even when individual tasks fail (#188)validatecommand for NetBox configuration consistency checks, including IP-prefix validation and VRF consistency verification (#189)
- YAML document start marker (
---) to autoconf-generated files (#186)
- Stable task ordering in autoconf generation to prevent unnecessary Git diffs (#185)
- YAML indentation for nested lists in autoconf output to comply with yamllint rules (#187)
- PortChannel naming now uses per-switch interface numbers instead of deriving from only the first switch's interfaces (#184)
- PortChannel autoconf generation for switch-to-switch connections with automatic LAG interface creation and member assignment (#183)
- MAC address extraction in autoconf now includes switches, making it consistent with OOB IP assignment (#182)
- MAC address extraction in autoconf interface assignments now outputs clean strings instead of serialized Python objects (#181)
- Include switches in autoconf device IP assignments while keeping them excluded from interface MAC address assignments (#180)
- Cluster loopback IP addresses are now only generated for devices that meet Loopback0 interface criteria (#179)
- ansible-core 2.19.2 → 2.19.3 (#175)
- ansible-runner 2.4.1 → 2.4.2 (#177)
- dynaconf 3.2.11 → 3.2.12 (#176)
- pyyaml 6.0.2 → 6.0.3 (#174)
- typer 0.17.4 → 0.20.0 (#172, #173, #178)
- Support both string and integer TOKEN values for NetBox API configuration (#167)
- Rename segment parameters from
_loopback_network_*and_loopback_offset_*to_segment_loopback_network_*and_segment_loopback_offset_*(#166)
- Automatic managed-by-osism tag for device interfaces that receive labels through autoconf device interface labeling (#164)
- Device interface labeling extended to include routers and firewalls in addition to switches (#165)
- Support for direct NetBox API calls via
uritask type withpath,method, andbodyparameters (#160) - YAML syntax validation with meaningful error messages including line/column information (#161)
virtual_chassismodule placement in purge command moved fromvirtualizationtodcimwhere it belongs in NetBox's API structure (#159)
--show-playbooksoption to run command for previewing generated Ansible playbooks without executing them (#151)- Support for
update_vc_childparameter in device_interface tasks (#152) --verboseoption to run command for detailed ansible-playbook output with-vvv(#153, #154)- YAML-formatted output for ansible-playbook using
ansible.builtin.defaultcallback withresult_format=yaml(#155, #157) --paralleloption to purge command for concurrent resource deletion (#158)
--fail-fastoption to run command for early failure exit on first Ansible playbook failure (#147)- Virtual chassis to purge command resource list (#148)
- Support for
registerfield in YAML resource definitions, enabling Ansible's register functionality for storing task results (#149) - FHRP groups and FHRP group assignments to purge command resource list (#150)
- Purge command to delete all managed NetBox resources with dry-run mode, resource type filtering, core resource exclusion, and confirmation prompt (#136)
--verboseflag to purge command for detailed real-time deletion output (#140)- Device interface label autoconf based on switch
device_interface_labelcustom field (#143) - Automatic splitting of autoconf YAML files by resource type for better maintainability (#145)
- Purge command deletes all resources instead of filtering by
managed-by-osismtag (#138) - Purge command also deletes clusters and cluster types (#139)
- Device interface labeling uses
connected_endpointsinstead of cable-based discovery (#144) - Refactor main.py to reduce code duplication and improve modularity by extracting common functionality into reusable helper functions (#146)
- Use
dcim.interfacesinstead ofdcim.device_interfacesfor correct NetBox API endpoint in purge command (#137)
- AttributeError when VARS is not configured in settings by using getattr() with None default (#135)
No changes from v0.20250803.0.
- Cluster-based loopback IP generation in autoconf command, supporting IPv4/IPv6 address assignment for devices with assigned clusters (#131)
- Always create Loopback0 device interface tasks for eligible devices regardless of whether they already exist in NetBox (#132)
- Use separate API call for cluster config context retrieval instead of direct cluster attribute access (#133)
- Add integer validation for device positions in cluster loopback generation with descriptive warnings for missing or invalid positions (#134)
- Loopback0 interface generation for eligible devices in autoconf command, output to 299-autoconf.yml (#128)
- hwsku validation requiring sonic_parameters custom field for switch Loopback0 interface creation (#130)
- Consolidate OOB IP, primary IPv4, and primary IPv6 assignments into single device tasks in autoconf (#127)
- Always generate IP assignment tasks in autoconf regardless of current device state (#125)
- Elevate autoconf assignment logging from debug to info level for better visibility (#126)
- Include switch roles (accessleaf, borderleaf, leaf, spine, etc.) in loopback interface generation (#129)
- Move NETBOX_NODE_ROLES and NETBOX_SWITCH_ROLES constants to global scope to eliminate duplication (#129)
- MAC address handling to use interface.mac_address and interface.mac_addresses fields instead of API filter (#124)
- Device role references to use device.role instead of deprecated device.device_role (#124)
- Exclude switch devices from autoconf interface analysis, improving performance by avoiding unnecessary switch interface processing (#123)
- Global variables support with
VARSconfiguration setting and deep merging, allowing shared variables across resource files with local override precedence (#114) - Directory support for numbered resource organization, enabling
300-devices/directories alongside300-devices.ymlfiles (#115) --filter-taskoption replacing--task-filterfor consistency, with support for both underscore and hyphen variations (#112)autoconfcommand for automated NetBox configuration generation, handling MAC address, OOB IP, primary IPv4/IPv6 assignments (#121)
--limitfilter is now applied at the top-level file/directory level rather than to individual files within directories (#115)
- ansible-core 2.18.6 → 2.19.0 (#117, #118)
- GitPython 3.1.44 → 3.1.45 (#119)
- sushy 5.6.0 → 5.7.0 (#116)
- Do not fail when
settings.IGNORED_FILESis not defined (#111)
- Configuration to ignore specific resource files with
IGNORED_FILESsetting and--include-ignored-filesCLI parameter to override (#109) - Device filtering with
--filter-deviceCLI parameter supporting nested YAML structures like cable terminations (#110) - Example configuration documentation to README (#108)
- Sync example device types and resources: replace Edgecore 5835-54T with 5835-54X, rename 7726-32X-O-AC-B to 7726-32X-O-AC-F, add
managed-by-metalboxtag andsonic_parameterscustom fields to switches (#107)
versioncommand to display the application version (#105)
.gitkeepfiles and other non-directory entries no longer treated as manufacturers in device type library (#106)
- Rename
import-netboxtoimport-archiveandexporttoexport-archivefor naming consistency (#103) - Replace deprecated
pkg_resourceswithimportlib.metadatafor version retrieval (#104)
- Import command for syncing content from netbox-export.tar.gz archives to a configurable destination directory (#101)
--task-filteroption to filter tasks by resource type in the run command (#102)
- Refactored logger initialization into reusable
init_logger()function (#101)
- Configurable
--image-sizeparameter to export command for ext4 image creation (#98) - Platform check for ext4 image export to provide clear error on non-Linux systems (#97)
- Example files from osism/testbed repository with Gilt overlay configuration (#99)
- CLAUDE.md file for AI-assisted development guidance (#100)
- Export command now works without NetBox configuration since it only archives local directories (#96)
- Updated example device types: replaced Cisco manufacturer with Other, added Edgecore 5835-54T-O-AC-F, renamed 7726-32X-O to 7726-32X-O-AC-B, added baremetal device types (#99)
- Updated example resources with tenant support, additional VLANs, prefixes, and expanded testbed node definitions (#99)
- Base resource file
000-base.ymlwith device roles and tags (#99) - Supermicro module type definitions (#99)
- Edgecore 7326-56X-O-AC-B device type (#99)
- python-gilt 2.2.4 added as dev dependency (#99)
- Option to create a 100MB ext4 image file containing the export tarball via
--imageflag onexport-archivecommand (#95)
- Export command to archive NetBox configuration data (devicetypes, moduletypes, resources) as tar.gz (#92)
- Refactored CLI to use Typer app with subcommands while maintaining backward compatibility (#92)
- sushy as a dependency for future Redfish MAC address retrieval (#90)
- Refreshed Zuul CI secrets (#84)
- setuptools 80.3.1 → 80.8.0 (#83, #86, #89)
- typer 0.15.3 → 0.15.4 (#85)
- ansible-core 2.18.5 → 2.18.6 (#87)
- pynetbox 7.4.1 → 7.5.0 (#88)
- ansible-core 2.18.4 → 2.18.5 (#73)
- dynaconf 3.2.10 → 3.2.11 (#81)
- setuptools 78.1.0 → 80.3.1 (#72, #74, #75, #77, #78, #79, #80)
- typer 0.15.2 → 0.15.3 (#76)
- Added debug log messages when devicetype library, moduletype library, or resources are skipped due to no file changes (#70)
- Improved error and debug message wording for clarity (#70)
- Swapped devicetype and moduletype library path checks when detecting changed files (#70)
- Exit condition when all processing is skipped now correctly checks
skipdtl and skipmtl and skipresinstead of the inverted logic (#70)
- Debug mode option for running with verbose logging output (#68)
- Logging of changed files list when running in debug mode (#69)
- Support for processing only changed files via
--no-alwaysflag using Git diff detection (#67)
- Fix operator precedence in devicetype/moduletype library condition check (#67)
- ansible-core 2.18.3 → 2.18.4 (#63)
- ansible-runner 2.4.0 → 2.4.1 (#65)
- gitpython 3.1.44 added as new dependency (#66)
- setuptools 76.0.0 → 78.1.0 (#60, #61, #62, #64)
- Log the name of each handled file (#47)
- Log "Manage resources" step during resource processing (#48)
- Package
requirements.ymlandsettings.toml.sampleas additional data files in the Python package - Validate configuration options with dynaconf validators and provide defaults where possible
- Wait for NetBox REST API availability instead of just the service endpoint
- Exit on failures during the NetBox availability wait
- Negate
IGNORE_SSL_ERRORSbefore passing it tovalidate_certsto align semantically (osism/netbox-manager#77af0bc)
- setuptools to requirements (#43)
- callback_version only printing version and exiting when flag is actually set (#44)
--versionargument to display the current version (#41)- SIGINT signal handler for graceful exit (#42)
- setuptools 75.8.0 (#41)
- Parallel execution of resource files with
--paralleloption (#39) - Dry run mode with
--dryrunoption (#39)
- Group resource files by leading number for dependency-aware execution (#39)
- Fix path to images directory in device type library import (#40)
- natsort dependency, replaced by built-in sorting and grouping (#39)
- Support for debug tasks (#31)
- ansible-core 2.17.7 → 2.18.1 (#8)
- Support for
statefield in resources, allowing resource state management (e.g., absent/present) (#26)
- Paths for device types and module types directories (#25)
- Module type library support with
--skipmtland--skipresCLI options (#24) - Support for
.secrets.tomlin dynaconf configuration (#22) - Edgecore 7326-56X-O-AC-B device type (#21)
- Manager device and connections to example resources (#20)
- Renamed device type library directory from
example/devicetype-librarytoexample/devicetypes(#24) - Renamed DTL classes to generic names (
DTLRepo→Repo,DTLNetBox→NetBox,DTLLogHandler→LogHandler) (#24) - Extended README with installation, configuration, and usage instructions (#19)
- loguru 0.7.2 → 0.7.3 (#23)
- Use scoped PyPI token in Zuul CI configuration (#16)
- Clean up
__init__.pyfile by removing legacy version handling viapkg_resources(#18)
- Fix relative import of
dtlmodule (#17)
- Initial project setup with CLI application using Typer framework and loguru logging (#3)
- Device Type Library (DTL) import functionality based on netbox-community/Device-Type-Library-Import (#4)
- Configuration management using dynaconf with
settings.tomlsupport (#4) - Example device type definitions for Edgecore 7726-32X-O (#4)
- Ansible playbook execution for managing NetBox resources (#6, #9)
- Custom YAML-based data format for resource definitions (#10)
- CLI options
--limit,--wait, and--skipdtl(#11) - Natural sorting of resource files (#11)
- Variable support in resource files via
varsblocks (#11) - Connection/cable resource examples (#13)
pyproject.tomlwith setuptools-git-versioning and Apache 2.0 LICENSE (#14)- PyPI package publishing via Zuul CI (#15)
- Renamed project from netbox-connection-manager to netbox-manager (#4)
- Moved device type library examples to
example/directory (#7)
- Device type library filter parameter names (
devicetype_id→device_type_id,moduletype_id→module_type_id) (#13)