Getting Started with Pure Storage Fusion: A Quick Guide to Unified Fleet Management
One of the most powerful updates in the Pure Storage ecosystem is the ability to federate arrays into a unified fleet with Fusion. Whether you're scaling out infrastructure or simplifying operations across data centers, Fusion makes multi-array management seamless—and the setup process is refreshingly simple. Here’s a quick walkthrough to get your fleet up and running: 🔹 Step 1: Create or Join a Fleet From the Fleet Management tab in the Purity UI, you can either create a new fleet or join an existing one. Creating a fleet? Just assign a memorable name and generate a one-time fleet key. This key acts like a secure handshake, ensuring that only authorized arrays can join. 🔹 Step 2: Add Arrays to the Fleet On each array you want to bring into the fold: Select Join Fleet, enter the fleet name, and paste in the fleet key. Once verified, the array becomes part of your managed fleet. 🔹 Step 3: Manage as One With federation complete, you now have a single, unified control plane. Any array in the fleet can serve as your management entry point—configure, monitor, and operate across the entire environment from one location. This capability is a big leap forward for simplifying scale and operations—especially for hybrid cloud or multi-site environments. If you're testing it out, I’d love to hear how it's working for you or what use cases you're solving.325Views6likes2CommentsNew Pure Code site is live!
After many months of messing with some very old code, we have launched a revised site for the Pure Code Portal. It is much more minimalistic and cleaner than the old one, and we have plans to add our Code videos and Pure Employee website links in the near future. Have a look and feel free to leave a comment if you would like to see something on the site. https://code.purestorage.com/ Cheers, //Mike34Views2likes1CommentSome Fleet PowerShell code using Invoke-RestMethod
Hello fellow scripters! This script is a PowerShell script that uses native PowerShell cmdlets to do the tasks. It does not use the Pure Storage PowerShell SDK2. This is for folks who do raw API calls using automation packages, runbooks, and scripts. It is not intended to use in it's entirety, but rather to be used as code snippets and starters for your own scripts. The full script is available in this GitHub repository. This script will: Use native PowerShell (non-SDK) Invoke-RestMethod calls to the FlashArray API Authenticates an API Token user and gets the x-auth-token for requests Query a fleet and determine the fleet members Query fleet Presets & Workloads List fleet volumes and hosts (top X, configurable) Create a host, volume, and then connect the volume to the host on a member array. <# .SYNOPSIS Authenticates to Pure Storage FlashArray REST API and retrieves session token. .DESCRIPTION - Authenticates using API token. - Retrieves the x-auth-token from response headers for subsequent requests. - Dynamically queries the FlashArray for the latest available API version and uses it for requests. .PARAMETER Target Required. The FQDN or IP address of the FlashArray to target for REST API calls. .PARAMETER ApiToken Required. The API token used for authentication with the FlashArray REST API. .EXAMPLE .\Connect-FAApi.ps1 -Target "10.0.0.100" -ApiToken "<Your API Token here>" .NOTES Author: mnelson@purestorage.com Origin Date: 10/23/2023 Version: 1.1 #> param ( [Parameter(Mandatory = $true)] [string]$Target, [Parameter(Mandatory = $true)] [string]$ApiToken ) ################ SETUP ################ # Query the array for the latest available API version try { $apiVersions = Invoke-RestMethod -Uri "https://$Target/api/api_version" -Method Get -SkipCertificateCheck $numericApiVersions = $apiVersions.version | Where-Object { $_ -match '^\d+(\.\d+)*$' -and $_ -notmatch '^2\.x$' } $latestApiVersion = ($numericApiVersions | Sort-Object { [version]$_ } -Descending)[0] Write-Host "Latest API Version detected:" $latestApiVersion } catch { Write-Host "Could not retrieve API version, defaulting to 2.45" $latestApiVersion = "2.45" } # Set the Base Uri if ($latestApiVersion) { $baseUrl = "https://$Target/api/$latestApiVersion" } # Prepare headers for authentication $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers["api-token"] = $ApiToken # Authenticate and get session token $response = Invoke-RestMethod "https://$Target/api/$latestApiVersion/login" -Method 'POST' -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable "respHeaders" # Display the value of "username" from the response, if present if ($response.items -and $response.items[0].username) { Write-Host "Username:" $response.items[0].username } else { Write-Host "Username field not found in response." } # TO-DO: Check if user is LDAP or local # Parse "x-auth-token" from response headers and store in $xAuthHeader $xAuthHeader = $respHeaders["x-auth-token"] Write-Host "x-auth-token:" $xAuthHeader # Add x-auth-token to headers for subsequent requests $headers.Add("x-auth-token", $xAuthHeader) # You can now use $headers for further authenticated requests to the FA API ########################################################################### Add pagination, query the fleet: # optional pagination & limit code $continuation_token = $null $limit = 10 # Adjust as needed ################ FLEETS ################ # Get Fleet name $fleetsResponse = Invoke-RestMethod -Uri "$baseUrl/fleets" -Method Get -Headers $headers -SkipCertificateCheck $fleetName = $fleetsResponse.items[0].name #Write-Host "Fleet Name: $fleetName" # Get fleet members $membersUrl = "$baseUrl/fleets/members?fleet_name=$fleetName" $membersResponse = Invoke-RestMethod -Uri $membersUrl -Method Get -Headers $headers -SkipCertificateCheck if (-not $membersResponse.items -or $membersResponse.items.Count -eq 0) { Write-Error "No fleet members found." exit 1 } # Extract Fleet member names $VAR_RESULTS = @() foreach ($item in $membersResponse.items) { if ($item.member -and $item.member.name) { $VAR_RESULTS += $item.member.name } elseif ($item.name) { $VAR_RESULTS += $item.name } } if ($VAR_RESULTS.Count -eq 0) { Write-Error "No member names found in fleet members response." exit 1 } # Write out the fleet members #Write-Host "Extracted Member Names: $($VAR_RESULTS -join ', ')" Query for volumes, hosts: ################ FLEET VOLUMES QUERY ################ # Query volumes for extracted member names $volumesUrl = "$baseUrl/volumes?context_names=$($VAR_RESULTS -join ',')" ## uncomment for full response - no limit, and comment out pagination code below #$volumesResponse = Invoke-RestMethod -Uri $volumesUrl -Method Get -Headers $headers -SkipCertificateCheck #$volumesResponse | ConvertTo-Json -Depth 5 ## with paginated reponse do { ## Build the query string for pagination $queryString = "?limit=$limit" if ($continuation_token) { $queryString += "&continuation_token=$continuation_token" } $volumesUrl = "$baseUrl/volumes$queryString" ## Invoke REST method and capture response headers $volumesResponse = Invoke-RestMethod -Uri $volumesUrl -Method Get -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable respHeaders ## Output volumes data $volumesResponse | ConvertTo-Json -Depth 5 ## Extract x-next-token from response headers for next page $continuation_token = $respHeaders["x-next-token"] ## Continue if x-next-token is present } while ($continuation_token) ################ FLEET HOSTS QUERY ################ # Query hosts for extracted member names $hostsUrl = "$baseUrl/hosts?context_names=$($VAR_RESULTS -join ',')" ## full response - no limit, and comment out pagination code below #$hostsResponse = Invoke-RestMethod -Uri $hostsUrl -Method Get -Headers $headers -SkipCertificateCheck #$hostsResponse | ConvertTo-Json -Depth 5 ## with paginated reponse do { ## Build the query string for pagination $queryString = "?limit=$limit" if ($continuation_token) { $queryString += "&continuation_token=$continuation_token" } $hostsUrl = "$baseUrl/hosts$queryString" ## Invoke REST method and capture response headers $hostsResponse = Invoke-RestMethod -Uri $hostsUrl -Method Get -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable respHeaders ## Output hosts data $hostsResponse | ConvertTo-Json -Depth 5 ## Extract x-next-token from response headers for next page $continuation_token = $respHeaders["x-next-token"] ## Continue if x-next-token is present } while ($continuation_token) Query for Presets & Workloads: ################ FLEET PRESETS QUERY ################ $presetsUrl = "$baseUrl/presets?context_names=$($VAR_RESULTS -join ',')" $presetsResponse = Invoke-RestMethod -Uri $presetsUrl -Method Get -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable respHeaders $presetsResponse | ConvertTo-Json -Depth 5 ################ FLEET WORKLOADS QUERY ################ $workloadsUrl = "$baseUrl/workloads?context_names=$($VAR_RESULTS -join ',')" $workloadsResponse = Invoke-RestMethod -Uri $workloadsUrl -Method Get -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable respHeaders $workloadsResponse | ConvertTo-Json -Depth 5 Create a Host on a fleet member array, create a volume, connect the volume to the host: ################ CREATE VOLUME, HOST, AND CONNECT THEM ON ANOTHER FLASHARRAY IN THE FLEET ################ # Select a secondary FlashArray in the fleet $otherArrayName = $VAR_RESULTS | Where-Object { $_ -ne $Target } | Select-Object -First 1 if (-not $otherArrayName) { Write-Error "No other FlashArray found in the fleet." exit 1 } Write-Host "Selected secondary FlashArray for operations: $otherArrayName" # Create a new volume on the secondary FlashArray $newVolumeName = "APIDemo-Vol01" $volumePayload = @{ name = $newVolumeName size = 10737418240 # 10 GiB in bytes context = @{ name = $otherArrayName } } $createVolumeUrl = "$baseUrl/volumes" $createVolumeResponse = Invoke-RestMethod -Uri $createVolumeUrl -Method Post -Headers $headers -Body ($volumePayload | ConvertTo-Json) -ContentType "application/json" -SkipCertificateCheck Write-Host "Created volume:" $newVolumeName "on" $otherArrayName # Create a new host on the secondary FlashArray $newHostName = "FleetDemoHost01" $IQN = "iqn.2023-07.com.fleetdemo:host01" $hostPayload = @{ name = $newHostName iqn = @($IQN) context = @{ name = $otherArrayName } } $createHostUrl = "$baseUrl/hosts" $createHostResponse = Invoke-RestMethod -Uri $createHostUrl -Method Post -Headers $headers -Body ($hostPayload | ConvertTo-Json) -ContentType "application/json" -SkipCertificateCheck Write-Host "Created host:" $newHostName "with IQN:" $IQN "on" $otherArrayName # Connect the newly created volume to the newly created host $connectPayload = @{ volume = @{ name = $newVolumeName context = @{ name = $otherArrayName } } host = @{ name = $newHostName context = @{ name = $otherArrayName } } } $connectUrl = "$baseUrl/host-volume-connections" $connectResponse = Invoke-RestMethod -Uri $connectUrl -Method Post -Headers $headers -Body ($connectPayload | ConvertTo-Json) -ContentType "application/json" -SkipCertificateCheck Write-Host "Connected volume" $newVolumeName "to host" $newHostName "on" $otherArrayName # Output results $createVolumeResponse | ConvertTo-Json -Depth 5 $createHostResponse | ConvertTo-Json -Depth 5 $connectResponse | ConvertTo-Json -Depth 525Views2likes0CommentsConfigure Fusion with Powershell!
Here's a little Powershell script to get a new FlashArray Fusion Fleet up and running and verify you can deploy a 1GB test volume on array 2 even though you're connected to array 1! You'll need PureStoragePowershellSDK2 v2.4.30 or newer, Purity 6.8.1 or newer, and both arrays configured to use the same LDAP or Active Directory infrastructure for management to run it. The script will prompt you for two FlashArrays to connect to, what you'd like to name the new fleet, and LDAP/Active Directory credentials with array admin rights on both arrays. If you haven't tried Fusion yet and like automating with Powershell, give it a try! #################################################################################### # Script to create a new Fusion fleet, add a second array to the fleet, and # create a new 1GB test volume on array 2 via a command sent to array 1. # # Mike Sasse - 8/15/2025 - v1.0 #################################################################################### #Stop the script if any command throws an error $ErrorActionPreference = "Stop" #Display script function and requirements Write-Host "This script will create a new Fusion fleet, add a second array to the fleet, and" Write-Host "create a new test volume on array 2 via a command sent to array 1." Write-Host "`nPure Storage SDK2 2.43.30+ must be installed and both arrays must be running Purity 6.8.1+." #Import Pure Storage PowerShell SDK2 Import-Module PureStoragePowerShellSDK2 #Prompt user for the two FlashArrays $FlashArray1Name = Read-Host "Enter the first FlashArray FQDN or IP" $FlashArray2Name = Read-Host "Enter the second FlashArray FQDN or IP" #Prompt user for new fleet name $Fleet = Read-Host "Enter the new fleet name" #Get credentials to connect to the two FlashArrays Write-Host "Enter LDAP/Active Directory credentials with array admin rights to be used to connect to both FlashArrays:" $Creds = Get-Credential #Connect to both FlashArrays Write-Host "`nConnecting to $FlashArray1Name..." $FlashArray1 = Connect-Pfa2Array -Endpoint $Flasharray1Name -Credential $Creds -IgnoreCertificateError Write-Host "`nConnecting to $FlashArray2Name..." $FlashArray2 = Connect-Pfa2Array -Endpoint $Flasharray2Name -Credential $Creds -IgnoreCertificateError #Store the new test volume name as a variable $volumeName = "FusionTestVolume" #Store the new test volume size as a variable $Size = "1GB" #Create the new fleet via FlashArray 1 and pipe the output to null Write-Host "`nCreating new fleet named $Fleet on $FlashArray1Name..." New-Pfa2Fleet -Array $FlashArray1 -Name $Fleet | Out-Null #Create a new fleet key and store as a variable Write-Host "`nFetching new fleet key..." $FleetKey = New-Pfa2FleetKey -Array $FlashArray1 #Grab FlashArray 2 and store as a variable $FA2 = Get-Pfa2Array -Array $FlashArray2 #Join FlashArray 2 to the fleet and pipe the output to null Write-Host "`nJoining $Flasharray2Name to $Fleet..." New-Pfa2FleetMember -Array $FlashArray2 -FleetName $Fleet -MembersKey $FleetKey._FleetKey -MemberName $FA2.Name -MemberResourceType remote-arrays | Out-Null #Create a new test volume on FlashArray 2 via FlashArray 1 and pipe the output to null Write-Host "`nCreating new volume $volumeName on $Flasharray2Name through $Flasharray1Name..." New-Pfa2Volume -Array $FlashArray1 -Name $volumeName -Provisioned $Size -ContextNames $FA2.Name | Out-Null Write-Host "`nComplete!"55Views2likes0CommentsAccelerate Breakout Replay: Simplifying Storage Management Automation with Pure Fusion™
See how Pure Fusion and APIs make storage automation easy—whether you're starting out or scaling advanced fleet-wide automation. Speakers: Mike Nelson Brent Lim Chris Jimenez - Fanatics https://www.purestorage.com/video/webinars/simplifying-storage-management-automation-with-pure-fusion/6375797858112.html32Views2likes2CommentsFusion / Python
Just wanted to let you all know that I've just published a new blog on my recent github repo - its a reporting package that assist customers in tagging volumes in a fusion fleet with chargeback codes, and then generate a spreadsheet every month with all of the space reporting on those volumes (several times a day, if necessary) organised by chargeback code The code is available in Github now (Open Source, use freely!) If it doesn't quite work as you'ld like it to, lmk your suggestions - happy to improve it for wider use.65Views2likes0CommentsAccelerate Breakout Replay: Optimizing Unstructured Data with Advanced Workflow Management
Learn how Pure Fusion™, Zero Move Tiering, and Rapid Replicas help manage and scale unstructured data while reducing complexity. Speakers: Amrita Das Hari Kannan https://www.purestorage.com/video/webinars/optimizing-unstructured-data-with-advanced-workflow-management/6375798474112.html10Views1like0CommentsPowerShell SDK v2.43.30 released!
The Pure PowerShell SDK version 2.43.30 has been released! There are a boatload of changes in this release, and all of those changes can be found in the release notes. New cmdlets for Fleets, tags, realms, and more. New parameters for context_names (fleets) and Allow_Errors. Install the SDK today! Install-Module PureStoragePowerShellSDK2 Update your current version: Update-Module PureStoragePowerShellSDK2 PowerShell Gallery Link20Views1like0CommentsTry Fusion Presets and Workloads in Pure Test Drive
Pure Test Drive now has a hands on lab designed to let you demo the Presets and Workloads capability included in Purity//FA 6.8.3. A Preset is a reusable template that describes how to provision and configure the Purity objects that make up a Workload; and Workloads are a container object that holds references to other Purity objects, which will enable them to be managed and monitored as a set. Watch a recorded walkthrough or roll up your sleeves and try it your self by filling out this form or asking your local Pure SE for a voucher for the Pure Fusion Presets & Workloads lab.55Views1like0Comments