Skip to content

Bulk Operations

PowerNetbox supports high-performance bulk operations for creating, updating, and deleting multiple resources in a single API request. This significantly improves performance when working with large datasets.

Overview

Bulk operations use Netbox's native bulk API endpoints, which process arrays of objects in batches. This is much faster than making individual API calls for each resource.

Supported Functions

Function Operation Description
New-NBDCIMDevice POST Create multiple devices
New-NBDCIMInterface POST Create multiple device interfaces
New-NBIPAMAddress POST Create multiple IP addresses
New-NBIPAMPrefix POST Create multiple IP prefixes
New-NBIPAMVLAN POST Create multiple VLANs
New-NBVirtualMachine POST Create multiple VMs
New-NBVirtualMachineInterface POST Create multiple VM interfaces
Set-NBDCIMDevice PATCH Update multiple devices
Remove-NBDCIMDevice DELETE Delete multiple devices

Common Parameters

Parameter Type Default Description
-InputObject PSCustomObject - Pipeline input for bulk mode
-BatchSize int (1-1000) 50 Items per API request
-Force switch - Skip confirmation prompts

Basic Usage

Bulk Create Devices

```powershell

Create objects with required properties

$devices = 1..10 | ForEach-Object { [PSCustomObject]@{ Name = "server-$_" Role = 1 # Device role ID Device_Type = 1 # Device type ID Site = 1 # Site ID Status = "planned" } }

Pipe to function with -Force to skip prompts

$created = $devices | New-NBDCIMDevice -BatchSize 5 -Force

View results

$created | Select-Object id, name, status ```

Bulk Create VLANs

```powershell

Create VLAN range 100-199

$vlans = 100..199 | ForEach-Object { [PSCustomObject]@{ VID = $ Name = "VLAN$" Status = "active" Site = 1 } }

$vlans | New-NBIPAMVLAN -BatchSize 50 -Force ```

Bulk Create IP Addresses

```powershell

Create all IPs in a /24 subnet

$addresses = 1..254 | ForEach-Object { [PSCustomObject]@{ Address = "192.168.1.$/24" Status = "active" Description = "Host $" } }

$addresses | New-NBIPAMAddress -BatchSize 100 -Force ```

Bulk Create VM Interfaces

```powershell

Get all VMs in a cluster

$vms = Get-NBVirtualMachine -Cluster 1

Create eth0 interface for each VM

$interfaces = $vms | ForEach-Object { [PSCustomObject]@{ Virtual_Machine = $_.id Name = "eth0" Enabled = $true Description = "Primary interface" } }

$interfaces | New-NBVirtualMachineInterface -BatchSize 50 -Force ```

Bulk Update

Update Device Status

```powershell

Get devices to update

$devices = Get-NBDCIMDevice -Status "planned"

Create update objects (must include Id)

$updates = $devices | ForEach-Object { [PSCustomObject]@{ Id = $_.id Status = "active" Comments = "Deployed on $(Get-Date -Format 'yyyy-MM-dd')" } }

Bulk update

$updated = $updates | Set-NBDCIMDevice -BatchSize 50 -Force

Write-Host "Updated $($updated.Count) devices" ```

Update Multiple Properties

```powershell

Update devices with multiple changes

$updates = @( [PSCustomObject]@{ Id = 100; Status = "active"; Serial = "SN001" } [PSCustomObject]@{ Id = 101; Status = "active"; Serial = "SN002" } [PSCustomObject]@{ Id = 102; Status = "staged"; Serial = "SN003" } )

$updates | Set-NBDCIMDevice -Force ```

Bulk Delete

Delete by Status

```powershell

Get decommissioned devices

$toDelete = Get-NBDCIMDevice -Status "decommissioning"

Bulk delete (WARNING: This cannot be undone!)

$toDelete | Remove-NBDCIMDevice -BatchSize 50 -Force ```

Delete by Query

```powershell

Delete all test devices

Get-NBDCIMDevice -Name "test-*" | Remove-NBDCIMDevice -Force ```

CSV Import

Import Devices from CSV

csv Name,Role,Device_Type,Site,Status,Serial server-01,1,1,1,active,SN001 server-02,1,1,1,active,SN002 server-03,1,1,1,planned,SN003

powershell Import-Csv devices.csv | New-NBDCIMDevice -BatchSize 100 -Force

Import VLANs from CSV

csv VID,Name,Status,Site,Description 100,Management,active,1,Management VLAN 101,Production,active,1,Production servers 102,DMZ,active,1,DMZ network

powershell Import-Csv vlans.csv | New-NBIPAMVLAN -BatchSize 50 -Force

Import Prefixes from CSV

csv Prefix,Status,Site,Description,Is_Pool 10.0.0.0/24,active,1,Server network,false 10.0.1.0/24,active,1,Client network,false 10.0.2.0/24,container,1,DHCP pool,true

powershell Import-Csv prefixes.csv | New-NBIPAMPrefix -BatchSize 50 -Force

Error Handling

Bulk operations track successes and failures individually:

```powershell

Capture results

$result = $items | New-NBDCIMDevice -BatchSize 50 -Force

Check for errors in output

if ($Error.Count -gt 0) { Write-Host "Some items failed:" -ForegroundColor Yellow $Error | ForEach-Object { Write-Host $_.Exception.Message } }

Successful items are output to pipeline

Write-Host "Successfully created: $($result.Count) devices" ```

Verbose Output

```powershell

Use -Verbose to see batch progress

$items | New-NBDCIMDevice -BatchSize 50 -Force -Verbose ```

Automatic 500 Error Recovery (v4.4.9.3+)

When a bulk batch fails with a 500 Internal Server Error, PowerNetbox automatically falls back to sequential processing with exponential backoff retry. This provides resilience against transient server errors that can occur when referencing recently created objects.

What happens automatically: 1. Batch fails with 500 error 2. Waits 3 seconds for server to stabilize 3. Retries each item individually with delays (500ms → 1s → 2s) 4. Up to 3 retry attempts per item 5. Items that succeed are tracked; permanent failures are reported

```powershell

Resilient chain: create devices → interfaces → IPs

Even if bulk batch fails, each item is retried individually

$devices = 1..5 | ForEach-Object { [PSCustomObject]@{ Name = "server-$_"; Role = 1; Device_Type = 1; Site = 1 } } | New-NBDCIMDevice -Force

Reference newly created devices (resilient to 500 errors)

$interfaces = $devices | ForEach-Object { [PSCustomObject]@{ Device = $_.id; Name = "eth0"; Type = "1000base-t" } } | New-NBDCIMInterface -Force ```

Note: This fallback is transparent - you don't need to change your code. The module handles recovery automatically.

Performance Tips

Optimal Batch Size

Item Count Recommended BatchSize API Calls
1-50 50 (default) 1
51-200 50 1-4
201-1000 100 3-10
1000+ 200-500 5+

```powershell

For large imports, increase batch size

Import-Csv large-dataset.csv | New-NBDCIMDevice -BatchSize 200 -Force ```

Parallel Processing

For very large datasets, split into chunks and process in parallel:

```powershell

Split into 4 chunks for parallel processing

$items = Import-Csv huge-dataset.csv $chunks = [System.Collections.ArrayList]@() $chunkSize = [math]::Ceiling($items.Count / 4)

for ($i = 0; $i -lt $items.Count; $i += $chunkSize) { [void]$chunks.Add($items[$i..([math]::Min($i + $chunkSize - 1, $items.Count - 1))]) }

Process chunks in parallel (PowerShell 7+)

$chunks | ForEach-Object -Parallel { Import-Module PowerNetbox Connect-NBAPI -Hostname $using:NetboxHost -Credential $using:cred $_ | New-NBDCIMDevice -BatchSize 100 -Force } -ThrottleLimit 4 ```

Real-World Examples

Provision Rack of Servers

```powershell

Define server template

$rackId = 1 $siteId = 1 $roleId = 1 # Server role $typeId = 1 # Server type

Create 42U worth of servers

$servers = 1..42 | ForEach-Object { [PSCustomObject]@{ Name = "rack01-u$" Role = $roleId Device_Type = $typeId Site = $siteId Rack = $rackId Position = $ Face = "front" Status = "planned" } }

$created = $servers | New-NBDCIMDevice -BatchSize 20 -Force Write-Host "Provisioned $($created.Count) servers in rack" ```

Create VLAN Structure per Site

```powershell $sites = Get-NBDCIMSite

foreach ($site in $sites) { # Standard VLAN template per site $vlans = @( @{ VID = 10; Name = "Management"; Description = "Management network" } @{ VID = 20; Name = "Servers"; Description = "Server network" } @{ VID = 30; Name = "Clients"; Description = "Client network" } @{ VID = 40; Name = "Voice"; Description = "VoIP network" } @{ VID = 99; Name = "Native"; Description = "Native VLAN" } ) | ForEach-Object { [PSCustomObject]@{ VID = $.VID Name = "$($site.name)-$($.Name)" Site = $site.id Status = "active" Description = $_.Description } }

$vlans | New-NBIPAMVLAN -Force
Write-Host "Created VLANs for site: $($site.name)"

} ```

Decommission Old Devices

```powershell

Find devices older than 5 years (using custom field)

$oldDevices = Get-NBDCIMDevice | Where-Object { $.custom_fields.install_date -and ([datetime]$.custom_fields.install_date) -lt (Get-Date).AddYears(-5) }

Update status to decommissioning

$updates = $oldDevices | ForEach-Object { [PSCustomObject]@{ Id = $_.id Status = "decommissioning" Comments = "Scheduled for decommission - age > 5 years" } }

$updates | Set-NBDCIMDevice -Force

Write-Host "Marked $($updates.Count) devices for decommissioning" ```

Migrate VMs Between Clusters

```powershell $sourceCluster = 1 $targetCluster = 2

Get VMs from source cluster

$vms = Get-NBVirtualMachine -Cluster $sourceCluster

Create update objects

$updates = $vms | ForEach-Object { [PSCustomObject]@{ Id = $_.id Cluster = $targetCluster } }

Bulk migrate

$updates | Set-NBVirtualMachine -Force

Write-Host "Migrated $($updates.Count) VMs to new cluster" ```

Comparison: Single vs Bulk

Without Bulk (Slow)

```powershell

100 API calls - one per device

Measure-Command { 1..100 | ForEach-Object { New-NBDCIMDevice -Name "server-$_" -Role 1 -Device_Type 1 -Site 1 } }

Time: ~60 seconds

```

With Bulk (Fast)

```powershell

2 API calls - batched

Measure-Command { $devices = 1..100 | ForEach-Object { [PSCustomObject]@{ Name = "server-$_"; Role = 1; Device_Type = 1; Site = 1 } } $devices | New-NBDCIMDevice -BatchSize 50 -Force }

Time: ~2 seconds (30x faster!)

```

See Also