From 79616aaeeb000d9bf6afa3be795d532f45ec95b3 Mon Sep 17 00:00:00 2001 From: Damani Date: Sat, 24 Oct 2020 00:31:05 -0700 Subject: [PATCH 01/21] Added ability to deploy RVC automatically. --- .vscode/settings.json | 5 +- RVC/Invoke-RubrikVirtualCluster.ps1 | 127 ++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 RVC/Invoke-RubrikVirtualCluster.ps1 diff --git a/.vscode/settings.json b/.vscode/settings.json index ea7da3f..12dffa2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,6 @@ { - "files.defaultLanguage": "Powershell" + "files.defaultLanguage": "Powershell", + "cSpell.words": [ + "pscredential" + ] } \ No newline at end of file diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 new file mode 100644 index 0000000..5e07c47 --- /dev/null +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -0,0 +1,127 @@ +<# + .SYNOPSIS + Will deploy a 4 node Rubrik Virtual Cluster on VMware + + .DESCRIPTION + Will deploy a Rubrik Virtual Cluster on VMware. + This script requires that PowerCLI be installed and is in the users path. + + .PARAMETER JobFile + None + + .INPUTS + Required to updated the following parameters: + $Username - This will be a vCD Admin User + $Password - This will be a vCD Admin User Password + $vCDHost - The address of the vCD Cell you want to export the metadata for + + .OUTPUTS + None + .EXAMPLE + Creating credentials file: + $cred = Get-Credential + $cred | Export-Clixml C:\temp\VMwareCred.xml -Force + + Deploying RVC: + ./Invoke-RubrikVirtualCluster.ps1 options + + .LINK + None + + .NOTES + Name: Deploy Rubrik Virtual Cluster (RVC) + Created: October 23, 2020 + Author: Damani Norman + +#> + +#Requires -Modules VMware.VimAutomation.Core + +param +( + [Parameter(Mandatory = $true, HelpMessage = "The disk mode with which RVC will be deployed.")] + [ValidateSet("EagerZeroedThick", "Thick", "Thin")] + [string] $DiskMode = 'EagerZeroedThick', + + [Parameter(Mandatory = $true, HelpMessage = "The VMware datastore on which RVC will be deployed.")] + [string] $DataStore, + + [Parameter(Mandatory = $true, HelpMessage = "The VMware VM folder in which RVC will be deployed.")] + [string] $VMFolder, + + [Parameter(Mandatory = $true, HelpMessage = "The Data Network to attach RVC to.")] + [string] $DataNetwork, + + [Parameter(Mandatory = $true, HelpMessage = "The Management Network to attach RVC to.")] + [string] $ManagementNetwork, + + [Parameter(Mandatory = $true, HelpMessage = "The prefix to use for each of the node names. A dash and increasing number will be appended during deployment.")] + [string] $NodeNamePrefix, + + [Parameter(Mandatory = $true, HelpMessage = "The VMware data center in which to deploy RVC.")] + [string] $VMwareDataCenter, + + [Parameter(Mandatory = $true, HelpMessage = "The VMware cluster in which to deploy RVC.")] + [string] $VMwareCluster, + + [Parameter(Mandatory = $true, HelpMessage = "The OVA file to deploy RVC from.")] + [string] $OVAFile, + + [Parameter(Mandatory = $true, HelpMessage = "Credentials file for vCenter. ")] + [pscredential] $VMwareCreds, + + [Parameter(Mandatory = $true, HelpMessage = "Hostname of the vCenter server. ")] + [string] $VCenter, + + [Parameter(Mandatory = $true, HelpMessage = "Data Disk Type to Add.")] + [ValidateSet("EagerZeroedThick", "Thick", "Thin")] + [string] $DataDiskType = 'EagerZeroedThick', + + [Parameter(Mandatory = $true, HelpMessage = "Size of data disks to add.")] + [string] $DataDiskSize, + + [Parameter(Mandatory = $true, HelpMessage = "Number of data disks to add to each node.")] + [int] $NumDataDisks = 6, + + [Parameter(Mandatory = $true, HelpMessage = "Number of RVC Nodes to deploy.")] + [int] $NumRVCNodes = 4, + + [Parameter(Mandatory = $false, HelpMessage = "Remove CPU Reservation.")] + [switch] $RemoveCPUReservation = $false + +) + +Import-Module VMware.VimAutomation.Core + +Connect-VIServer $VCenter -Credential $VMwareCreds +# $myDataCenter = Get-Datacenter -Name $VMwareDataCenter +$myCluster = Get-Cluster -Name $VMwareCluster +$myVMHost = Get-VMHost -Name $VCenter +$myDatastore = Get-Datastore -Name $DataStore +$myVMFolder = Get-Folder -Name $VMFolder + +for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { + + $ovfConfig = Get-OvfConfiguration $ovaFile + $ovfConfig.NetworkMapping.Management_Network.Value = $ManagementNetwork + $ovfConfig.NetworkMapping.Data_Network.Value = $DataNetwork + $myRVCName = "$(NodeNamePrefix)-$(myRVCNum)" + Import-VApp -Source $OVAFile ` + -VMHost $myVMHost ` + -Name $myRVCName ` + -Datastore $myDatastore ` + -DiskStorageFormat $DiskMode ` + -InventoryLocation $myVMFolder ` + -Location $myCluster ` + -OvfConfiguration = $ovfConfig + $myVM = Get-VM $myRVCName + for ($myRVCDiskNum = 1; $myRVCDiskNum -le $NumDataDisks; $myRVCDiskNum++) { + $myVM | New-HardDisk -CapacityGB $DataDiskSize -StorageFormat $DataDiskType + } + switch ( $true ) { + $RemoveCPUReservation { + $myVM | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuReservationMhz 0 + } + } + $myVM | Start-VM +} From 47c3b3a8246d7c6cadf08903796ef9e34d468396 Mon Sep 17 00:00:00 2001 From: Damani Date: Sat, 24 Oct 2020 19:01:53 -0700 Subject: [PATCH 02/21] Fix creds file. --- RVC/Invoke-RubrikVirtualCluster.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 5e07c47..752d02e 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -68,7 +68,7 @@ param [string] $OVAFile, [Parameter(Mandatory = $true, HelpMessage = "Credentials file for vCenter. ")] - [pscredential] $VMwareCreds, + [pscredential] $VMwareCredentialFile, [Parameter(Mandatory = $true, HelpMessage = "Hostname of the vCenter server. ")] [string] $VCenter, @@ -93,6 +93,7 @@ param Import-Module VMware.VimAutomation.Core +$VMwareCreds = Import-CliXml -Path $VMwareCredentialFile Connect-VIServer $VCenter -Credential $VMwareCreds # $myDataCenter = Get-Datacenter -Name $VMwareDataCenter $myCluster = Get-Cluster -Name $VMwareCluster From 255525968eb4bc73f07d6d0602d050f7edc3c51a Mon Sep 17 00:00:00 2001 From: Damani Date: Sat, 24 Oct 2020 19:09:11 -0700 Subject: [PATCH 03/21] Fix creds file --- RVC/Invoke-RubrikVirtualCluster.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 752d02e..eba932b 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -68,7 +68,7 @@ param [string] $OVAFile, [Parameter(Mandatory = $true, HelpMessage = "Credentials file for vCenter. ")] - [pscredential] $VMwareCredentialFile, + [string] $VMwareCredentialFile, [Parameter(Mandatory = $true, HelpMessage = "Hostname of the vCenter server. ")] [string] $VCenter, From 8a8f35e2c718cb1620790e6aaae75088c8464ff6 Mon Sep 17 00:00:00 2001 From: Damani Date: Sat, 24 Oct 2020 19:23:40 -0700 Subject: [PATCH 04/21] Fix host selection --- RVC/Invoke-RubrikVirtualCluster.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index eba932b..98a4def 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -97,7 +97,8 @@ $VMwareCreds = Import-CliXml -Path $VMwareCredentialFile Connect-VIServer $VCenter -Credential $VMwareCreds # $myDataCenter = Get-Datacenter -Name $VMwareDataCenter $myCluster = Get-Cluster -Name $VMwareCluster -$myVMHost = Get-VMHost -Name $VCenter +$myVMHosts = $myCluster | Get-VMHost +$myVMHost = $myVMHosts | Select-Object -First 1 $myDatastore = Get-Datastore -Name $DataStore $myVMFolder = Get-Folder -Name $VMFolder From 9ec9067e4e55baed57c41d704cd4eae6e5b2a29c Mon Sep 17 00:00:00 2001 From: Damani Date: Sat, 24 Oct 2020 19:30:39 -0700 Subject: [PATCH 05/21] Fix node name --- RVC/Invoke-RubrikVirtualCluster.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 98a4def..2a00406 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -107,7 +107,7 @@ for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { $ovfConfig = Get-OvfConfiguration $ovaFile $ovfConfig.NetworkMapping.Management_Network.Value = $ManagementNetwork $ovfConfig.NetworkMapping.Data_Network.Value = $DataNetwork - $myRVCName = "$(NodeNamePrefix)-$(myRVCNum)" + $myRVCName = "$NodeNamePrefix-$myRVCNum" Import-VApp -Source $OVAFile ` -VMHost $myVMHost ` -Name $myRVCName ` From c20f48af231aa67461483ad64c6e1a3713c286b8 Mon Sep 17 00:00:00 2001 From: Damani Date: Sat, 24 Oct 2020 19:43:59 -0700 Subject: [PATCH 06/21] Fix import-vapp --- RVC/Invoke-RubrikVirtualCluster.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 2a00406..7956e48 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -115,7 +115,7 @@ for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { -DiskStorageFormat $DiskMode ` -InventoryLocation $myVMFolder ` -Location $myCluster ` - -OvfConfiguration = $ovfConfig + -OvfConfiguration $ovfConfig $myVM = Get-VM $myRVCName for ($myRVCDiskNum = 1; $myRVCDiskNum -le $NumDataDisks; $myRVCDiskNum++) { $myVM | New-HardDisk -CapacityGB $DataDiskSize -StorageFormat $DataDiskType From 0005f30753d0785cada1f0d404ad7ad9f3f10240 Mon Sep 17 00:00:00 2001 From: Damani Date: Sat, 24 Oct 2020 20:03:08 -0700 Subject: [PATCH 07/21] Fix self signed SSL certs --- RVC/Invoke-RubrikVirtualCluster.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 7956e48..cf9fa27 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -94,6 +94,7 @@ param Import-Module VMware.VimAutomation.Core $VMwareCreds = Import-CliXml -Path $VMwareCredentialFile +Set-PowerCLIConfiguration -InvalidCertificateAction Ignore Connect-VIServer $VCenter -Credential $VMwareCreds # $myDataCenter = Get-Datacenter -Name $VMwareDataCenter $myCluster = Get-Cluster -Name $VMwareCluster From f080d6befebe893dd9b2d2819085dc3942776edf Mon Sep 17 00:00:00 2001 From: Damani Date: Sat, 24 Oct 2020 20:13:46 -0700 Subject: [PATCH 08/21] Remove ssl fix --- RVC/Invoke-RubrikVirtualCluster.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index cf9fa27..7956e48 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -94,7 +94,6 @@ param Import-Module VMware.VimAutomation.Core $VMwareCreds = Import-CliXml -Path $VMwareCredentialFile -Set-PowerCLIConfiguration -InvalidCertificateAction Ignore Connect-VIServer $VCenter -Credential $VMwareCreds # $myDataCenter = Get-Datacenter -Name $VMwareDataCenter $myCluster = Get-Cluster -Name $VMwareCluster From bd3869c1e267199639d8d8307ce7beb1a4d84dc2 Mon Sep 17 00:00:00 2001 From: Damani Date: Sun, 25 Oct 2020 10:40:07 -0700 Subject: [PATCH 09/21] switch to ovftool --- .vscode/settings.json | 1 + RVC/Invoke-RubrikVirtualCluster.ps1 | 41 ++++++++++++++++++----------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 12dffa2..846ad5c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { "files.defaultLanguage": "Powershell", "cSpell.words": [ + "ovftool", "pscredential" ] } \ No newline at end of file diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 7956e48..3646555 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -96,26 +96,35 @@ Import-Module VMware.VimAutomation.Core $VMwareCreds = Import-CliXml -Path $VMwareCredentialFile Connect-VIServer $VCenter -Credential $VMwareCreds # $myDataCenter = Get-Datacenter -Name $VMwareDataCenter -$myCluster = Get-Cluster -Name $VMwareCluster -$myVMHosts = $myCluster | Get-VMHost -$myVMHost = $myVMHosts | Select-Object -First 1 -$myDatastore = Get-Datastore -Name $DataStore -$myVMFolder = Get-Folder -Name $VMFolder +# $myCluster = Get-Cluster -Name $VMwareCluster +# $myVMHosts = $myCluster | Get-VMHost +# $myVMHost = $myVMHosts | Select-Object -First 1 +# $myDatastore = Get-Datastore -Name $DataStore +# $myVMFolder = Get-Folder -Name $VMFolder for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { - $ovfConfig = Get-OvfConfiguration $ovaFile - $ovfConfig.NetworkMapping.Management_Network.Value = $ManagementNetwork - $ovfConfig.NetworkMapping.Data_Network.Value = $DataNetwork $myRVCName = "$NodeNamePrefix-$myRVCNum" - Import-VApp -Source $OVAFile ` - -VMHost $myVMHost ` - -Name $myRVCName ` - -Datastore $myDatastore ` - -DiskStorageFormat $DiskMode ` - -InventoryLocation $myVMFolder ` - -Location $myCluster ` - -OvfConfiguration $ovfConfig + # $ovfConfig = Get-OvfConfiguration $ovaFile + # $ovfConfig.NetworkMapping.Management_Network.Value = $ManagementNetwork + # $ovfConfig.NetworkMapping.Data_Network.Value = $DataNetwork + # Import-VApp -Source $OVAFile ` + # -VMHost $myVMHost ` + # -Name $myRVCName ` + # -Datastore $myDatastore ` + # -DiskStorageFormat $DiskMode ` + # -InventoryLocation $myVMFolder ` + # -Location $myCluster ` + # -OvfConfiguration $ovfConfig + ovftool --acceptAllEulas --powerOffTarget --noSSLVerify --allowExtraConfig ` + --diskMode=$DiskMode ` + --name=$myRVCName ` + --datastore=$DataStore ` + --vmFolder="$VMFolder" ` + --net:"Management Network"="$ManagementNetwork" ` + --net:"Data Network"="$DataNetwork" ` + $OVAFile ` + "vi://${VMwareCreds.UserName}:${$VMwareCreds.GetNetworkCredential().password}@${VCenter}/${DataCenter}/host/${Cluster}" $myVM = Get-VM $myRVCName for ($myRVCDiskNum = 1; $myRVCDiskNum -le $NumDataDisks; $myRVCDiskNum++) { $myVM | New-HardDisk -CapacityGB $DataDiskSize -StorageFormat $DataDiskType From 61345271e32612ab682d95e5bd413255c1515397 Mon Sep 17 00:00:00 2001 From: Damani Date: Sun, 25 Oct 2020 10:44:51 -0700 Subject: [PATCH 10/21] Bugfix --- RVC/Invoke-RubrikVirtualCluster.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 3646555..c2b6313 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -124,7 +124,7 @@ for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { --net:"Management Network"="$ManagementNetwork" ` --net:"Data Network"="$DataNetwork" ` $OVAFile ` - "vi://${VMwareCreds.UserName}:${$VMwareCreds.GetNetworkCredential().password}@${VCenter}/${DataCenter}/host/${Cluster}" + "vi://${VMwareCreds.UserName}:${VMwareCreds.GetNetworkCredential().password}@${VCenter}/${DataCenter}/host/${Cluster}" $myVM = Get-VM $myRVCName for ($myRVCDiskNum = 1; $myRVCDiskNum -le $NumDataDisks; $myRVCDiskNum++) { $myVM | New-HardDisk -CapacityGB $DataDiskSize -StorageFormat $DataDiskType From 8aabeaf7771a05456c2028aeaea1f45d93bd899b Mon Sep 17 00:00:00 2001 From: Damani Date: Sun, 25 Oct 2020 10:46:52 -0700 Subject: [PATCH 11/21] Syntax fix --- RVC/Invoke-RubrikVirtualCluster.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index c2b6313..6b1d72d 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -124,7 +124,7 @@ for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { --net:"Management Network"="$ManagementNetwork" ` --net:"Data Network"="$DataNetwork" ` $OVAFile ` - "vi://${VMwareCreds.UserName}:${VMwareCreds.GetNetworkCredential().password}@${VCenter}/${DataCenter}/host/${Cluster}" + "vi://${VMwareCreds}.UserName:${VMwareCreds}.GetNetworkCredential().password@${VCenter}/${DataCenter}/host/${Cluster}" $myVM = Get-VM $myRVCName for ($myRVCDiskNum = 1; $myRVCDiskNum -le $NumDataDisks; $myRVCDiskNum++) { $myVM | New-HardDisk -CapacityGB $DataDiskSize -StorageFormat $DataDiskType From a8d9c7cb11fe1ed8dbd7d5872cfdb81e99a8bb5e Mon Sep 17 00:00:00 2001 From: Damani Date: Sun, 25 Oct 2020 10:49:00 -0700 Subject: [PATCH 12/21] Bugfix --- RVC/Invoke-RubrikVirtualCluster.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 6b1d72d..3528cba 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -116,6 +116,8 @@ for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { # -InventoryLocation $myVMFolder ` # -Location $myCluster ` # -OvfConfiguration $ovfConfig + $myVMwareUsername = $VMwareCreds.UserName + $myVMwarePassword = $VMwareCreds.GetNetworkCredential().password ovftool --acceptAllEulas --powerOffTarget --noSSLVerify --allowExtraConfig ` --diskMode=$DiskMode ` --name=$myRVCName ` @@ -124,7 +126,7 @@ for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { --net:"Management Network"="$ManagementNetwork" ` --net:"Data Network"="$DataNetwork" ` $OVAFile ` - "vi://${VMwareCreds}.UserName:${VMwareCreds}.GetNetworkCredential().password@${VCenter}/${DataCenter}/host/${Cluster}" + "vi://${myVMwareUsername}:${myVMwarePassword}@${VCenter}/${DataCenter}/host/${Cluster}" $myVM = Get-VM $myRVCName for ($myRVCDiskNum = 1; $myRVCDiskNum -le $NumDataDisks; $myRVCDiskNum++) { $myVM | New-HardDisk -CapacityGB $DataDiskSize -StorageFormat $DataDiskType From 22ccaa6e563de52b238fe4554c9dbc9befd2f669 Mon Sep 17 00:00:00 2001 From: Damani Date: Sun, 25 Oct 2020 10:51:17 -0700 Subject: [PATCH 13/21] Add DataCenter option --- RVC/Invoke-RubrikVirtualCluster.ps1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 3528cba..b5b8425 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -46,6 +46,9 @@ param [Parameter(Mandatory = $true, HelpMessage = "The VMware datastore on which RVC will be deployed.")] [string] $DataStore, + [Parameter(Mandatory = $true, HelpMessage = "The VMware VM folder in which RVC will be deployed.")] + [string] $DataCenter, + [Parameter(Mandatory = $true, HelpMessage = "The VMware VM folder in which RVC will be deployed.")] [string] $VMFolder, @@ -126,7 +129,7 @@ for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { --net:"Management Network"="$ManagementNetwork" ` --net:"Data Network"="$DataNetwork" ` $OVAFile ` - "vi://${myVMwareUsername}:${myVMwarePassword}@${VCenter}/${DataCenter}/host/${Cluster}" + "vi://${myVMwareUsername}:${myVMwarePassword}@${VCenter}/${DataCenter}/host/${VMwareCluster}" $myVM = Get-VM $myRVCName for ($myRVCDiskNum = 1; $myRVCDiskNum -le $NumDataDisks; $myRVCDiskNum++) { $myVM | New-HardDisk -CapacityGB $DataDiskSize -StorageFormat $DataDiskType From 8f05ea66d6d335240ec5cc34707ab0e157cc69d5 Mon Sep 17 00:00:00 2001 From: Damani Date: Sun, 25 Oct 2020 15:49:47 -0700 Subject: [PATCH 14/21] Corrected Description --- RVC/Invoke-RubrikVirtualCluster.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index b5b8425..26c6e00 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -46,7 +46,7 @@ param [Parameter(Mandatory = $true, HelpMessage = "The VMware datastore on which RVC will be deployed.")] [string] $DataStore, - [Parameter(Mandatory = $true, HelpMessage = "The VMware VM folder in which RVC will be deployed.")] + [Parameter(Mandatory = $true, HelpMessage = "The VMware Data Center where RVC will be deployed.")] [string] $DataCenter, [Parameter(Mandatory = $true, HelpMessage = "The VMware VM folder in which RVC will be deployed.")] From b97debde05dfab68aec232e8686c01cfacf20af4 Mon Sep 17 00:00:00 2001 From: Damani Date: Sun, 25 Oct 2020 15:49:56 -0700 Subject: [PATCH 15/21] Added config file support and sorted params --- .vscode/settings.json | 2 + RVC/Invoke-RubrikVirtualCluster.ps1 | 119 +++++++++++------- ...mple-Invoke-RubrikVirtualClusterConfig.ps1 | 15 +++ 3 files changed, 89 insertions(+), 47 deletions(-) create mode 100644 RVC/Sample-Invoke-RubrikVirtualClusterConfig.ps1 diff --git a/.vscode/settings.json b/.vscode/settings.json index 846ad5c..999df60 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,8 @@ { "files.defaultLanguage": "Powershell", "cSpell.words": [ + "RVCOS", + "RVCOVA", "ovftool", "pscredential" ] diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 26c6e00..2177919 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -39,65 +39,85 @@ param ( - [Parameter(Mandatory = $true, HelpMessage = "The disk mode with which RVC will be deployed.")] + [Parameter(Mandatory = $true, HelpMessage = "Size of RVC data disks to add.", + ParameterSetName = "Command Line")] + [string] $RVCDataDiskSize, + + [Parameter(Mandatory = $true, HelpMessage = "RVC Data Disk Type to Add.", + ParameterSetName = "Command Line")] [ValidateSet("EagerZeroedThick", "Thick", "Thin")] - [string] $DiskMode = 'EagerZeroedThick', + [string] $RVCDataDiskType = 'EagerZeroedThick', - [Parameter(Mandatory = $true, HelpMessage = "The VMware datastore on which RVC will be deployed.")] - [string] $DataStore, + [Parameter(Mandatory = $true, HelpMessage = "The Data Network to attach RVC to.", + ParameterSetName = "Command Line")] + [string] $RVCDataNetwork, - [Parameter(Mandatory = $true, HelpMessage = "The VMware Data Center where RVC will be deployed.")] - [string] $DataCenter, + [Parameter(Mandatory = $true, HelpMessage = "The Management Network to attach RVC to.", + ParameterSetName = "Command Line")] + [string] $RVCManagementNetwork, - [Parameter(Mandatory = $true, HelpMessage = "The VMware VM folder in which RVC will be deployed.")] - [string] $VMFolder, + [Parameter(Mandatory = $true, HelpMessage = "Name of the Rubrik Virtual Cluster. Nodes will be named by adding a dash and increasing number will be appended during deployment.", + ParameterSetName = "Command Line")] + [string] $RVCName, - [Parameter(Mandatory = $true, HelpMessage = "The Data Network to attach RVC to.")] - [string] $DataNetwork, - - [Parameter(Mandatory = $true, HelpMessage = "The Management Network to attach RVC to.")] - [string] $ManagementNetwork, - - [Parameter(Mandatory = $true, HelpMessage = "The prefix to use for each of the node names. A dash and increasing number will be appended during deployment.")] - [string] $NodeNamePrefix, + [Parameter(Mandatory = $true, HelpMessage = "Number of RVC Nodes to deploy.", + ParameterSetName = "Command Line")] + [int] $RVCNumNodes = 4, - [Parameter(Mandatory = $true, HelpMessage = "The VMware data center in which to deploy RVC.")] - [string] $VMwareDataCenter, + [Parameter(Mandatory = $true, HelpMessage = "Number of data disks to add to each node.", + ParameterSetName = "Command Line")] + [int] $RVCNumDataDisks = 6, - [Parameter(Mandatory = $true, HelpMessage = "The VMware cluster in which to deploy RVC.")] - [string] $VMwareCluster, + [Parameter(Mandatory = $true, HelpMessage = "The disk mode with which RVC will be deployed.", + ParameterSetName = "Command Line")] + [ValidateSet("EagerZeroedThick", "Thick", "Thin")] + [string] $RVCOSDataDiskType = 'EagerZeroedThick', + + [Parameter(Mandatory = $true, HelpMessage = "The OVA file to deploy RVC from.", + ParameterSetName = "Command Line")] + [string] $RVCOVAFile, - [Parameter(Mandatory = $true, HelpMessage = "The OVA file to deploy RVC from.")] - [string] $OVAFile, + [Parameter(Mandatory = $true, HelpMessage = "The VMware cluster in which to deploy RVC.", + ParameterSetName = "Command Line")] + [string] $VMwareCluster, - [Parameter(Mandatory = $true, HelpMessage = "Credentials file for vCenter. ")] + [Parameter(Mandatory = $true, HelpMessage = "Credentials file for vCenter.", + ParameterSetName = "Command Line")] [string] $VMwareCredentialFile, - [Parameter(Mandatory = $true, HelpMessage = "Hostname of the vCenter server. ")] - [string] $VCenter, + [Parameter(Mandatory = $true, HelpMessage = "The VMware data center in which to deploy RVC.", + ParameterSetName = "Command Line")] + [string] $VMwareDataCenter, - [Parameter(Mandatory = $true, HelpMessage = "Data Disk Type to Add.")] - [ValidateSet("EagerZeroedThick", "Thick", "Thin")] - [string] $DataDiskType = 'EagerZeroedThick', + [Parameter(Mandatory = $true, HelpMessage = "The VMware datastore on which RVC will be deployed.", + ParameterSetName = "Command Line")] + [string] $VMwareDataStore, - [Parameter(Mandatory = $true, HelpMessage = "Size of data disks to add.")] - [string] $DataDiskSize, - - [Parameter(Mandatory = $true, HelpMessage = "Number of data disks to add to each node.")] - [int] $NumDataDisks = 6, + [Parameter(Mandatory = $true, HelpMessage = "Hostname of the vCenter server.", + ParameterSetName = "Command Line")] + [string] $VMwareVCenter, - [Parameter(Mandatory = $true, HelpMessage = "Number of RVC Nodes to deploy.")] - [int] $NumRVCNodes = 4, + [Parameter(Mandatory = $true, HelpMessage = "The VMware VM folder in which RVC will be deployed.", + ParameterSetName = "Command Line")] + [string] $VMwareVMFolder, + + [Parameter(Mandatory = $true, HelpMessage = "Configuration file with parameters.", + ParameterSetName = "Config File")] + [string] $ConfigFile, [Parameter(Mandatory = $false, HelpMessage = "Remove CPU Reservation.")] [switch] $RemoveCPUReservation = $false ) +if ($ConfigFile) { + . $ConfigFile +} + Import-Module VMware.VimAutomation.Core $VMwareCreds = Import-CliXml -Path $VMwareCredentialFile -Connect-VIServer $VCenter -Credential $VMwareCreds +Connect-VIServer $VMwareVCenter -Credential $VMwareCreds # $myDataCenter = Get-Datacenter -Name $VMwareDataCenter # $myCluster = Get-Cluster -Name $VMwareCluster # $myVMHosts = $myCluster | Get-VMHost @@ -105,9 +125,9 @@ Connect-VIServer $VCenter -Credential $VMwareCreds # $myDatastore = Get-Datastore -Name $DataStore # $myVMFolder = Get-Folder -Name $VMFolder -for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { +for ($myRVCNum = 1; $myRVCNum -le $RVCNumNodes; $myRVCNum++) { - $myRVCName = "$NodeNamePrefix-$myRVCNum" + $myRVCName = "$RVCName-$myRVCNum" # $ovfConfig = Get-OvfConfiguration $ovaFile # $ovfConfig.NetworkMapping.Management_Network.Value = $ManagementNetwork # $ovfConfig.NetworkMapping.Data_Network.Value = $DataNetwork @@ -122,17 +142,17 @@ for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { $myVMwareUsername = $VMwareCreds.UserName $myVMwarePassword = $VMwareCreds.GetNetworkCredential().password ovftool --acceptAllEulas --powerOffTarget --noSSLVerify --allowExtraConfig ` - --diskMode=$DiskMode ` + --diskMode=$RVCOSDiskType ` --name=$myRVCName ` - --datastore=$DataStore ` - --vmFolder="$VMFolder" ` - --net:"Management Network"="$ManagementNetwork" ` - --net:"Data Network"="$DataNetwork" ` - $OVAFile ` - "vi://${myVMwareUsername}:${myVMwarePassword}@${VCenter}/${DataCenter}/host/${VMwareCluster}" + --datastore=$VMwareDataStore ` + --vmFolder="$VMwareVMFolder" ` + --net:"Management Network"="$RVCManagementNetwork" ` + --net:"Data Network"="$RVCDataNetwork" ` + $RVCOVAFile ` + "vi://${myVMwareUsername}:${myVMwarePassword}@${VMwareVCenter}/${VMwareDataCenter}/host/${VMwareCluster}" $myVM = Get-VM $myRVCName - for ($myRVCDiskNum = 1; $myRVCDiskNum -le $NumDataDisks; $myRVCDiskNum++) { - $myVM | New-HardDisk -CapacityGB $DataDiskSize -StorageFormat $DataDiskType + for ($myRVCDiskNum = 1; $myRVCDiskNum -le $RVCNumDataDisks; $myRVCDiskNum++) { + $myVM | New-HardDisk -CapacityGB $RVCDataDiskSize -StorageFormat $RVCDataDiskType } switch ( $true ) { $RemoveCPUReservation { @@ -141,3 +161,8 @@ for ($myRVCNum = 1; $myRVCNum -le $NumRVCNodes; $myRVCNum++) { } $myVM | Start-VM } + +# Bootstrap cluster +# Set Cluster Location +# Add vCenter +# Register with Polaris \ No newline at end of file diff --git a/RVC/Sample-Invoke-RubrikVirtualClusterConfig.ps1 b/RVC/Sample-Invoke-RubrikVirtualClusterConfig.ps1 new file mode 100644 index 0000000..5adac1f --- /dev/null +++ b/RVC/Sample-Invoke-RubrikVirtualClusterConfig.ps1 @@ -0,0 +1,15 @@ +$RVCDataDiskSize = 6144 +$RVCDataDiskType = "EagerZeroedThick" +$RVCDataNetwork = "myFastDataNetwork" +$RVCManagementNetwork = "myAwesomeManagementNetwork" +$RVCName = "myCoolClusterName" +$RVCNumNodes = 4 +$RVCNumDataDisks = 6 +$RVCOSDiskType = "EagerZeroedThick" +$RVCOVAFile = "rubrik-vc-vr6412-esx-5.3.0-123456.ova" +$VMwareCluster = "myNiceVMwareCluster" +$VMwareCredentialFile = "myFantasticVCenterCreds.xml" +$VMwareDataCenter = "myLovelyVMwareDataCenter" +$VMwareDataStore = "myBigDataStore" +$VMwareVCenter = "myFantasticVCenter" +$VMwareVMFolder = "myStupendousVMFolderDir/myGreatVMFolderName" \ No newline at end of file From 037f29d5ef2266846f5cc051eb1d9ed4ffd6f0f2 Mon Sep 17 00:00:00 2001 From: Damani Date: Wed, 28 Oct 2020 15:39:37 -0700 Subject: [PATCH 16/21] Updated Help Text and comments --- RVC/Invoke-RubrikVirtualCluster.ps1 | 106 +++++++++++++++++++++++----- 1 file changed, 89 insertions(+), 17 deletions(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 2177919..385c081 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -1,32 +1,87 @@ <# .SYNOPSIS - Will deploy a 4 node Rubrik Virtual Cluster on VMware + Deploys a Rubrik Virtual Cluster on VMware and adds data disks .DESCRIPTION - Will deploy a Rubrik Virtual Cluster on VMware. + This script deploy a Rubrik Virtual Cluster on VMware. It will also add the data disks to the cluster in VMware. This script requires that PowerCLI be installed and is in the users path. + This script requires that OVFTool be installed in the users path. - .PARAMETER JobFile - None + .PARAMETER RVCDataDiskSize + Size of RVC data disks to add. - .INPUTS - Required to updated the following parameters: - $Username - This will be a vCD Admin User - $Password - This will be a vCD Admin User Password - $vCDHost - The address of the vCD Cell you want to export the metadata for + .PARAMETER RVCDataDiskType + RVC Data Disk Type to Add. The officially supported type is EagerZeroedThick. Thick and Thin can only be used for testing. + + .PARAMETER RVCDataNetwork + The Data Network to attach RVC to. This is the name of the network or switch port in VMware. + + .PARAMETER RVCManagementNetwork + The Management Network to attach RVC to. This is the name of the network or switch port in VMware. + + .PARAMETER RVCName + Name of the Rubrik Virtual Cluster. Nodes will be named by adding a dash and increasing number will be appended during deployment. + + .PARAMETER RVCNumNodes + Number of RVC Nodes to deploy. + + .PARAMETER RVCNumDataDisks + Number of data disks to add to each node. + + .PARAMETER RVCOSDataDiskType + The disk mode with which RVC will be deployed. The officially supported type is EagerZeroedThick. Thick and Thin can only be used for testing. + + .PARAMETER RVCOVAFile + The OVA file to deploy RVC from. + + .PARAMETER VMwareCluster + The VMware cluster in which to deploy RVC. + + .PARAMETER VMwareCredentialFile + Credentials file for vCenter. + Use the following commands to create a credentials file: + + $cred = Get-Credential + $cred | Export-Clixml C:\temp\VMwareCred.xml -Force + + .PARAMETER VMwareDataCenter + The VMware data center in which to deploy RVC. + + .PARAMETER VMwareDataStore + The VMware datastore on which RVC will be deployed. + + .PARAMETER VMwareVCenter + Hostname of the vCenter server. + .PARAMETER VMwareVMFolder + The VMware VM folder in which RVC will be deployed. + + .PARAMETER ConfigFile + Configuration file with parameters. + + .PARAMETER RemoveCPUReservation + (Experimental) Remove CPU Reservation. + + .INPUTS + None .OUTPUTS None .EXAMPLE - Creating credentials file: - $cred = Get-Credential - $cred | Export-Clixml C:\temp\VMwareCred.xml -Force + $cred = Get-Credential + PS > $cred | Export-Clixml C:\temp\VMwareCred.xml -Force - Deploying RVC: - ./Invoke-RubrikVirtualCluster.ps1 options + .EXAMPLE + ./Invoke-RubrikVirtualCluster.ps1 -ConfigFile ./Sample-Invoke-RubrikVirtualClusterConfig.ps1 + + .EXAMPLE + ./Invoke-RubrikVirtualCluster.ps1 -RVCDataDiskSize 6144 -RVCDataDiskType "EagerZeroedThick" -RVCDataNetwork "myFastDataNetwork" -RVCManagementNetwork "myAwesomeManagementNetwork" -RVCName "myCoolClusterName" -RVCNumNodes 4 -RVCNumDataDisks 6 -RVCOSDiskType "EagerZeroedThick" -RVCOVAFile "rubrik-vc-vr6412-esx-5.3.0-123456.ova" -VMwareCluster "myNiceVMwareCluster" -VMwareCredentialFile "myFantasticVCenterCreds.xml" -VMwareDataCenter "myLovelyVMwareDataCenter" -VMwareDataStore "myBigDataStore" -VMwareVCenter "myFantasticVCenter" -VMwareVMFolder "myStupendousVMFolderDir/myGreatVMFolderName" .LINK - None + https://github.com/rubrikinc/rubrik-scripts-for-powershell + .LINK + https://www.vmware.com/support/developer/PowerCLI/ + .LINK + https://code.vmware.com/web/tool/4.4.0/ovf .NOTES Name: Deploy Rubrik Virtual Cluster (RVC) @@ -105,7 +160,7 @@ param ParameterSetName = "Config File")] [string] $ConfigFile, - [Parameter(Mandatory = $false, HelpMessage = "Remove CPU Reservation.")] + [Parameter(Mandatory = $false, HelpMessage = "(Experimental) Remove CPU Reservation.")] [switch] $RemoveCPUReservation = $false ) @@ -114,6 +169,19 @@ if ($ConfigFile) { . $ConfigFile } +if ($null -eq (Get-Command "ovftool.exe" -ErrorAction SilentlyContinue) -And $null -eq (Get-Command "ovftool" -ErrorAction SilentlyContinue)) { + Write-Host "Unable to find ovftool in your PATH." + Write-Host "Verify that ovftool is installed." + exit 1 +} + +if ((Get-Command "Connect-VIServer" -ErrorAction SilentlyContinue)) { + Write-Host "Unable to find Connect-VIServer in your PATH" + Write-Host "Make sure that PowerCLI is installed." + exit 1 +} + + Import-Module VMware.VimAutomation.Core $VMwareCreds = Import-CliXml -Path $VMwareCredentialFile @@ -125,6 +193,7 @@ Connect-VIServer $VMwareVCenter -Credential $VMwareCreds # $myDatastore = Get-Datastore -Name $DataStore # $myVMFolder = Get-Folder -Name $VMFolder +$node_config = @{} for ($myRVCNum = 1; $myRVCNum -le $RVCNumNodes; $myRVCNum++) { $myRVCName = "$RVCName-$myRVCNum" @@ -159,7 +228,10 @@ for ($myRVCNum = 1; $myRVCNum -le $RVCNumNodes; $myRVCNum++) { $myVM | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuReservationMhz 0 } } - $myVM | Start-VM + # # Gather Bootstrap Info for node. + # $myVM | Start-VM + # $myNodeName = $myVM | select @{N = 'FQDN'; E = { $_.ExtensionData.Guest.IPStack[0].DnsConfig.HostName} + # } } # Bootstrap cluster From d75d7a67766b4ee9d63e9625af079c1d3fe2868a Mon Sep 17 00:00:00 2001 From: Damani Date: Wed, 28 Oct 2020 15:43:13 -0700 Subject: [PATCH 17/21] Cleaned up development code and comments --- RVC/Invoke-RubrikVirtualCluster.ps1 | 32 ++--------------------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 385c081..c3d9702 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -138,7 +138,7 @@ param [Parameter(Mandatory = $true, HelpMessage = "Credentials file for vCenter.", ParameterSetName = "Command Line")] - [string] $VMwareCredentialFile, + [Security.SecureString] $VMwareCredentialFile, [Parameter(Mandatory = $true, HelpMessage = "The VMware data center in which to deploy RVC.", ParameterSetName = "Command Line")] @@ -180,34 +180,15 @@ if ((Get-Command "Connect-VIServer" -ErrorAction SilentlyContinue)) { Write-Host "Make sure that PowerCLI is installed." exit 1 } - Import-Module VMware.VimAutomation.Core $VMwareCreds = Import-CliXml -Path $VMwareCredentialFile Connect-VIServer $VMwareVCenter -Credential $VMwareCreds -# $myDataCenter = Get-Datacenter -Name $VMwareDataCenter -# $myCluster = Get-Cluster -Name $VMwareCluster -# $myVMHosts = $myCluster | Get-VMHost -# $myVMHost = $myVMHosts | Select-Object -First 1 -# $myDatastore = Get-Datastore -Name $DataStore -# $myVMFolder = Get-Folder -Name $VMFolder - -$node_config = @{} + for ($myRVCNum = 1; $myRVCNum -le $RVCNumNodes; $myRVCNum++) { $myRVCName = "$RVCName-$myRVCNum" - # $ovfConfig = Get-OvfConfiguration $ovaFile - # $ovfConfig.NetworkMapping.Management_Network.Value = $ManagementNetwork - # $ovfConfig.NetworkMapping.Data_Network.Value = $DataNetwork - # Import-VApp -Source $OVAFile ` - # -VMHost $myVMHost ` - # -Name $myRVCName ` - # -Datastore $myDatastore ` - # -DiskStorageFormat $DiskMode ` - # -InventoryLocation $myVMFolder ` - # -Location $myCluster ` - # -OvfConfiguration $ovfConfig $myVMwareUsername = $VMwareCreds.UserName $myVMwarePassword = $VMwareCreds.GetNetworkCredential().password ovftool --acceptAllEulas --powerOffTarget --noSSLVerify --allowExtraConfig ` @@ -228,13 +209,4 @@ for ($myRVCNum = 1; $myRVCNum -le $RVCNumNodes; $myRVCNum++) { $myVM | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuReservationMhz 0 } } - # # Gather Bootstrap Info for node. - # $myVM | Start-VM - # $myNodeName = $myVM | select @{N = 'FQDN'; E = { $_.ExtensionData.Guest.IPStack[0].DnsConfig.HostName} - # } } - -# Bootstrap cluster -# Set Cluster Location -# Add vCenter -# Register with Polaris \ No newline at end of file From 068bf07b9a6827a5e3a6b26135008508aa01a9c2 Mon Sep 17 00:00:00 2001 From: Damani Date: Wed, 28 Oct 2020 18:59:50 -0700 Subject: [PATCH 18/21] Bugfix --- RVC/Invoke-RubrikVirtualCluster.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index c3d9702..6b9a6ff 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -175,7 +175,7 @@ if ($null -eq (Get-Command "ovftool.exe" -ErrorAction SilentlyContinue) -And $nu exit 1 } -if ((Get-Command "Connect-VIServer" -ErrorAction SilentlyContinue)) { +if ($null -eq (Get-Command "Connect-VIServer" -ErrorAction SilentlyContinue)) { Write-Host "Unable to find Connect-VIServer in your PATH" Write-Host "Make sure that PowerCLI is installed." exit 1 From f5969ed69ee440b4ccce93c72c3540f646e4bb96 Mon Sep 17 00:00:00 2001 From: Damani Date: Wed, 28 Oct 2020 19:07:40 -0700 Subject: [PATCH 19/21] Switch back to string --- RVC/Invoke-RubrikVirtualCluster.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 6b9a6ff..38f7840 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -138,7 +138,7 @@ param [Parameter(Mandatory = $true, HelpMessage = "Credentials file for vCenter.", ParameterSetName = "Command Line")] - [Security.SecureString] $VMwareCredentialFile, + [String] $VMwareCredentialFile, [Parameter(Mandatory = $true, HelpMessage = "The VMware data center in which to deploy RVC.", ParameterSetName = "Command Line")] From adb6780cff9714ac961c21fdc9c1b39d5679e4f7 Mon Sep 17 00:00:00 2001 From: Damani Date: Thu, 5 Nov 2020 15:50:32 -0800 Subject: [PATCH 20/21] Start VM after deployment. --- RVC/Invoke-RubrikVirtualCluster.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 index 38f7840..1c8762b 100644 --- a/RVC/Invoke-RubrikVirtualCluster.ps1 +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -209,4 +209,5 @@ for ($myRVCNum = 1; $myRVCNum -le $RVCNumNodes; $myRVCNum++) { $myVM | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuReservationMhz 0 } } + $myVM | Start-VM } From 21caac68fcfac23241e15876bfbafe8238b53e6c Mon Sep 17 00:00:00 2001 From: Damani Date: Sat, 24 Oct 2020 00:31:05 -0700 Subject: [PATCH 21/21] Added ability to deploy RVC automatically. Fix creds file. Fix creds file Fix host selection Fix node name Fix import-vapp Fix self signed SSL certs Remove ssl fix switch to ovftool Bugfix Syntax fix Bugfix Add DataCenter option Corrected Description Added config file support and sorted params Updated Help Text and comments Cleaned up development code and comments Bugfix Switch back to string Start VM after deployment. --- .vscode/settings.json | 8 +- RVC/Invoke-RubrikVirtualCluster.ps1 | 213 ++++++++++++++++++ ...mple-Invoke-RubrikVirtualClusterConfig.ps1 | 15 ++ 3 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 RVC/Invoke-RubrikVirtualCluster.ps1 create mode 100644 RVC/Sample-Invoke-RubrikVirtualClusterConfig.ps1 diff --git a/.vscode/settings.json b/.vscode/settings.json index ea7da3f..999df60 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,9 @@ { - "files.defaultLanguage": "Powershell" + "files.defaultLanguage": "Powershell", + "cSpell.words": [ + "RVCOS", + "RVCOVA", + "ovftool", + "pscredential" + ] } \ No newline at end of file diff --git a/RVC/Invoke-RubrikVirtualCluster.ps1 b/RVC/Invoke-RubrikVirtualCluster.ps1 new file mode 100644 index 0000000..1c8762b --- /dev/null +++ b/RVC/Invoke-RubrikVirtualCluster.ps1 @@ -0,0 +1,213 @@ +<# + .SYNOPSIS + Deploys a Rubrik Virtual Cluster on VMware and adds data disks + + .DESCRIPTION + This script deploy a Rubrik Virtual Cluster on VMware. It will also add the data disks to the cluster in VMware. + This script requires that PowerCLI be installed and is in the users path. + This script requires that OVFTool be installed in the users path. + + .PARAMETER RVCDataDiskSize + Size of RVC data disks to add. + + .PARAMETER RVCDataDiskType + RVC Data Disk Type to Add. The officially supported type is EagerZeroedThick. Thick and Thin can only be used for testing. + + .PARAMETER RVCDataNetwork + The Data Network to attach RVC to. This is the name of the network or switch port in VMware. + + .PARAMETER RVCManagementNetwork + The Management Network to attach RVC to. This is the name of the network or switch port in VMware. + + .PARAMETER RVCName + Name of the Rubrik Virtual Cluster. Nodes will be named by adding a dash and increasing number will be appended during deployment. + + .PARAMETER RVCNumNodes + Number of RVC Nodes to deploy. + + .PARAMETER RVCNumDataDisks + Number of data disks to add to each node. + + .PARAMETER RVCOSDataDiskType + The disk mode with which RVC will be deployed. The officially supported type is EagerZeroedThick. Thick and Thin can only be used for testing. + + .PARAMETER RVCOVAFile + The OVA file to deploy RVC from. + + .PARAMETER VMwareCluster + The VMware cluster in which to deploy RVC. + + .PARAMETER VMwareCredentialFile + Credentials file for vCenter. + Use the following commands to create a credentials file: + + $cred = Get-Credential + $cred | Export-Clixml C:\temp\VMwareCred.xml -Force + + .PARAMETER VMwareDataCenter + The VMware data center in which to deploy RVC. + + .PARAMETER VMwareDataStore + The VMware datastore on which RVC will be deployed. + + .PARAMETER VMwareVCenter + Hostname of the vCenter server. + + .PARAMETER VMwareVMFolder + The VMware VM folder in which RVC will be deployed. + + .PARAMETER ConfigFile + Configuration file with parameters. + + .PARAMETER RemoveCPUReservation + (Experimental) Remove CPU Reservation. + + .INPUTS + None + .OUTPUTS + None + .EXAMPLE + $cred = Get-Credential + PS > $cred | Export-Clixml C:\temp\VMwareCred.xml -Force + + .EXAMPLE + ./Invoke-RubrikVirtualCluster.ps1 -ConfigFile ./Sample-Invoke-RubrikVirtualClusterConfig.ps1 + + .EXAMPLE + ./Invoke-RubrikVirtualCluster.ps1 -RVCDataDiskSize 6144 -RVCDataDiskType "EagerZeroedThick" -RVCDataNetwork "myFastDataNetwork" -RVCManagementNetwork "myAwesomeManagementNetwork" -RVCName "myCoolClusterName" -RVCNumNodes 4 -RVCNumDataDisks 6 -RVCOSDiskType "EagerZeroedThick" -RVCOVAFile "rubrik-vc-vr6412-esx-5.3.0-123456.ova" -VMwareCluster "myNiceVMwareCluster" -VMwareCredentialFile "myFantasticVCenterCreds.xml" -VMwareDataCenter "myLovelyVMwareDataCenter" -VMwareDataStore "myBigDataStore" -VMwareVCenter "myFantasticVCenter" -VMwareVMFolder "myStupendousVMFolderDir/myGreatVMFolderName" + + .LINK + https://github.com/rubrikinc/rubrik-scripts-for-powershell + .LINK + https://www.vmware.com/support/developer/PowerCLI/ + .LINK + https://code.vmware.com/web/tool/4.4.0/ovf + + .NOTES + Name: Deploy Rubrik Virtual Cluster (RVC) + Created: October 23, 2020 + Author: Damani Norman + +#> + +#Requires -Modules VMware.VimAutomation.Core + +param +( + [Parameter(Mandatory = $true, HelpMessage = "Size of RVC data disks to add.", + ParameterSetName = "Command Line")] + [string] $RVCDataDiskSize, + + [Parameter(Mandatory = $true, HelpMessage = "RVC Data Disk Type to Add.", + ParameterSetName = "Command Line")] + [ValidateSet("EagerZeroedThick", "Thick", "Thin")] + [string] $RVCDataDiskType = 'EagerZeroedThick', + + [Parameter(Mandatory = $true, HelpMessage = "The Data Network to attach RVC to.", + ParameterSetName = "Command Line")] + [string] $RVCDataNetwork, + + [Parameter(Mandatory = $true, HelpMessage = "The Management Network to attach RVC to.", + ParameterSetName = "Command Line")] + [string] $RVCManagementNetwork, + + [Parameter(Mandatory = $true, HelpMessage = "Name of the Rubrik Virtual Cluster. Nodes will be named by adding a dash and increasing number will be appended during deployment.", + ParameterSetName = "Command Line")] + [string] $RVCName, + + [Parameter(Mandatory = $true, HelpMessage = "Number of RVC Nodes to deploy.", + ParameterSetName = "Command Line")] + [int] $RVCNumNodes = 4, + + [Parameter(Mandatory = $true, HelpMessage = "Number of data disks to add to each node.", + ParameterSetName = "Command Line")] + [int] $RVCNumDataDisks = 6, + + [Parameter(Mandatory = $true, HelpMessage = "The disk mode with which RVC will be deployed.", + ParameterSetName = "Command Line")] + [ValidateSet("EagerZeroedThick", "Thick", "Thin")] + [string] $RVCOSDataDiskType = 'EagerZeroedThick', + + [Parameter(Mandatory = $true, HelpMessage = "The OVA file to deploy RVC from.", + ParameterSetName = "Command Line")] + [string] $RVCOVAFile, + + [Parameter(Mandatory = $true, HelpMessage = "The VMware cluster in which to deploy RVC.", + ParameterSetName = "Command Line")] + [string] $VMwareCluster, + + [Parameter(Mandatory = $true, HelpMessage = "Credentials file for vCenter.", + ParameterSetName = "Command Line")] + [String] $VMwareCredentialFile, + + [Parameter(Mandatory = $true, HelpMessage = "The VMware data center in which to deploy RVC.", + ParameterSetName = "Command Line")] + [string] $VMwareDataCenter, + + [Parameter(Mandatory = $true, HelpMessage = "The VMware datastore on which RVC will be deployed.", + ParameterSetName = "Command Line")] + [string] $VMwareDataStore, + + [Parameter(Mandatory = $true, HelpMessage = "Hostname of the vCenter server.", + ParameterSetName = "Command Line")] + [string] $VMwareVCenter, + + [Parameter(Mandatory = $true, HelpMessage = "The VMware VM folder in which RVC will be deployed.", + ParameterSetName = "Command Line")] + [string] $VMwareVMFolder, + + [Parameter(Mandatory = $true, HelpMessage = "Configuration file with parameters.", + ParameterSetName = "Config File")] + [string] $ConfigFile, + + [Parameter(Mandatory = $false, HelpMessage = "(Experimental) Remove CPU Reservation.")] + [switch] $RemoveCPUReservation = $false + +) + +if ($ConfigFile) { + . $ConfigFile +} + +if ($null -eq (Get-Command "ovftool.exe" -ErrorAction SilentlyContinue) -And $null -eq (Get-Command "ovftool" -ErrorAction SilentlyContinue)) { + Write-Host "Unable to find ovftool in your PATH." + Write-Host "Verify that ovftool is installed." + exit 1 +} + +if ($null -eq (Get-Command "Connect-VIServer" -ErrorAction SilentlyContinue)) { + Write-Host "Unable to find Connect-VIServer in your PATH" + Write-Host "Make sure that PowerCLI is installed." + exit 1 +} + +Import-Module VMware.VimAutomation.Core + +$VMwareCreds = Import-CliXml -Path $VMwareCredentialFile +Connect-VIServer $VMwareVCenter -Credential $VMwareCreds + +for ($myRVCNum = 1; $myRVCNum -le $RVCNumNodes; $myRVCNum++) { + + $myRVCName = "$RVCName-$myRVCNum" + $myVMwareUsername = $VMwareCreds.UserName + $myVMwarePassword = $VMwareCreds.GetNetworkCredential().password + ovftool --acceptAllEulas --powerOffTarget --noSSLVerify --allowExtraConfig ` + --diskMode=$RVCOSDiskType ` + --name=$myRVCName ` + --datastore=$VMwareDataStore ` + --vmFolder="$VMwareVMFolder" ` + --net:"Management Network"="$RVCManagementNetwork" ` + --net:"Data Network"="$RVCDataNetwork" ` + $RVCOVAFile ` + "vi://${myVMwareUsername}:${myVMwarePassword}@${VMwareVCenter}/${VMwareDataCenter}/host/${VMwareCluster}" + $myVM = Get-VM $myRVCName + for ($myRVCDiskNum = 1; $myRVCDiskNum -le $RVCNumDataDisks; $myRVCDiskNum++) { + $myVM | New-HardDisk -CapacityGB $RVCDataDiskSize -StorageFormat $RVCDataDiskType + } + switch ( $true ) { + $RemoveCPUReservation { + $myVM | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuReservationMhz 0 + } + } + $myVM | Start-VM +} diff --git a/RVC/Sample-Invoke-RubrikVirtualClusterConfig.ps1 b/RVC/Sample-Invoke-RubrikVirtualClusterConfig.ps1 new file mode 100644 index 0000000..5adac1f --- /dev/null +++ b/RVC/Sample-Invoke-RubrikVirtualClusterConfig.ps1 @@ -0,0 +1,15 @@ +$RVCDataDiskSize = 6144 +$RVCDataDiskType = "EagerZeroedThick" +$RVCDataNetwork = "myFastDataNetwork" +$RVCManagementNetwork = "myAwesomeManagementNetwork" +$RVCName = "myCoolClusterName" +$RVCNumNodes = 4 +$RVCNumDataDisks = 6 +$RVCOSDiskType = "EagerZeroedThick" +$RVCOVAFile = "rubrik-vc-vr6412-esx-5.3.0-123456.ova" +$VMwareCluster = "myNiceVMwareCluster" +$VMwareCredentialFile = "myFantasticVCenterCreds.xml" +$VMwareDataCenter = "myLovelyVMwareDataCenter" +$VMwareDataStore = "myBigDataStore" +$VMwareVCenter = "myFantasticVCenter" +$VMwareVMFolder = "myStupendousVMFolderDir/myGreatVMFolderName" \ No newline at end of file