Microsoft Virtualization Discussions

Creating a new volume / share with Powershell


Hello -


I am trying to create a simple powershell script that will walk the steps of create a volume and a share otuside of the UI and force to go through each step along the way.


At first I was trying to make it so you would just fill in the $variables at the top of the script for what you want and then have it run the various new-ncvol commands- but this kept erroring.


Then when i just input New-NcVol it behaved exactly as i wanted to too by then prompting me for voume name, aggragate, juntion path, and size  <-- this is exactly what i want- somthing that a co worker could run and just type in the information / details of the share they want to create - But i always get the same error right after inputting the size?


PS C:\WINDOWS\system32> New-NcVol
cmdlet New-NcVol at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Name: test99
Aggregate: aggr4
JunctionPath: /test99
Size: 10
New-NcVol : Value in $global:CurrentNcController is not of type NetApp.Ontapi.Filer.C.NcController
At line:1 char:1
+ New-NcVol
+ ~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [New-NcVol], ArgumentException
+ FullyQualifiedErrorId : ControllerNotSpecified,DataONTAP.C.PowerShell.SDK.Cmdlets.Volume.NewNcVol

PS C:\WINDOWS\system32>


I am not looking to do bulk deployments or mass automation - just a way for a simple CLI script to walk through the vol / share creattion process so that anyone with some details could enter them in and it would get made - e.g. I send a mail to Joe saying hey man, can you run ( import ontap module etc ) new-ncvol with the following details ( name, size , aggr, svm ) and he would be able to do so for me?


Any help would be most appreciated!






Re: Creating a new volume / share with Powershell


Hi Jordon,


I think the error you are getting might be because you haven't connected to a cluster before attempting to use the New-NcVol cmdlet. You could try something like this basic example, if the user doesn't enter the input parameters when invoking the script they will be prompted for the input.


   [Parameter(Mandatory=$True, HelpMessage="The Cluster name or IP Address")]
   [Parameter(Mandatory=$True, HelpMessage="The vserver name")]
   [Parameter(Mandatory=$True, HelpMessage="The volume name")]
   [Parameter(Mandatory=$True, HelpMessage="The volume size in GB")]
   [Parameter(Mandatory=$False, HelpMessage="The aggregate name")]
   [Parameter(Mandatory=$True, HelpMessage="The aggregate name")]
   [Parameter(Mandatory=$False, HelpMessage="The space reserve")]
   [Parameter(Mandatory=$False, HelpMessage="The security style")]
   [Parameter(Mandatory=$True, HelpMessage="The Credential to connect to the cluster")]
#'Import the PSTK.
[String]$moduleName = "DataONTAP"
   Import-Module -Name $moduleName
   Write-Host "Imported module ""$moduleName"""
   Write-Warning -Message $("Failed importing module ""$moduleName"". Error " + $_.Exception.Message)
#'Connect to the cluster.
   Connect-NcController -Name $Cluster -HTTPS -Credential $Credential -ErrorAction Stop | Out-Null
   Write-Host "Connected to cluster ""$Cluster"""
   Write-Warning -Message $("Failed connecting to cluster ""$Cluster"". Error " + $_.Exception.Message)
#'Set the junction path if not provided.
   [String]$JunctionPath = "/$VolumeName"
#'Create the volume.
[String]$command = $("New-NcVol -Name $VolumeName -Aggregate $AggregateName -JunctionPath $JunctionPath -Size " + $SizeGB + "g -SpaceReserve $SpaceReserve ")
   [String]$command += "-SecurityStyle $SecurityStyle "    
[String]$command += "-VserverContext $VserverName -ErrorAction Stop"
   Invoke-Expression -Command $Command -ErrorAction Stop | Out-Null
   Write-Host "Executed Command`: $command"
   Write-Host $("Created Volume ""$VolumeName"" of size " + $SizeGB + "G on vserver ""$VserverName""")
   Write-Warning -Message $("Failed Executing Command`: $command. Error " + $_.Exception.Message)
   Write-Warning -Message $("Failed creating Volume ""$VolumeName"" of size " + $SizeGB + " on vserver ""$VserverName""")

As an example of running the script:


PS D:\Scripts\PowerShell\Projects\CreateVolume> $credential = Get-Credential -Credential admin
PS D:\Scripts\PowerShell\Projects\CreateVolume> .\CreateVolume.ps1 -Cluster cluster1.testlab.local -VserverName vserver1
 -VolumeName volume1 -SizeGB 10 -AggregateName  node1_aggr1 -Credential $credential
Imported module "DataONTAP"
Connected to cluster "cluster1.testlab.local"
Executed Command: New-NcVol -Name volume1 -Aggregate node1_aggr1 -JunctionPath /volume1 -Size 10g -SpaceReserve none -VserverContext vserver1 -ErrorAction Stop
Created Volume "volume1" of size 10G on vserver "vserver1"

EG cli result:


cluster1::*> vol show -vserver vserver1 -volume volume1 -fields volume, junction-path, aggregate, size, space-guarantee, security-style, state
vserver  volume  aggregate         size state  security-style junction-path space-guarantee
-------- ------- ----------------- ---- ------ -------------- ------------- ---------------
vserver1 volume1 node1_aggr1 10GB online ntfs           /volume1      none

Note: if you don't specifiy the volume security style the new volume will automatically inherit the security style of the vservers root volume.


There are many more options you might want to consider when creating volumes, EG dedupe, export policies etc. This is just an example to get you started, modify to meet your requirements. Hope this helps



If this post resolved your issue, help others by selecting ACCEPT AS SOLUTION or adding a KUDO.

Re: Creating a new volume / share with Powershell


Hi Jordan,


I thought it might also be helpful to provide an example for you on an alternative method to achieve the result via Ansible. Rather than writting a script,  you might consider writting a playbook. EG:


- hosts: localhost
  gather_facts: false
  name: Create Volume CIFS Share
    login: &login
      hostname: cluster1.testlab.local
      username: admin
      password: N0tMyP@ssw0rd!
      https: true
      validate_certs: false
    vserver: vserver1
    volume: volume1
    aggregate: node1_aggr1
    size: 10
  - name: Create Volume
      state: present
      is_online: yes
      name: "{{ volume }}"
      aggregate_name: "{{ aggregate }}"
      size: "{{ size }}"
      size_unit: gb
      space_guarantee: none
      vserver: "{{ vserver }}"
      volume_security_style: ntfs
      wait_for_completion: true
      junction_path: "{{ '/' + volume }}"
      <<: *login
  - name: Create CIFS Share
      state: present
      share_name: "{{ volume + '$' }}"
      path: "{{ '/' + volume }}"
      vserver: "{{ vserver }}"
      share_properties: browsable,oplocks,changenotify,show-previous-versions
      <<: *login

The playbook is just a configuration file in .yml format (no coding required), you then invoke the playbook and Ansible will deploy the configuration for you. EG i saved the above playbook as "create_volume_cifs_share.yml" and then execute it


[root@testux01 playbooks]# ansible-playbook create_volume_cifs_share.yml

PLAY [Create Volume CIFS Share] *********************************************************************************************************************************************************************

TASK [Create Volume] ********************************************************************************************************************************************************************************
changed: [localhost]

TASK [Create CIFS Share] ****************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP ******************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Example CLI result:


cluster1::*> vol show -vserver vserver1 -volume volume1 -fields volume, junction-path, aggregate, size, space-guarantee, security-style
vserver  volume  aggregate         size security-style junction-path space-guarantee
-------- ------- ----------------- ---- -------------- ------------- ---------------
vserver1 volume1 node1_aggr1 10GB ntfs           /volume1      none

cluster1::*> cifs share show -vserver vserver1 -share-name volume1$ -fields volume, share-name, share-properties
vserver  share-name share-properties                                      volume
-------- ---------- ----------------------------------------------------- -------
vserver1 volume1$   browsable,oplocks,changenotify,show-previous-versions volume1

The advantage to this method is that you don't need to develop scripts or write any code. Just define the configuration. Perhaps this is an option for you to consider and explore? A good place to start to learn more if you have never used ansible before is this blog:


Hope that helps? Please let me know if you have any questions?



If this post resolved your issue, help others by selecting ACCEPT AS SOLUTION or adding a KUDO.

View solution in original post

Earn Rewards for Your Review!
GPI Review Banner
All Community Forums