Hi,
I'm assuming there is a reason you want to take a manual snapshot instead of using a snapshot policy? It's possbile to do but whenever possible let ontap handle snapshot creation.
Here is some code that will do what you want. You could simplify it as it contains error checking\comments\validatation. Also contains an inner do loop within the for loop to validate the line in the file contains the correct number of elements (vserver name, volume name, snapshot name)
Directory structure:
C:\Scripts\PowerShell\Projects\CreateVolumeSnapshots>dir /b
CreateVolumeSnapshots.csv
CreateVolumeSnapshots.ps1
C:\Scripts\PowerShell\Projects\CreateVolumeSnapshots>type CreateVolumeSnapshots.csv
VserverName,VolumeName,SnapshotName
vserver1,cifs_data_001,snapshot_001
vserver2,nfs_data_001,snapshot_001
PowerShell Code:
Param(
[Parameter(Mandatory=$True, HelpMessage="The cluster name or IP Address")]
[String]$Cluster,
[Parameter(Mandatory=$False, HelpMessage="The credentials to connect to the cluster")]
[System.Management.Automation.PSCredential]$Credentials
)
#'------------------------------------------------------------------------------
#'Prompt for credentials if not provided.
#'------------------------------------------------------------------------------
If(-Not($Credentials)){
[System.Management.Automation.PSCredential]$Credentials = Get-Credential -Credential admin
}
#'------------------------------------------------------------------------------
#'Initialization Section. Define Global Variables.
#'------------------------------------------------------------------------------
[String]$scriptPath = Split-Path($MyInvocation.MyCommand.Path)
[String]$scriptSpec = $MyInvocation.MyCommand.Definition
[String]$scriptBaseName = (Get-Item $scriptSpec).BaseName
[String]$scriptName = (Get-Item $scriptSpec).Name
[String]$fileSpec = "$scriptPath\$scriptBaseName.csv"
#'------------------------------------------------------------------------------
#'Read the scripts configuration file.
#'------------------------------------------------------------------------------
If(Test-Path -Path $fileSpec){
$lines = Get-Content -Path $fileSpec
}Else{
Write-Warning "The file ""$fileSpec"" does not exist"
Break;
}
#'------------------------------------------------------------------------------
#'Import the DataONTAP PowerShell Module.
#'------------------------------------------------------------------------------
Try{
[String]$moduleName = "DataONTAP"
Import-Module $moduleName -ErrorAction Stop
Write-Host "Imported module ""$moduleName"""
}Catch{
Write-Warning -Message "Failed importing module ""$moduleName"""
Break;
}
#'------------------------------------------------------------------------------
#'Connect to the cluster.
#'------------------------------------------------------------------------------
Try{
Connect-NcController -Name $Cluster -HTTPS -Credential $Credentials -ErrorAction Stop | Out-Null
Write-Host "Connected to cluster ""$Cluster"""
}Catch{
Write-Warning -Message $("Failed connecting to cluster ""$Cluster"". Error " + $_.Exception.Message)
Break;
}
#'------------------------------------------------------------------------------
#'Process each line to create a snapshot on the vservers volume.
#'------------------------------------------------------------------------------
For($i = 1; ($i -le $lines.Count -1); $i++){
Do{
If($lines[$i].Contains(",")){
$elements = $lines[$i].Split(",")
If($elements.Count -eq 3){
[String]$vserverName = $elements[0]
[String]$volumeName = $elements[1]
[String]$snapshotName = $elements[2]
}Else{
Break;
}
}Else{
Break;
}
If((-Not([String]::IsNullOrEmpty($vserverName))) -And `
(-Not([String]::IsNullOrEmpty($volumeName))) -And `
(-Not([String]::IsNullOrEmpty($snapshotName)))){
[String]$timeStamp = Get-Date -uformat "%Y_%m_%d_%H_%M_%S"
[String]$command = "New-NcSnapshot -Volume $VolumeName -Snapshot $snapshotName`_$timeStamp -VserverContext $vserverName -ErrorAction Stop"
Try{
Invoke-Expression -Command $command -ErrorAction Stop | Out-Null
Write-Host "Executed Command`: $command" -ForegroundColor Cyan
}Catch{
Write-Warning -Message $("Failed Executing Command`: $command. Error " + $_.Exception.Message)
Break;
}
}
}Until($True)
}
#'------------------------------------------------------------------------------
PowerShell Output:
PS C:\Scripts\PowerShell\Projects\CreateVolumeSnapshots> .\CreateVolumeSnapshots.ps1 -Cluster cluster1.testlab.local -Credentials $credentials
Imported module "DataONTAP"
Connected to cluster "cluster1.testlab.local"
Executed Command: New-NcSnapshot -Volume cifs_data_001 -Snapshot snapshot_001_2018_01_18_16_22_51 -VserverContext vserver1 -ErrorAction Stop
Executed Command: New-NcSnapshot -Volume nfs_data_001 -Snapshot snapshot_001_2018_01_18_16_22_52 -VserverContext vserver2 -ErrorAction Stop
CLI Output:
cluster1::*> snap list -vserver vserver1 -volume cifs_data_001
---Blocks---
Vserver Volume Snapshot Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
vserver1 cifs_data_001
weekly.2018-01-07_0015 460KB 0% 10%
weekly.2018-01-14_0015 500KB 0% 11%
daily.2018-01-17_0010 504KB 0% 11%
daily.2018-01-18_0010 440KB 0% 10%
hourly.2018-01-18_1105 316KB 0% 7%
hourly.2018-01-18_1205 88KB 0% 2%
hourly.2018-01-18_1305 296KB 0% 7%
hourly.2018-01-18_1405 88KB 0% 2%
hourly.2018-01-18_1505 316KB 0% 7%
hourly.2018-01-18_1605 84KB 0% 2%
snapshot_001_2018_01_18_16_22_51 308KB 0% 7%
11 entries were displayed.
cluster1::*> snap list -vserver vserver2 -volume nfs_data_001
---Blocks---
Vserver Volume Snapshot Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
vserver2 nfs_data_001
weekly.2018-01-07_0015 488KB 0% 50%
weekly.2018-01-14_0015 500KB 0% 50%
daily.2018-01-17_0010 484KB 0% 50%
daily.2018-01-18_0010 416KB 0% 46%
hourly.2018-01-18_1105 216KB 0% 31%
hourly.2018-01-18_1205 88KB 0% 15%
hourly.2018-01-18_1305 268KB 0% 35%
hourly.2018-01-18_1405 260KB 0% 35%
hourly.2018-01-18_1505 88KB 0% 15%
hourly.2018-01-18_1605 252KB 0% 34%
snapshot_001_2018_01_18_16_22_52 248KB 0% 34%
11 entries were displayed.
Use that as an "example" and modify to meet your requirements.
/Matt
If this post resolved your issue, help others by selecting ACCEPT AS SOLUTION or adding a KUDO.