In the previous blog post, we walked through how to authenticate and connect to Pure1 using the PureStorage.Pure1 PowerShell SDK. We covered RSA key pairs, JWTs, and ran through the initial set of cmdlets to query arrays, volumes, and metrics.
This time, we are going to dive into the v1.5.0.0 release of the module, which I have personally contributed to the open-source project. This release adds 16 new cmdlets that significantly expand what you can do with Pure1 from the command line, covering everything from hardware inventory and replication topology to sustainability metrics.
But before we get into the new cmdlets, I want to take a step back and talk about why this matters.
Why API-First Matters
Pure1 is a powerful platform with a rich UI for fleet management, but the real power lies beneath the surface: the Pure1 REST API.
The API exposes the same data you see in the Pure1 portal, but in a way that can be consumed programmatically. This means you can:
- Automate reporting instead of manually exporting data from the UI.
- Build custom dashboards that combine Pure1 data with other sources.
- Integrate with existing tools like ServiceNow, Splunk, or your own internal platforms.
- Schedule recurring tasks like fleet health checks, capacity reviews, or compliance audits.
And the reach of the API goes well beyond scripting and reporting. The same Pure1 REST API is what powers Pure1 Workflow Orchestration, enabling you to build automated, event-driven pipelines across your fleet. It is also what makes the Pure1 MCP Server possible, bringing Pure1 data into AI-powered tools. I will be covering both of these topics in upcoming blogs. For now, lets dive into why I spent some time contributing to the PureStorage.Pure1 PowerShell module.
Why PowerShell?
If the API is the foundation, PowerShell is one of the simplest way to build on it.
For storage administrators, infrastructure engineers, and anyone working in a Windows-heavy environment, PowerShell is the natural choice. You do not need to set up a Python virtual environment, install dependencies, or write boilerplate code. With the PureStorage.Pure1 module, you get native cmdlets that follow familiar PowerShell patterns:
# One line to install
Install-Module PureStorage.Pure1
# One line to connect
New-PureOneConnection -PureAppID pure1:apikey:PZoggxxxxx
# One line to get results
Get-PureOneArray
That is three lines to go from zero to querying your entire fleet. And because the output is standard PowerShell objects, you can pipe, filter, sort, group, and export using the tools you already know: Where-Object, Select-Object, Sort-Object, Export-Csv, ConvertTo-Html, and more.
No SDK wrapper classes, no JSON parsing, no token refresh logic. The module handles all of that for you.
What’s New in v1.5.0.0
The v1.5.0.0 release (March 31st, 2026) adds 16 new cmdlets across four categories: Hardware & Inventory, Data Protection & Replication, Storage Resources, and Auditing & Sustainability.
Hardware & Inventory
| Cmdlet | Description |
|---|---|
Get-PureOneController |
Retrieve array controller information |
Get-PureOneDrive |
Retrieve array drive information |
Get-PureOnePort |
Retrieve array port information |
Get-PureOneHardware |
Retrieve hardware component information |
Get-PureOneBlade |
Retrieve FlashBlade blade information |
Get-PureOneHardwareConnector |
Retrieve hardware connector information |
Data Protection & Replication
| Cmdlet | Description |
|---|---|
Get-PureOnePodReplicaLink |
Retrieve pod replica link information |
Get-PureOneTarget |
Retrieve replication target information |
Get-PureOneFileSystemReplicaLink |
Retrieve file system replica links |
Get-PureOneBucketReplicaLink |
Retrieve bucket replica links |
Storage Resources
| Cmdlet | Description |
|---|---|
Get-PureOneBucket |
Retrieve object store bucket information |
Get-PureOneDirectory |
Retrieve managed directory information |
Get-PureOnePolicy |
Retrieve policy information |
Get-PureOneObjectStoreAccount |
Retrieve object store accounts |
Auditing & Sustainability
| Cmdlet | Description |
|---|---|
Get-PureOneAudit |
Retrieve audit log entries |
Get-PureOneSustainability |
Retrieve energy consumption and sustainability metrics |
In addition to the new cmdlets, this release also includes two bug fixes:
- Fixed a
GET-ErrorActiontypo (missing space) that caused syntax errors. - Fixed openssl path handling for directories containing spaces (e.g., “My Drive”).
Getting started with new cmdlets
If you already followed the authentication steps from the previous blog, you are all set. Just update the module to the latest version:
Update-Module PureStorage.Pure1
Then verify you are on v1.5.0.0:
Get-Module PureStorage.Pure1 | Select-Object Name, Version
Expected output:
Name Version
---- -------
PureStorage.Pure1 1.5.0.0
If this is your first time, head over to the previous blog for the full authentication walkthrough.
Practical Reporting Examples
Now let’s get to the fun part. Below are what I define as “real-world” reporting scenarios you can run directly from your PowerShell session.
Fleet Hardware Inventory Report
Want a full inventory of controllers, drives, and ports across your entire fleet? With the new cmdlets, this is a one-liner per resource type:
# Get all controllers across the fleet
$controllers = Get-PureOneController
$controllers | Select-Object name, model, mode, status, version,
@{N='array';E={$_.arrays.name -join ', '}} | Format-Table
# Get all drives across the fleet
$drives = Get-PureOneDrive
$drives | Select-Object name, type,
@{N='capacity_TB';E={[math]::Round($_.capacity/1TB,2)}},
status | Format-Table
# Get all ports (covers FC, iSCSI, and NVMe-oF)
$ports = Get-PureOnePort
$ports | Select-Object name, wwn, iqn, nqn, portal | Format-Table
# Get all hardware components
$hardware = Get-PureOneHardware
$hardware | Select-Object name, type, model, status | Format-Table
You can also export this to a CSV for offline analysis or sharing with your team:
Get-PureOneController | Export-Csv -Path "fleet_controllers.csv" -NoTypeInformation
Get-PureOneDrive | Export-Csv -Path "fleet_drives.csv" -NoTypeInformation
Replication Topology Overview
Understanding your replication topology across the fleet used to require navigating multiple arrays in the UI. Now you can get the full picture in seconds:
# Pod replica links (FlashArray ActiveCluster and/or ActiveDR)
$podLinks = Get-PureOnePodReplicaLink
$podLinks | Select-Object @{N='source';E={$_.sources.name -join ', '}},
@{N='target';E={$_.targets.name -join ', '}},
status, lag, paused | Format-Table
Object Store and Directory Report
If you are running FlashBlade or FlashArray with S3-compatible object storage, the new cmdlets let you pull account, bucket, and Managed directory (FlashArray File only) information across the fleet:
# List all object store accounts
Get-PureOneObjectStoreAccount | Select-Object name, object_count,
@{N='array';E={$_.arrays.name -join ', '}} | Format-Table
# List all buckets
Get-PureOneBucket | Select-Object name, object_count, versioning,
@{N='account';E={$_.account.name}},
@{N='array';E={$_.arrays.name -join ', '}} | Format-Table
# List all managed directories
Get-PureOneDirectory | Select-Object directory_name, path,
@{N='file_system';E={$_.file_system.name}},
@{N='array';E={$_.arrays.name -join ', '}} | Format-Table
Audit Log Review
The new Get-PureOneAudit cmdlet is a game-changer for security and compliance teams. You can now pull audit logs programmatically.
Note: The audit log can be very large across a fleet (hundreds of thousands of entries). Use
-Userto apply a server-side filter, or scope client-side withWhere-Objectafter fetching.
# Pull audit entries for a specific user
$audits = Get-PureOneAudit -User fusion_admin
$audits | Select-Object user,
@{N='action';E={"$($_.command) $($_.subcommand)".Trim()}},
arguments,
@{N='array';E={$_.arrays.name -join ', '}},
@{N='time';E={[DateTimeOffset]::FromUnixTimeMilliseconds($_.time).LocalDateTime}} | Format-Table
# Filter client-side for destructive operations
$audits | Where-Object { $_.subcommand -in "delete","eradicate","disconnect" } |
Select-Object user,
@{N='action';E={"$($_.command) $($_.subcommand)".Trim()}},
arguments,
@{N='array';E={$_.arrays.name -join ', '}},
@{N='time';E={[DateTimeOffset]::FromUnixTimeMilliseconds($_.time).LocalDateTime}} |
Sort-Object -Property time -Descending | Format-Table
Or export it for compliance archiving:
Get-PureOneAudit -User pureuser |
Select-Object user,
@{N='action';E={"$($_.command) $($_.subcommand)".Trim()}},
arguments,
@{N='array';E={$_.arrays.name -join ', '}},
@{N='time';E={[DateTimeOffset]::FromUnixTimeMilliseconds($_.time).LocalDateTime}} |
Export-Csv -Path "audit_log_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation
Sustainability Report
One of the most exciting additions is Get-PureOneSustainability. As organizations increasingly track energy consumption and carbon footprint, this cmdlet provides direct access to sustainability metrics from Pure1:
$sustainability = Get-PureOneSustainability
$sustainability | Select-Object name,
reporting_status,
@{N='level';E={$_.assessment.assessment_level}},
@{N='power_avg_W';E={$_.assessment.power_average}},
@{N='heat_avg';E={$_.assessment.heat_average}},
@{N='data_reduction';E={$_.assessment.array_data_reduction}} | Format-Table
Building a Fleet Report
Combining multiple cmdlets into a reusable function is where the I bliever most of the PowerShell users will see the true power of this module. Below is an Invoke-Pure1FleetReport function that collects health data across your fleet, prints a colour-coded summary to the console, and exports timestamped CSV files to a directory of your choice.
function Invoke-Pure1FleetReport {
param(
[Parameter(Mandatory)]
[string]$PureAppID,
[Parameter()]
[string]$OutputPath = "."
)
try {
New-PureOneConnection -PureAppID $PureAppID
} catch {
if ($_.Exception.Message -notlike "*is already connected*") { throw }
Write-Verbose "Pure1 connection already active — reusing existing session."
}
$date = Get-Date -Format "yyyyMMdd"
$outDir = New-Item -ItemType Directory -Path $OutputPath -Force
# ── Collect ──────────────────────────────────────────────────────
$arrays = Get-PureOneArray
$alerts = Get-PureOneAlert | Where-Object { $_.state -eq "open" }
$controllers = Get-PureOneController
$unhealthyDrives = Get-PureOneDrive | Where-Object { $_.status -ne "healthy" }
$replicationIssues = Get-PureOnePodReplicaLink | Where-Object { $_.status -ne "replicating" }
$sustainability = Get-PureOneSustainability | Where-Object { $_.assessment.assessment_level -notin @('excellent', 'good') }
# ── Console summary ──────────────────────────────────────────────
Write-Host ""
Write-Host "===== Pure1 Fleet Health Report — $date =====" -ForegroundColor Cyan
Write-Host " Arrays : $($arrays.Count)"
Write-Host " Open Alerts : $($alerts.Count)" -ForegroundColor $(if ($alerts.Count -gt 0) { 'Yellow' } else { 'Green' })
Write-Host " Unhealthy Drives : $($unhealthyDrives.Count)" -ForegroundColor $(if ($unhealthyDrives.Count -gt 0) { 'Yellow' } else { 'Green' })
Write-Host " Replication Issues : $($replicationIssues.Count)" -ForegroundColor $(if ($replicationIssues.Count -gt 0) { 'Red' } else { 'Green' })
Write-Host " Sustainability Warnings : $($sustainability.Count)" -ForegroundColor $(if ($sustainability.Count -gt 0) { 'Yellow' } else { 'Green' })
Write-Host "=============================================="
Write-Host ""
# ── Export CSVs ──────────────────────────────────────────────────
$arrays | Export-Csv -Path (Join-Path $outDir "${date}_arrays.csv") -NoTypeInformation
$alerts | Export-Csv -Path (Join-Path $outDir "${date}_alerts.csv") -NoTypeInformation
$controllers | Select-Object name, model, mode, status, version,
@{N='array';E={$_.arrays.name -join ', '}} |
Export-Csv -Path (Join-Path $outDir "${date}_controllers.csv") -NoTypeInformation
$unhealthyDrives | Select-Object name, type,
@{N='capacity_TB';E={[math]::Round($_.capacity/1TB,2)}},
status |
Export-Csv -Path (Join-Path $outDir "${date}_unhealthy_drives.csv") -NoTypeInformation
$replicationIssues | Select-Object @{N='source';E={$_.sources.name -join ', '}},
@{N='target';E={$_.targets.name -join ', '}},
status, lag, paused |
Export-Csv -Path (Join-Path $outDir "${date}_replication_issues.csv") -NoTypeInformation
$sustainability | Select-Object name, reporting_status,
@{N='level';E={$_.assessment.assessment_level}},
@{N='power_avg_W';E={$_.assessment.power_average}},
@{N='heat_avg';E={$_.assessment.heat_average}},
@{N='data_reduction';E={$_.assessment.array_data_reduction}} |
Export-Csv -Path (Join-Path $outDir "${date}_sustainability.csv") -NoTypeInformation
Write-Host "Reports saved to: $($outDir.FullName)" -ForegroundColor Green
}
Running it interactively:
Invoke-Pure1FleetReport -PureAppID "pure1:apikey:PZoggxxxxx" -OutputPath "~/Reports/Pure1"
Scheduling it
Save the function definition and the call above into a .ps1 file — for example Pure1FleetReport.ps1 — then schedule it using the method that fits your environment.
On Windows with Task Scheduler (runs every Monday at 07:00 as SYSTEM):
schtasks /create /tn "Pure1 Weekly Fleet Report" /tr "pwsh -NonInteractive -File C:\Scripts\Pure1FleetReport.ps1" /sc WEEKLY /d MON /st 07:00 /ru SYSTEM /f
On macOS or Linux, add a crontab entry with crontab -e:
# Run every Monday at 07:00
0 7 * * 1 /usr/local/bin/pwsh -NonInteractive -File /opt/scripts/Pure1FleetReport.ps1
Each run drops a dated set of CSV files into your output folder — 20260407_arrays.csv, 20260407_alerts.csv, and so on — giving you a rolling archive you can feed into Excel, Power BI, or any reporting tool your team already uses.
What’s Ahead
This was not my first time wrapping API calls into PowerShell cmdlets, but this one has been a special one as I am contributing to the legacy started by Cody Hosterman for this project. And second, bringing the PowerShell module to parity with the REST API.
In the next blog, I plan to cover how to interact with the Pure1 REST API using the MCP server, where I have to convince myself (and you dear reader) how I will never query raw HTTP calls.
In the meantime, update your module, explore the new cmdlets, and start building the reports that your team needs.
Resources
- PureStorage.Pure1 on PowerShell Gallery
- v1.5.0.0 Release Notes
- Pure1 REST API Reference
- Pure1 Swagger Documentation
- Previous Blog: Starting with the Pure1 PowerShell SDK
comments powered by Disqus