After writing this blogpost on Adding a persistent disk via Powershell with Citrix MCS running on Nutanix AHV I got an email from one of our senior system architects, he asked me about this configuration so I shared the blogpost with him and his customer to find out that this customer enhanced the scripting part by using powershell and ControlUp to initialize format and assign a drive letter to the disk. Smart usage of available tools!
While this customer has ControlUp in the environment (which has full integration with Nutanix AHV by the way: https://www.controlup.com/?s=nutanix) you might not be so lucky to have these tools available. Does that mean you’re left out? Nah, you can easily run the script with a login script or via GPP/GPO so using this script might still be veasable for you!
The new script
Here’s the script Andrew Gresbach has kindly offered to share in this post, it’s simple but immensely effective:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$newdisk = @(get-disk | Where-Object partitionstyle -eq 'raw') $Labels = @('Logs') for($i = 0; $i -lt $newdisk.Count ; $i++) { $disknum = $newdisk[$i].Number $dl = get-Disk $disknum | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize Format-Volume -driveletter $dl.Driveletter -FileSystem NTFS -NewFileSystemLabel $Labels[$i] -Confirm:$false New-Item -ItemType directory -Path D:\Logs\ } |
From Andrew:
Here is the contents of the 2nd script that I threw together that I am running through ControlUP (which basically just runs the powershell commands on the end point Windows vm through their agent). Where the disk add script runs via the Nutanix commandlets at the hypervisor level, this one has to run on the vm level (to simulate like you would do it in Windows)
This one does 3 things basically:
- Initializes the newly added disk
- Formats the disk and adds the new drive letter d:
- Creates the folder “Logs” on the new d: (since Windows can’t write event logs to the root of a drive it needs a folder)
And the last part is following any one of the steps in this article to hide the d: from Windows Explorer: https://www.thewindowsclub.com/show-hide-a-drive-in-windows [thewindowsclub.com]
The previous script
Just for completeness, here’s the script previously mentioned:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# kees@nutanix.com # @kbaggerman on Twitter # http://blog.myvirtualvision.com # Created on March 4, 2019 # Setting parameters for the connection [CmdletBinding(SupportsShouldProcess = $False, ConfirmImpact = "None") ] Param( # Nutanix cluster IP address [Parameter(Mandatory = $true)] [Alias('IP')] [string] $nxIP, # Nutanix cluster username [Parameter(Mandatory = $true)] [Alias('User')] [string] $nxUser, # Nutanix cluster password [Parameter(Mandatory = $true)] [Alias('Password')] [System.Security.SecureString] $nxPassword ) # Adding PS cmdlets $loadedsnapins=(Get-PSSnapin -Registered | Select-Object name).name if(!($loadedsnapins.Contains("NutanixCmdletsPSSnapin"))){ Add-PSSnapin -Name NutanixCmdletsPSSnapin } if ($null -eq (Get-PSSnapin -Name NutanixCmdletsPSSnapin -ErrorAction SilentlyContinue)) { write-log -message "Nutanix CMDlets are not loaded, aborting the script" break } Function write-log { <# .Synopsis Write logs for debugging purposes .Description This function writes logs based on the message including a time stamp for debugging purposes. #> param ( $message, $sev = "INFO" ) if ($sev -eq "INFO"){ write-host "$(get-date -format "hh:mm:ss") | INFO | $message" } elseif ($sev -eq "WARN"){ write-host "$(get-date -format "hh:mm:ss") | WARN | $message" } elseif ($sev -eq "ERROR"){ write-host "$(get-date -format "hh:mm:ss") | ERROR | $message" } elseif ($sev -eq "CHAPTER"){ write-host "`n`n### $message`n`n" } } # Connecting to the Nutanix Cluster $nxServerObj = Connect-NTNXCluster -Server $nxIP -UserName $nxUser -Password $nxPassword -AcceptInvalidSSLCerts if ($null -eq (get-ntnxclusterinfo)) { write-log -message "Cluster connection isn't available, abborting the script" break } ## VM Creation # Setting Variables $VMPrefix = Read-Host -Prompt 'Input your VM Prefix including the wildcard (*)' # Searching for the VM defined write-log -message "Searching for VMs with the prefix $VMPrefix" $vminfo = Get-NTNXVM | Where-Object {$_.vmName -like $VMPrefix} # Looping thru all VMs starting with the prefix and adding a disk Foreach ($vm in $vminfo) { Try { $vmId = ($vm.vmid.split(":"))[2] write-log -message "VM found matching the naming: $($vm.vmName) and VM ID $($vmID)" ## Disk Creation Try { # Setting the SCSI disk of 50GB on Container ID (get-ntnxcontainer -> ContainerId) $diskCreateSpec = New-NTNXObject -Name VmDiskSpecCreateDTO $diskcreatespec.containerid = 1265 $diskcreatespec.sizeMb = 12400 # Creating the Disk $vmDisk = New-NTNXObject –Name VMDiskDTO $vmDisk.vmDiskCreate = $diskCreateSpec # Adding the Disk to the VM Add-NTNXVMDisk -Vmid $vmId -Disks $vmDisk | out-null write-log -message "Adding a 2nd disk to $($vm.vmName)" } Catch { write-log -message "Failed to add a 2nd disk to $vm.vmName" } } Catch { write-log -message "Could not find a VM with the name $($vm.vmName)" } } Disconnect-NTNXCluster * write-log -message "Disconnecting from the cluster" |
Hopefully this helps you when configuring a persistent disk for non-persistent desktops provisioned with Citrix MCS on Nutanix AHV.
Kees Baggerman
Latest posts by Kees Baggerman (see all)
- Nutanix AHV and Citrix MCS: Adding a persistent disk via Powershell – v2 - November 19, 2019
- Recovering a Protection Domain snapshot to a VM - September 13, 2019
- Checking power settings on VMs using powershell - September 11, 2019
- Updated: VM Reporting Script for Nutanix with Powershell - July 3, 2019
- Updated (again!): VM Reporting Script for Nutanix AHV/vSphere with Powershell - June 17, 2019