Lorsque votre cluster Rubrik est installé, il faut se mettre à affecter nos VM sur les SLA afin de les sauvegarder. Une fois que votre vCenter est renseigné dans le cluster Rubrik, vous pouvez affecter vos VM à leur SLA au niveau du vCenter / du datacenter / ou de la vue dossier. Contrairement à VEEAM, Rubrik ne permet pas nativement de le faire automatiquement via les Tag VMware. Le post présent montre comment utiliser les fonctions Powershell Rubrik (donc les API) pour affecter nos VM à des SLA en utilisant les tags VMware.
Au niveau des pré-requis, vous devez premièrement installer la dernière version de VMware PowerCLI (lien). Il est également essentiel de lancer PowerCLI une première fois pour ne pas avoir de message d’erreur lors du lancement du script.
Ensuite, récuperez sur le GitHub Rubrik les cmdlets Powershell (lien). L’intégralité de la documentation est présente sur le lien suivant : full documentation.
Enfin, voici le script qui est utilisé et qui a été entièrement commenté. Il peut être découpé en plusieurs segments :
- Une première partie : Binding des arguments, création du fichier de log, un clear de connexion en cas d’échec dans le code
- seconde partie : variables (Rubrik, vCenter, Credentials)
- troisième partie : la fonction principale de tag VMware et Rubrik
- dernière partie : déconnexion du vCenter et du cluster Rubrik
Un exemple d’appel de ce script : .\Enroll-VMToRubrik.ps1 VMtoMigrate.csv -Verbose
Note : Vous pouvez bien évidemment reprendre ce script et le réduire (sans les try et catch). Car il fait plusieurs tests avec la partie log également. Vous pouvez lancer la commande seule, il s’agit uniquement de faire un exemple des SLA et fonctions Rubrik.
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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 |
[CmdletBinding()] Param([parameter(Mandatory = $True)][ValidateScript({[string]::IsNullOrEmpty($_) -ne $True})][string]$inputCSV ) #region Functions Function Generate-LogVerbose([string]$Output, [string]$Message) { Write-Verbose $Message ((Get-Date -UFormat "[%d-%m-%Y %H:%M:%S] ") + $Message) | Out-File -FilePath $Output -Append -Force } # Function to launch for ending Function Clean-ScriptData { [CmdletBinding()] param( [parameter(Mandatory = $True)][ValidateScript({[string]::IsNullOrEmpty($_) -ne $True})][string]$Status ) #Disconnect from vCenter try { Generate-LogVerbose -Output $logFile -Message "Disconnecting from vCenter" -level 'verbose' Disconnect-VIServer -Server $vCenter -Confirm:$false -ErrorAction Stop -Verbose:$false } catch { Generate-LogVerbose -Output $logFile -Message ('Error when disconnecting from vCenter : ' + $Error[0].Exception.Message) -level 'error' } # Get End Time $endDTM = (Get-Date) $duration = ($endDTM-$startDTM).totalseconds # Echo Time elapsed Generate-LogVerbose -Output $logFile -Message ('Elapsed Time: ' + $duration + ' seconds') -level 'verbose' Generate-LogVerbose -Output $logFile -Message ('Script ending in ' + $Status) -level 'verbose' } #endregion #################################### #Gather working directory $workfolder = Split-Path $script:MyInvocation.MyCommand.Path #Creates log file $date = Get-Date -UFormat "%d-%m-%Y" $logFile = $workfolder + '\' + $date + '-Enroll-VMToRubrik.log' # Rubrik credentials (you can do it with a Get-Credentials) $rubrikUsername = 'admin' $rubrikPassword = 'Rubrik/4u' $rubrikCredentials = New-Object System.Management.Automation.PSCredential($rubrikUsername, (ConvertTo-SecureString -String $rubrikPassword -AsPlainText -Force)) #################################### # Get Start Time $startDTM = (Get-Date) ### Constants definition $vCenter = 'myvcenter.lab.local' $datacenter = 'DC-LAB' $rubrikServer = 'RUB-NODE01.lab.local' #################################### ### Import Rubrik Powershell Module Generate-LogVerbose -Output $logFile -Message ('Importing Rubrik Module') try { Import-Module ($workfolder + '\Rubrik\Rubrik.psm1') -ErrorAction Stop -Verbose:$false Generate-LogVerbose -Output $logFile -Message ('>> Done') } catch { Generate-LogVerbose -Output $logFile -Message ('[ERROR] Import failed : ' + $Error[0].Exception.Message) Clean-ScriptData -Status 'Error' Exit } ### Import PowerCli Module Generate-LogVerbose -Output $logFile -Message 'Loading module VMware.VimAutomation.Core...' if ( (get-module -Name VMware.VimAutomation.Core) -eq $null ) { try { Import-Module -Name VMware.VimAutomation.Core -ErrorAction Stop -Verbose:$false } catch { Generate-LogVerbose -Output $logFile -Message ('Unable to load VMware.VimAutomation.Core : ' + $Error[0].Exception.Message) Clean-ScriptData -Status 'Error' Exit } } ## Connect to vCenter try { Generate-LogVerbose -Output $logFile -Message 'Connecting on VmWare Server' $connection = Connect-VIServer -Server $vCenter -ErrorAction Stop -Verbose:$false } catch { Generate-LogVerbose -Output $logFile -Message 'Unable to connect on VmWare Server' Clean-ScriptData -Status 'Error' Exit } Generate-LogVerbose -Output $logFile -Message ('Connected on : ' + $connection) # Connect to Rubrik try { Generate-LogVerbose -Output $logFile -Message 'Connecting on Rubrik Cluster' $rubrikConnection = Connect-Rubrik -Server $rubrikServer -Credential $rubrikCredentials -ErrorAction Stop } catch { Generate-LogVerbose -Output $logFile -Message ('Unable to connect to Rubrik Cluster: ' + $Error[0].Exception.Message) Clean-ScriptData -Status 'Error' Exit } ### Rubrik Connection status and infos Generate-LogVerbose -Output $logFile -Message ('Connected on : ' + ($rubrikConnection.Value[6]) + ' version : ' + ($rubrikConnection.Value[3])) ### Import CSV with virtual machines VMware Tag $inputData = Import-Csv -Path $inputCSV -Delimiter ';' -Encoding UTF8 #################################### ### Function foreach ($line in $inputData) { # Get VM (first column in CSV) $vmToModify = Get-VM -Name ($line.Hostname) -Verbose:$false -ErrorAction Stop # Set SLA to Tag (second column in CSV) $tagToAssign = get-tag -Name ('SLA_' + $line.Tag) -Verbose:$false -ErrorAction Stop try { # Remove existing tag if it exists Generate-LogVerbose -Output $logFile -Message 'Removing existing tag' Get-TagAssignment -Entity $vmToModify -Verbose:$false -ErrorAction Stop | where{$_.Tag.Name -like "SLA_*"} | Remove-TagAssignment -Confirm:$false -Verbose:$false -ErrorAction Stop Generate-LogVerbose -Output $logFile -Message '>> Done' } catch { Generate-LogVerbose -Output $logFile -Message ('Unable to remove tag on ' + $vmToModify + ' : ' + $Error[0].Exception.Message) Continue } try { # Set tag in CSV for the VM Generate-LogVerbose -Output $logFile -Message ('Assigning tag ' + $tagToAssign + ' on ' + $vmToModify) New-TagAssignment -Tag $tagToAssign -Entity $vmToModify -Confirm:$false -Verbose:$false -ErrorAction Stop | Out-Null Generate-LogVerbose -Output $logFile -Message '>> Done' } catch { Generate-LogVerbose -Output $logFile -Message ('Unable to assign tag on ' + $vmToModify + ' : ' + $Error[0].Exception.Message) Continue } } try { # Using Rubrik PowerShell Module to tag VM in Rubrik SLA_Standard Generate-LogVerbose -Output $logFile -Message ('Protecting VM with tag SLA_Standard') Protect-RubrikTag -Tag 'SLA_Standard' -Category 'Rubrik' -SLA 'Standard' -Confirm:$false Generate-LogVerbose -Output $logFile -Message '>> Done' } catch { Generate-LogVerbose -Output $logFile -Message ('Unable to assign tag on some Vms : ' + $Error[0].Exception.Message) Continue } try { # Using Rubrik PowerShell Module to tag VM in Rubrik SLA_Premium Generate-LogVerbose -Output $logFile -Message ('Protecting VM with tag SLA_Premium') Protect-RubrikTag -Tag 'SLA_Premium' -Category 'Rubrik' -SLA 'Premium' -Confirm:$false Generate-LogVerbose -Output $logFile -Message '>> Done' } catch { Generate-LogVerbose -Output $logFile -Message ('Unable to assign tag on : ' + $Error[0].Exception.Message) Continue } try { # Using Rubrik PowerShell Module to tag VM in Rubrik 'Do Not protect' Generate-LogVerbose -Output $logFile -Message ('Removing Protection') Protect-RubrikTag -Tag 'SLA_NoProtection' -Category 'Rubrik' -DoNotProtect -Confirm:$false Generate-LogVerbose -Output $logFile -Message '>> Done' } catch { Generate-LogVerbose -Output $logFile -Message ('Unable to assign tag on : ' + $Error[0].Exception.Message) Continue } #################################### #region Ending #Disconnect vCenter Disconnect-VIServer -Server $VCenter -Confirm:$false -ErrorAction Stop -Verbose:$false Generate-LogVerbose -Output $logFile -Message 'vCenter Disconnected' #Disconnect Rubrik Disconnect-Rubrik -Server $rubrikServer -Confirm:$false -ErrorAction Stop -Verbose:$false Generate-LogVerbose -Output $logFile -Message 'Rubrik Disconnected' #Export status #Restore error action preference $ErrorActionPreference = $backupErrorActionPreference # Get End Time $endDTM = (Get-Date) $duration = ($endDTM-$startDTM).totalseconds # Echo Time elapsed Generate-LogVerbose -Output $LogFile -Message "Elapsed Time: $duration seconds" Generate-LogVerbose -Output $LogFile -Message "-------------------------------" #endregion |
Le fichier CSV qui est appelé est le suivant (ci-dessous). Il est important de respecter les noms des colonnes ou modifier le script précédent.
Dans notre exemple nous avons des Tag SLA_Standard ou SLA_Premium.
Le fichier CSV s’appellera dans notre exemple : VMtoMigrate.csv
1 2 3 4 5 6 |
Hostname;Tag VMTEST01;Standard VMTEST02;Premium VMTEST03;Standard VMTEST04;Premium VMTEST05;Standard |
A vous les Tag Vmware maintenant 🙂 Dans un prochain épisode, je ferais certainement la partie Backup Verification (appelé SureBackup sur VEEAM) afin d’automatiser la vérification de vos backup Rubrik avec quelques tests.
Hello, Excellent article. Concernant la partie test pourquoi ne pas utiliser pester/vester -> https://www.rubrik.com/blog/automation-to-validate-in-rubrik-backups/ ?