Skip to content
LinkState
Go back

Migrating from YAML inventories without losing rollback

Introduction to Staged Migration

NetBox and Nautobot are popular open-source inventory management platforms designed to help organizations manage and track their network devices, IP addresses, and other IT assets. These platforms provide a centralized repository for storing and retrieving inventory data, enabling teams to make informed decisions and streamline their operations.

Benefits of Consolidating Inventory

Consolidating inventory data into NetBox/Nautobot offers several benefits, including:

Pre-Migration Planning

Assessing Current Inventory State

Before migrating to NetBox/Nautobot, it’s essential to assess the current inventory state, including:

find . -name "*.yaml" -o -name "*.csv" -o -name "*.xlsx"

Identifying Objectives and Criteria for Migration

Clearly define the objectives and criteria for the migration, including:

## Objectives
* Improve data accuracy and completeness by 90%
* Enhance collaboration and visibility among teams by 80%
* Simplify inventory management and tracking by 70%
## Criteria
* Data accuracy and completeness
* Collaboration and visibility among teams
* Simplification of inventory management and tracking

Establishing a Dual-Write Window Strategy

Establish a dual-write window strategy to ensure data consistency and accuracy during the migration process.

import datetime
class DualWriteWindow:
    def __init__(self, start_time, end_time):
        self.start_time = start_time
        self.end_time = end_time
    def is_within_window(self, current_time):
        return self.start_time <= current_time <= self.end_time
dual_write_window = DualWriteWindow(datetime.datetime(2023, 3, 1, 8, 0, 0), datetime.datetime(2023, 3, 1, 17, 0, 0))
print(dual_write_window.is_within_window(datetime.datetime(2023, 3, 1, 12, 0, 0)))

Stage 1: Data Collection and Standardization

Gathering Scattered YAML and Spreadsheet Data

Gather scattered YAML and spreadsheet data from various sources.

scp user@host:/path/to/data/*.yaml /local/path/
scp user@host:/path/to/data/*.csv /local/path/
scp user@host:/path/to/data/*.xlsx /local/path/

Standardizing Data Formats for Import

Standardize data formats for import into NetBox/Nautobot.

import csv
import json
def convert_yaml_to_csv(yaml_data):
    csv_data = []
    for item in yaml_data:
        csv_data.append([item['name'], item['ip_address']])
    return csv_data
def normalize_spreadsheet_data(spreadsheet_data):
    normalized_data = []
    for row in spreadsheet_data:
        normalized_data.append([row['Name'], row['IP Address']])
    return normalized_data
yaml_data = [{'name': 'Device1', 'ip_address': '192.168.1.1'}, {'name': 'Device2', 'ip_address': '192.168.1.2'}]
csv_data = convert_yaml_to_csv(yaml_data)
print(csv_data)

Stage 2: NetBox/Nautobot Setup and Configuration

Installing and Configuring NetBox/Nautobot

Install and configure NetBox/Nautobot.

sudo apt-get install netbox

Defining Device and Inventory Models

Define device and inventory models in NetBox/Nautobot.

from netbox.models import Device, Inventory
class DeviceType(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
class InventoryField(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
device_type = DeviceType(name='Router', description='Network router')
device_type.save()
inventory_field = InventoryField(name='Serial Number', description='Device serial number')
inventory_field.save()

Stage 3: Data Import and Validation

Importing Standardized Data into NetBox/Nautobot

Import standardized data into NetBox/Nautobot.

import requests
api_url = 'https://netbox.example.com/api/dcim/devices/'
api_token = 'your_api_token'
devices = [{'name': 'Device1', 'ip_address': '192.168.1.1'}, {'name': 'Device2', 'ip_address': '192.168.1.2'}]
for device in devices:
    response = requests.post(api_url, headers={'Authorization': f'Token {api_token}'}, json=device)
    print(response.status_code)

Stage 4: Dual-Write Window Implementation

Configuring Dual-Write Window Settings

Configure dual-write window settings.

import schedule
def dual_write_window():
    pass
schedule.every(1).day.at("08:00").do(dual_write_window)

Stage 5: Checkpoint Diffs and Automation Cutover

Implementing Checkpoint Diffs for Data Comparison

Implement checkpoint diffs for data comparison.

import requests
api_url = 'https://netbox.example.com/api/dcim/devices/'
api_token = 'your_api_token'
def checkpoint_diff():
    response = requests.get(api_url, headers={'Authorization': f'Token {api_token}'})
    print(response.status_code)

Troubleshooting Common Migration Issues

Resolving Data Import and Validation Errors

Resolve data import and validation errors.

tail -f /var/log/netbox/api.log

Conclusion and Next Steps

Reviewing Migration Success and Lessons Learned

Review migration success and lessons learned.

## Success
* Data accuracy and completeness: 90%
* Automation reliability: 95%
## Lessons Learned
* Data optimization
* Server configuration

Note: The code examples provided are for illustration purposes only and may require modification to suit your specific use case. Additionally, the your_api_token placeholder should be replaced with a valid API token for your NetBox/Nautobot instance.


Share this post on:

Previous Post
Expected Next Hop Versus Resolved Next Hop
Next Post
Custom fields, tags, or plugins