wiki.getshifting.com

--- Sjoerd Hooft's InFormation Technology ---

User Tools

Site Tools


deploystoragetovsphere

Script: PowerCLI: Deploy Storage to vSphere

Summary: A script to configure storage in vSphere.
Date: 29 December 2011
Refactor: 21 February 2025: Checked links and formatting.

I'm actually quite proud on this script. It will create a volume, LUNs, connects the LUNs to the required esx hosts and creates a datastore. On top of that it also sets the MPIO settings correct on the esx host:

########################################################################################################################
# Author : Sjoerd Hooft
# Date Initial Version: 29 December 2011
# Comments: sjoerd_warmetal_nl
#
# Description:
# This script creates a volume per vSphere cluster, then creates LUNs, then connects the newly created lun to the esx hosts inside the cluster and creates the datastores on them.
# Make sure to modify the variables for your environment
#
# Credits:
# The idea for this script is partly from https://communities.netapp.com/docs/DOC-6181, which roughly does the same for NFS volumes.
#
# Recommendations:
# This script must run from the PowerCLI.
#
# Changes:
# Please comment on your changes to the script (your name and email address, line number, description):
# DATE - USERNAME - EMAILADDRESS - CHANGE DESCRIPTION
########################################################################################################################
 
# Script Variables
$timestamp = Get-Date -format "yyyyMMdd-HH.mm"
 
# Getting credentials for vCenter
while ($vcentercredentials -eq $null) {
  Write-Host (get-date -uformat %I:%M:%S) "Please provide authentication credentials for vCenter" -ForegroundColor Green;
  $vcentercredentials = $Host.UI.PromptForCredential("Please enter credentials", "Enter vCenter credentials", "intranet\adminshf", "")
}
 
# Getting credentials for NetApp filer
while ($filercredentials -eq $null) {
  Write-Host (get-date -uformat %I:%M:%S) "Please provide authentication credentials for NetApp filer" -ForegroundColor Green;
  $filercredentials = $Host.UI.PromptForCredential("Please enter credentials", "Enter NetApp filer credentials", "root", "")
}
 
# Setting variables vSphere
$vCenter = "vcenter"
$cluster = "BCP Test"
 
# Setting variables NetApp
$filer = "netappfiler01"
$aggr = "aggr1"
$newvol = "ESX_BCPTEST"
$numberofluns = 2
$lunname = "BCP_"
$lunsize = 4
$size = "g"
$igroup = "ESX_BCP_Hosts"
$startlunid = 201
 
# Import DATA ONTAP Module
Import-module D:\sjoerd\DataONTAP
 
# Connect to vCenter and NetApp Filer
Connect-VIServer $vCenter -Credential $vcentercredentials | Out-Null
Connect-NaController $Filer -Credential $filercredentials | Out-Null
 
# Create a new volume
$tmpvolsize = (($numberofluns * $lunsize) + 1)
$volsize = [string]$tmpvolsize += $size
Write-Host (get-date -uformat %I:%M:%S) "Creating volume $newvol in aggregate $aggr with size $volsize." -ForegroundColor Green;
New-NaVol $newvol $aggr $volsize | Out-Null
 
# Set options for the new volume
Set-NaVolOption $newvol no_atime_update yes | Out-Null
Set-NaVolOption $newvol fractional_reserve 0 | Out-Null
Set-NaSnapshotreserve $newvol 0 | Out-Null
Set-NaSnapshotSchedule $newvol -Weeks 0 -Days 0 -Hours 0 -WhichHours 0 | Out-Null
 
# Creating LUNs
$luncounter = 0
$lunid = $startlunid
$fulllunsize = [string]$lunsize += $size
$esxhost = Get-Cluster $cluster | Get-VMHost | sort | Select-Object -First 1
while ($luncounter -le $numberofluns-1) {
  $lunname | foreach{
      Write-Host (get-date -uformat %I:%M:%S) "Creating lun /vol/$newvol/$_$lunid with size $fulllunsize. " -ForegroundColor Green;
	  New-NaLun /vol/"$newvol"/"$_$lunid" -size $fulllunsize -Type vmware | Out-Null
	  Set-NaLunComment /vol/"$newvol"/"$_$lunid" "LUN for ESX Cluster $cluster" | Out-Null
	  Add-NaLunMap /vol/"$newvol"/"$_$lunid" -InitiatorGroup $igroup -ID $lunid | Out-Null
	  Get-VMHostStorage $esxhost -RescanAllHba -RescanVmfs | Out-Null
	  $path = Get-ScsiLun -vmhost $esxhost -luntype disk | where { $_.runtimename -match $lunid }
	  Write-Host (get-date -uformat %I:%M:%S) "Creating datastore $lunname$lunid on path $path on host $esxhost." -ForegroundColor Green;
	  New-Datastore -vmhost $esxhost -Name "$lunname$lunid" -path $path -vmfs | Out-Null
	  }
  $luncounter++
  $lunid++
}
 
# Rescan storage and datastores on all hosts in the cluster and set MPIO settings for each host.
$esxhosts = Get-Cluster $cluster | Get-VMHost
$rootpasswordsecure = Read-Host -assecurestring "Please enter the password of the root user to configure the MPIO settings on each host"
Function ConvertToPlainText( [security.securestring]$rootpasswordsecure ) {
$marshal = [Runtime.InteropServices.Marshal]
$marshal::PtrToStringAuto( $marshal::SecureStringToBSTR($rootpasswordsecure) ) }
$rootpassword = ConvertToPlainText $rootpasswordsecure
ForEach ($esxhost in $esxhosts) {
   Write-Host (get-date -uformat %I:%M:%S) "Scanning storage on host $esxhost" -ForegroundColor Green;
   Get-VMHostStorage $esxhost -RescanAllHba -RescanVmfs | Out-Null
   Write-Host (get-date -uformat %I:%M:%S) "Setting MPIO on host $esxhost. Logging data to D:\adminshf\mpath_$esxhost" -ForegroundColor Green;
   # Checking for the rsa key to be in cache
   D:\adminshf\plink -ssh $esxhost -l root -pw $rootpassword echo "Connection to $esxhost succesful"
   D:\adminshf\plink -ssh $esxhost -l root -pw $rootpassword /opt/ontap/santools/config_mpath --primary --loadbalance --policy fixed > D:\adminshf\mpath_"$esxhost"_"$timestamp"
   Write-Host (get-date -uformat %I:%M:%S) "Done on host $esxhost" -ForegroundColor Green;
}
deploystoragetovsphere.txt · Last modified: by 127.0.0.1