mcpField
N
netbox-automation-patterns

netbox-automation-patterns

github.com/netboxlabsCloud & DevOps2153 installsUpdated 2w ago
Repository

About netbox-automation-patterns

A skill for teams integrating NetBox into automation, covering event rules, webhooks, Ansible, Terraform, and GitOps patterns. It also addresses version compatibility and operational considerations.

Key features

  1. 01Event rules and webhook automation
  2. 02Ansible state management and dynamic inventory
  3. 03Terraform resources and data sources
  4. 04GitOps workflow design
  5. 05Guidance on tokens, idempotency, and compatibility

Use cases

  1. 01Triggering CI/CD deployments from NetBox changes
  2. 02Generating Ansible inventory from NetBox
  3. 03Managing NetBox and infrastructure with Terraform
  4. 04Building configuration pipelines with NetBox as source of truth

MCP support

Notes that a configured NetBox MCP server can be used to check event rules and webhook configuration; this skill does not provide an MCP service.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/netboxlabs/skills --skill netbox-automation-patterns

After installing, type/netbox-automation-patternsin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
ansible-patterns.md
event-rules-and-webhooks.md
gitops-workflows.md
terraform-patterns.md

Details

From the project README

NetBox Automation Patterns

Your knowledge of NetBox automation tools may be outdated. Ansible collection modules, Terraform provider resources, and event rule behavior change between releases. Prefer retrieval over pre-trained knowledge.

Retrieval Sources

SourceURL / MethodUse for
NetBox Ansible collectionhttps://github.com/netbox-community/ansible_modulesModule list, parameters, examples
Ansible docshttps://netboxlabs.com/docs/integrations/tool-integrations/netbox-ansible-collection/Integration guide
Terraform providerhttps://github.com/e-breuninger/terraform-provider-netboxResources, data sources
Event rules docshttps://netboxlabs.com/docs/netbox/features/event-rules/Webhook/script triggers
NetBox MCP serverIf configured — verify event rules, webhooks existValidate automation config

This skill covers how to integrate NetBox into automation workflows. It spans event-driven triggers, configuration management, infrastructure-as-code, and CI/CD pipelines. This is a cross-cutting skill — it ties together multiple open-source tools around NetBox as the source of truth.

Load this skill when:

  • Building webhook-driven automation triggered by NetBox changes
  • Configuring Ansible to use NetBox as dynamic inventory or state manager
  • Managing NetBox resources via Terraform
  • Designing GitOps pipelines with NetBox in the loop

Out of scope: NetBox core administration, plugin development, REST/GraphQL API basics (see netbox-api-integration).


Quick Reference: Which Tool for Which Pattern?

GoalToolPattern
React to changes in NetBoxEvent Rules + WebhooksPush notification to external system
React to changes internallyEvent Rules + Custom ScriptsRun logic inside NetBox
Define intended state in NetBoxAnsible modules (netbox.netbox)Declarative, idempotent
Use NetBox as Ansible inventorynb_inventory pluginDynamic inventory from NetBox data
Manage NetBox + cloud togetherTerraform (e-breuninger/netbox)IaC lifecycle, state tracking
Allocate next available IP/prefixTerraform available_* resourcesAuto-allocation from parent
NetBox → config generation → deployGitOps pipelineCI/CD with NetBox as source of truth

Event-Driven Automation

NetBox's event rule system (introduced in 3.7) is the foundation for reactive automation. An event rule matches object changes to actions.

Event Rule Essentials
  • Trigger scope: Object type(s) + event type(s) (created, updated, deleted, job started/completed/failed/errored)
  • Conditions: Optional JSON conditions to filter — e.g., only fire when status.value == "active". On 4.7+ conditions can also test the change itself: {"attr": "status", "op": "changed"} plus snapshots.prechange.<attr> / snapshots.postchange.<attr> paths, and a regex operator
  • Action types: webhook (external HTTP call), script (run a custom script), notification (notify users), plus plugin-registered action types on 4.7+
  • Processing: Asynchronous via Redis/RQ — the user request completes without waiting
Key Guidelines
  1. Always scope with conditions — Unscoped event rules fire on every matching change, creating noise and load. Use conditions to target specific statuses, roles, or tags. To fire only on a transition (status becomes active), use the 4.7 changed operator; on 4.5/4.6 compare snapshots.prechange/postchange in the body template instead. On 4.7+ a condition that references a non-existent attribute fails closed and logs — a rule that "stopped firing" after an edit is usually a typo.

  2. Events are async — Don't assume immediate execution. The event is queued to Redis/RQ and processed by a worker. Design receivers to handle delays.

  3. Choose the right action type:

    • External systems → webhook
    • Internal NetBox logic → custom script (see netbox-custom-scripts)
    • Human notification → notification group
  4. Test with the built-in receiver before production:

    python netbox/manage.py webhook_receiver  # Listens on port 9000
    
  5. Coalescing behavior — Multiple changes to the same object within one request are coalesced. Only the final state triggers the event. Delete events eagerly serialize data since the object won't exist later.

  6. Bound receiver time (4.7+) — Set a per-webhook timeout (or WEBHOOK_DEFAULT_TIMEOUT, default 60 s); it must stay below RQ_DEFAULT_TIMEOUT. Receivers should acknowledge fast and process asynchronously.

See references/event-rules-and-webhooks.md for payload format, HMAC signing, Jinja2 templating, and security considerations.


Ansible Integration

The netbox.netbox Ansible collection (GPLv3) provides modules, dynamic inventory, and lookup plugins.

Three Primary Use Cases
  1. State management — Use modules (netbox_device, netbox_ip_address, etc.) to ensure NetBox objects match desired state. All modules are idempotent with state: present/absent.

  2. Dynamic inventory — Use nb_inventory to generate Ansible inventory from NetBox. Group by device roles, sites, regions, tenants, tags, or platforms.

  3. Data lookup — Use nb_lookup to query NetBox data within playbooks.

Key Guidelines
  1. Set config_context: False in inventory unless you need it. On 4.5/4.6 this avoids an expensive per-device render server-side; on 4.7+ context is pre-rendered and cached, and the plugin sends ?exclude=config_context (ignored on every 4.7.x — 4.7.3's ?omit= optimisation doesn't reach it, as of netbox.netbox 3.23.1), so the option only trims hostvars.

  2. Use query_filters to limit inventory scope server-side rather than filtering client-side.

  3. Scope tokens properly — Read-only tokens for inventory/lookup, write tokens only for modules that create/modify objects.

  4. Version compatibility — The collection's policy is the two most recent NetBox releases; the latest release (v3.23.1, 2026-10) is CI-tested through 4.5 and declares no 4.6/4.7 support yet. Pin the collection and test against your NetBox minor.

  5. Filter with device_query_filters — e.g., has_primary_ip: 'true' to exclude devices without management IPs.

See references/ansible-patterns.md for module examples, inventory configuration, and lookup patterns.


Terraform Integration

The e-breuninger/netbox Terraform provider manages NetBox resources as infrastructure-as-code.

Key Guidelines
  1. Pin provider version to match NetBox version — NetBox makes breaking API changes in minor releases. Check the provider's compatibility matrix: v5.6.1+ covers NetBox 4.3–4.6.5; the v6.0 rewrite (RC as of 2026-09) targets 4.6.8–4.6.10; no release declares 4.7 support yet.

  2. Understand available_* resource lifecycle — netbox_available_ip_address and netbox_available_prefix allocate on create and cannot be "updated." They have unique lifecycle behavior compared to regular resources.

  3. Plan for state drift — If someone modifies NetBox outside Terraform, the next terraform plan shows drift. Decide on a drift remediation strategy.

  4. Coverage varies by area — The provider has strongest coverage for IPAM and virtualization. Other models may have incomplete resource support.

  5. Use data sources for read-only lookups — Most resources have corresponding data sources for referencing existing NetBox objects without managing them.

See references/terraform-patterns.md for provider setup, resource examples, and the available_* allocation pattern.


GitOps Workflows

NetBox integrates into GitOps pipelines as either the source of truth or a state mirror.

Common Architectures
PatternFlowBest For
Webhook-drivenNetBox change → webhook → CI/CD → deployReal-time reactions
Polling/exportCron → export NetBox data → Git commit → CI/CDBatch config generation
Ansible pullAnsible + nb_inventory → generate configs → pushPlaybook-driven workflows
Terraform unifiedTerraform manages NetBox + infrastructure togetherCloud + NetBox in sync
Key Guidelines
  1. Decide on a single source of truth — Either NetBox prescribes state and Git/automation enforces it, or Git is the source and NetBox mirrors it. Don't have two masters.

  2. Use config contexts for template data — Config contexts provide per-device, per-role, or per-site configuration data that Jinja2 templates consume during config generation.

  3. Webhook → CI/CD for real-time pipelines — Combine event rules with webhooks to trigger GitHub Actions, GitLab CI, or Jenkins on NetBox changes.

  4. Use tags as automation hints — Tag interfaces, devices, or prefixes to signal automation intent (e.g., tag "OSPF" on an interface to include it in OSPF config generation).

See references/gitops-workflows.md for pipeline architecture details and examples.


Cross-Cutting Concerns

These apply across all automation approaches:

  • Token management: Use scoped tokens with minimal permissions. Prefer v2 tokens (NetBox 4.5+) with Bearer auth. See netbox-api-integration for token format details.

  • Rate limiting: Large automation runs (bulk Ansible plays, Terraform applies) should implement backoff to avoid overwhelming the NetBox API. On 4.7+, large custom bulk writes can use ?background=true (HTTP 202 + job URL; poll the job for the result) to avoid proxy timeouts — see netbox-api-integration.

  • Pagination: All tools (pynetbox, Terraform provider, Ansible collection) handle pagination internally, but be aware of it when writing custom integrations. NetBox 4.6 adds cursor-based start pagination (an efficient alternative to deep offset scans) — see netbox-api-integration.

  • Idempotency: Ansible modules are idempotent by design. Terraform is declarative. Webhooks are fire-and-forget — implement idempotency on the receiver side.

  • Testing: Use NetBox's official Docker image for CI/CD testing environments (netboxcommunity/netbox:v4.7-5.1.1; tag = v<netbox>-<netbox-docker>). Spin up a disposable instance for integration tests.


Version Notes

NetBox 4.7 (2026-09-02)
  • Snapshot-aware conditions: changed/unchanged operators, snapshots.prechange.<attr> / snapshots.postchange.<attr> paths, regex operator; unresolvable attributes fail closed and log to netbox.event_rules. Snapshot values are raw (status, not status.value).
  • Webhook context: username and request_id removed — use request.user / request.id. send_webhook() lost its username argument: drain RQ queues before upgrading or queued webhook jobs fail with TypeError.
  • Webhook timeout: per-webhook timeout field and WEBHOOK_DEFAULT_TIMEOUT (default 60); must be less than RQ_DEFAULT_TIMEOUT, else NetBox refuses to start / save.
  • Event rules: action_object_type optional; plugins register action types (EventRuleAction); action_is_available flags rules whose plugin is gone.
  • Payload/API deltas that reach automation tools: selection custom fields are {value,label} objects in REST (and thus webhook data); config_context in device/VM output by default (omit it with ?omit=config_context on 4.7.3+; ?exclude= is a no-op on 4.7); ipam.Service protocol/ports deprecated for port_mappings; bulk write errors are per-object; ?background=true on bulk writes.
  • Ecosystem: netbox-docker 5.x (v4.7-5.1.1) requires NetBox 4.7+; Ansible collection and Terraform provider have not declared 4.7 support (see references).
NetBox 4.6 (2026-05-05)
  • Webhook context gains the request object; username/request_id deprecated.
  • Cursor-based start pagination for large reads.
  • On 4.5 only username/request_id exist in the webhook context.

References

DocumentWhen to Load
references/event-rules-and-webhooks.mdBuilding webhook integrations, configuring event rules, debugging webhook delivery
references/ansible-patterns.mdWriting Ansible playbooks that manage or query NetBox
references/terraform-patterns.mdManaging NetBox resources with Terraform
references/gitops-workflows.mdDesigning CI/CD pipelines with NetBox in the loop

Comments

Markdown supported