Files
lmiranda 747a2b15e5 refactor(cmdb-assistant): extract skills and slim commands
- Extract 9 skill files from command knowledge:
  - mcp-tools-reference.md: Complete NetBox MCP tools reference
  - system-discovery.md: Bash commands for system info gathering
  - device-registration.md: Device registration workflow
  - sync-workflow.md: Machine sync process
  - audit-workflow.md: Data quality audit checks
  - ip-management.md: IP/prefix management and conflict detection
  - topology-generation.md: Mermaid diagram generation
  - change-audit.md: NetBox change audit workflow
  - visual-header.md: Standard visual header pattern

- Slim all 11 commands to under 60 lines:
  - cmdb-sync.md: 348 -> 57 lines
  - cmdb-register.md: 334 -> 51 lines
  - ip-conflicts.md: 238 -> 58 lines
  - cmdb-audit.md: 207 -> 58 lines
  - cmdb-topology.md: 194 -> 54 lines
  - initial-setup.md: 176 -> 74 lines
  - change-audit.md: 175 -> 57 lines
  - cmdb-site.md: 68 -> 50 lines
  - cmdb-ip.md: 65 -> 52 lines
  - cmdb-device.md: 64 -> 55 lines
  - cmdb-search.md: 46 lines (unchanged)

- Update agent to reference skills for best practices
- Preserve existing netbox-patterns skill

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 17:21:21 -05:00

4.4 KiB

Sync Workflow Skill

How to synchronize machine state with NetBox.

Prerequisites

Load these skills:

  • system-discovery - Bash commands for system info
  • mcp-tools-reference - MCP tool reference

Sync Workflow

Phase 1: Device Lookup

dcim_list_devices name=<hostname>

If not found, suggest /cmdb-register first.

If found:

  • Store device ID and current field values
  • Fetch interfaces: dcim_list_interfaces device_id=<device_id>
  • Fetch IPs: ipam_list_ip_addresses device_id=<device_id>
  • Check clusters/VMs: virt_list_clusters, virt_list_vms cluster=<cluster_id>

Phase 2: Current State Discovery

Use commands from system-discovery skill.

Phase 3: Comparison

Device Attributes

Field Compare
Platform OS version changed?
Status Still active?
Serial Match?
Description Keep existing

Network Interfaces

Change Type Detection
New interface Exists locally but not in NetBox
Removed interface In NetBox but not locally
Changed MAC MAC address different
Interface type Type mismatch

IP Addresses

Change Type Detection
New IP Exists locally but not in NetBox
Removed IP In NetBox but not locally
Primary IP changed Default route interface changed

Docker Containers

Change Type Detection
New container Running locally but no VM in cluster
Stopped container VM exists but container not running
Resource change vCPUs/memory different

Phase 4: Diff Report

## Sync Diff Report

**Device:** <hostname> (ID: <device_id>)
**NetBox URL:** https://netbox.example.com/dcim/devices/<id>/

### Device Attributes
| Field | NetBox Value | Current Value | Action |
|-------|--------------|---------------|--------|
| Platform | Ubuntu 22.04 | Ubuntu 24.04 | UPDATE |

### Network Interfaces

#### New Interfaces (will create)
| Interface | Type | MAC | IPs |
|-----------|------|-----|-----|
| tailscale0 | virtual | - | 100.x.x.x/32 |

#### Removed Interfaces (will mark offline)
| Interface | Type | Reason |
|-----------|------|--------|
| eth1 | 1000base-t | Not found locally |

#### Changed Interfaces
| Interface | Field | Old | New |
|-----------|-------|-----|-----|
| eth0 | mac_address | aa:bb:cc:00:00:00 | aa:bb:cc:11:11:11 |

### IP Addresses

#### New IPs (will create)
- 192.168.1.150/24 on eth0

#### Removed IPs (will unassign)
- 192.168.1.100/24 from eth0

### Docker Containers

#### New Containers (will create VMs)
| Container | Image | Role |
|-----------|-------|------|
| media_lidarr | linuxserver/lidarr | Media Management |

### Summary
- **Updates:** X
- **Creates:** Y
- **Removals/Offline:** Z

Phase 5: Apply Updates

Device Updates

dcim_update_device id=<device_id> platform=<new_platform_id>

Interface Updates

New:

dcim_create_interface device=<device_id> name=<name> type=<type>

Removed (mark offline):

dcim_update_interface id=<id> enabled=false description="Marked offline by cmdb-sync"

Changed:

dcim_update_interface id=<id> mac_address=<new_mac>

IP Address Updates

New:

ipam_create_ip_address address=<ip/prefix> assigned_object_type="dcim.interface" assigned_object_id=<id>

Removed (unassign):

ipam_update_ip_address id=<id> assigned_object_type=null assigned_object_id=null

Primary IP Update

dcim_update_device id=<device_id> primary_ip4=<new_primary_ip_id>

Container/VM Updates

New:

virt_create_vm name=<name> cluster=<cluster_id> status="active"

Stopped:

virt_update_vm id=<id> status="offline"

Phase 6: Journal Entry

extras_create_journal_entry
  assigned_object_type="dcim.device"
  assigned_object_id=<device_id>
  comments="Device synced via /cmdb-sync command\n\nChanges applied:\n- <list>"

Sync Modes

Dry Run Mode

  • Complete phases 1-4 (lookup, discovery, compare, diff report)
  • Skip phases 5-6 (no updates, no journal)
  • End with: "Dry run complete. No changes applied."

Full Sync Mode

  • Skip user confirmation
  • Update all fields even if unchanged (force refresh)

Error Handling

Error Action
Device not found Suggest /cmdb-register
Permission denied Note which failed, continue others
Cluster not found Offer to create or skip container sync
API errors Log error, continue with remaining