Synchronize-VolumesX4.ps1

Continuing the X4 Series (x4 SVMs/x4 copies of the data) which aims (at the end), to use PowerShell to automate the construction of SVMs, volumes, keep configurations in sync, perform DR, and then - time permitting - show that what we’ve achieved with all this ugly coding could have been done much more elegantly in WFA. I feel this journey is important though - which is why we’re on it!

Introduction

In Vol-CreatorX4.ps1, we create 4 copies of a data volume, with protection relationships across the 4 SVMs. This script aims to solve the problem of “if someone manually creates a volume in the production SVM, how do we make sure the volume configuration is replicated and protected across all 3 clusters?” There will be subsequent posts for synchronizing CIFS shares, NFS Exports, Quotas.

Non-Interactive Mode

Because I’m lazy to keep typing, this script runs non-interactively from the PowerShell command line, as well as interactively. E.g.:

PS C:\Users\USER> .\Synchronize-VolumesX4.ps1 -User admin -Pass 123456 -SkipPrompt

The Script

Note: Steps 4, 5 and 6 are pretty much identical bits of PowerShell. The script could have been made a lot shorter using functions. The intention here is not to make a short script, so as to better illustrate all the steps and what they involve.

###############################
## Synchronize-VolumesX4.ps1 ##
###############################

Param($User,$Pass,[Switch]$SkipPrompt)
"";"<<<<< Synchronize-VolumesX4.ps1 >>>>>";""
"The script is designed to Synchronize the volumes in a 4 copy data-protection environment:
1 --SM--> 2
1 --SV--> 3 --SM--> 4.
It gets the details of the volumes in SVM 1, and creates any volumes that are missing on SVMs 2,3,4 including setting up SnapMirror (SM), and SnapVault (SV) relationships.";""

## USER INPUTS ##
If(!$User){$User = Read-Host ">>> Enter Admin User "}
If(!$Pass){$Pass = Read-Host ">>> Enter Password " -AsSecureString}
else {$Pass = $Pass | ConvertTo-SecureString  -AsPlainText -Force}
$Cred = New-Object System.Management.Automation.PsCredential($User,$Pass)

## CLUSTER / SVM / VOL / CIFS SHARE INFO ##
$1234 = 1,2,3,4; $234 = 2,3,4
$Clu = "","NCA1","NCB1","NCA2","NCB2"
$Svm = "","NCA1V1","NCB1V1","NCA2V1","NCB2V1"

## STEP 1 ##
"";">>> STEP 1: AQUIRE SVM 1's (" + $Svm[1] + ") ROOTVOL NAME";""
Import-Module DataONTAP
Connect-NcController -Name $Clu[1] -Credential $Cred
$Attrs = Get-NcVserver -Template
$Attrs.RootVolume = ""
$RootVol = (Get-NcVserver -Attributes $Attrs -VserverContext $Svm[1]).RootVolume
"SVM 1's ROOTVOL = $Rootvol (this will be ignored for synchronization)"

## STEP 2 ##
"";">>> STEP 2: GATHER LIST OF DATA VOLUMES ON SVM 1 (" + $Svm[1] + ")";""
$Attrs = Get-NcVol -Template
Initialize-NcObjectProperty -object $Attrs -name VolumeSpaceAttributes
Initialize-NcObjectProperty -object $Attrs -name VolumeIdAttributes
$Attrs.VolumeSpaceAttributes.Size = ""
$Attrs.VolumeIdAttributes.Type = ""
$Attrs.VolumeSpaceAttributes.SpaceGuarantee = ""
$Volumes = Get-NcVol -Attributes $Attrs -VserverContext $Svm[1]
$DataVols = @()
$Volumes | foreach {If ($_.Name -ne $RootVol){$DataVols += $_} }

## STEP 3 ##
"";">>> STEP 3a: CHECK DATA VOLUMES on SVM's 2,3,4"
">>> STEP 3b: IF THEY EXIST CHECK size/type/space-guarantee is correct!"
">>> STEP 3c: CREATE DP VOLS IF DON'T EXIST";""
$234 | foreach {
## STEP 3a ##
Connect-NcController -Name $Clu[$_] -Credential $Cred
$SvmName = $Svm[$_]
$Vols = Get-NcVol -Attributes $Attrs -VserverContext $Svm[$_]
Foreach ($DVol in $DataVols){
$SourceVol = $DVol.Name
$VolMatch = $false
$i = 0
Foreach ($Vol in $Vols){
$VolName = $Vol.Name
If ($VolName -eq $SourceVol){
## STEP 3b ##
"Volume $SourceVol exists on SVM $SvmName - comparing its size, type, and space guarantee!"
$VolMatch = $true
$Discrepancy = $False
If ($DVol.VolumeSpaceAttributes.Size -ne $Vol.VolumeSpaceAttributes.Size){"$VolName size discrepancy detected!";$Discrepancy = $True}
If ($Vol.VolumeIdAttributes.Type -ne "dp"){"$VolName should be type dp!";$Discrepancy = $True}
If ($DVol.VolumeSpaceAttributes.SpaceGuarantee -ne $Vol.VolumeSpaceAttributes.SpaceGuarantee){"$VolName space guarantee discrepancy detected!";$FoundDiscrepancy = $True}
If ($Discrepancy){
Write-Host "!!! Discepancies deteceted, manually resolve issues with $VolName on SVM $SvmName !!!" -ForegroundColor Red
If(!$SkipPrompt){Read-Host ">>> Press ENTER to CONTINUE <<<"}
}
}
}
If(!$VolMatch){
## STEP 3c ##
"Volume $SourceVol does NOT exist on SVM $SvmName - creating!"
New-NcVol -Name $SourceVol -Aggregate aggr1 -JunctionPath $null -SpaceReserve $DVol.VolumeSpaceAttributes.SpaceGuarantee -Type dp -VserverContext $Svm[$_] -Size $DVol.VolumeSpaceAttributes.Size
}
}            
}

## STEP 4 ##
"";">>> STEP 4a: CHECK EXISTS 1 --SM--> 2"
">>> STEP 4b: IF IT EXISTS, check it is SnapMirrored, has the correct schedule and type!"
">>> STEP 4c: CREATE THE RELATIONSHIP IF IT DOESN'T EXIST and initialize";""
Connect-NcController $Clu[2] -Credential $Cred
Foreach ($DVol in $DataVols){
$SourceVol = $DVol.Name
## STEP 4a ##
$SMResult = Get-NcSnapMirror -SourceVolume $SourceVol -SourceVserver $Svm[1] -DestinationVserver $Svm[2]
If($SMResult){
## STEP 4b ##
"SnapMirror relationship 1 --SM--> 2 exists for $SourceVol"
$SMIssue = $False         
If($SMResult.MirrorState -ne "snapmirrored"){"SnapMirror is not SnapMirrored!";$SMIssue=$True}
If($SMResult.Schedule -ne "sm20min"){"SnapMirror should have schedule sm20min!";$SMIssue=$True}
If($SMResult.RelationshipType -ne "data_protection"){"SnapMirror should by dp type!";$SMIssue=$True}
If($SMIssue){
Write-Host "!!! Please manually investigate this relationship !!!" -ForegroundColor Red
If(!$SkipPrompt){Read-Host ">>> Press ENTER to CONTINUE <<<"}
}
} else {
## STEP 4c ##
New-NcSnapmirror -DestinationVserver $Svm[2] -DestinationVolume $SourceVol -SourceVserver $Svm[1] -SourceVolume $SourceVol -Schedule sm20min -Type dp
Invoke-NcSnapmirrorInitialize -DestinationVserver $Svm[2] -DestinationVolume $SourceVol
}
}

## STEP 5 ##
"";">>> STEP 5a: CHECK EXISTS 1 --SV--> 3"
">>> STEP 5b: IF IT EXISTS, check it is SnapVaulted, has the correct schedule, type and policy!"
">>> STEP 5c: CREATE THE RELATIONSHIP IF IT DOESN'T EXIST and initialize";""
Connect-NcController $Clu[3] -Credential $Cred
Foreach ($DVol in $DataVols){
$SourceVol = $DVol.Name
## STEP 5a ##
$SMResult = Get-NcSnapMirror -SourceVolume $SourceVol -SourceVserver $Svm[1] -DestinationVserver $Svm[3]
If($SMResult){
## STEP 5b ##
"SnapVault relationship 1 --SV--> 3 exists for $SourceVol"
$SMIssue = $False         
If($SMResult.MirrorState -ne "snapmirrored"){"SnapVault is not SnapMirrored!";$SMIssue=$True}
If($SMResult.Schedule -ne "sv60min"){"SnapVault should have schedule sv60min!";$SMIssue=$True}
If($SMResult.RelationshipType -ne "vault"){"Relationship should by xdp (Vault) type!";$SMIssue=$True}
If($SMResult.Policy -ne "92x60min_16x24hrs"){"Relationship should have SnapMirror Policy 92x60min_16x24hrs!";$SMIssue=$True}
If($SMIssue){
Write-Host "!!! Please manually investigate this relationship !!!" -ForegroundColor Red
If(!$SkipPrompt){Read-Host ">>> Press ENTER to CONTINUE <<<"}
}
} else {
## STEP 5c ##
New-NcSnapmirror -DestinationVserver $Svm[3] -DestinationVolume $SourceVol -SourceVserver $Svm[1] -SourceVolume $SourceVol -Schedule sv60min -Type vault -Policy 92x60min_16x24hrs
Invoke-NcSnapmirrorInitialize -DestinationVserver $Svm[3] -DestinationVolume $SourceVol
}
}

## STEP 6 ##
"";">>> STEP 6a: CHECK EXISTS 3 --SM--> 4"
">>> STEP 6b: IF IT EXISTS, check it is SnapMirrored, has the correct schedule and type!"
">>> STEP 6c: CREATE THE RELATIONSHIP IF IT DOESN'T EXIST and initialize";""
Connect-NcController $Clu[4] -Credential $Cred
Foreach ($DVol in $DataVols){
$SourceVol = $DVol.Name
## STEP 6a ##
$SMResult = Get-NcSnapMirror -SourceVolume $SourceVol -SourceVserver $Svm[3] -DestinationVserver $Svm[4]
If($SMResult){
## STEP 6b ##
"SnapMirror relationship 3 --SM--> 4 exists for $SourceVol"
$SMIssue = $False         
If($SMResult.MirrorState -ne "snapmirrored"){"SnapMirror is not SnapMirrored!";$SMIssue=$True}
If($SMResult.Schedule -ne "sm60min"){"SnapMirror should have schedule sm60min!";$SMIssue=$True}
If($SMResult.RelationshipType -ne "data_protection"){"SnapMirror should by dp type!";$SMIssue=$True}
If($SMIssue){
Write-Host "!!! Please manually investigate this relationship !!!" -ForegroundColor Red
If(!$SkipPrompt){Read-Host ">>> Press ENTER to CONTINUE <<<"}
}
} else {
## STEP 6c ##
New-NcSnapmirror -DestinationVserver $Svm[4] -DestinationVolume $SourceVol -SourceVserver $Svm[3] -SourceVolume $SourceVol -Schedule sm60min -Type dp
Invoke-NcSnapmirrorInitialize -DestinationVserver $Svm[4] -DestinationVolume $SourceVol
}
}

## THE END ##

Comments