535 lines
25 KiB
PowerShell
535 lines
25 KiB
PowerShell
|
# Script to add add ESX servers to vCenter and do initial configuration
|
|||
|
#
|
|||
|
#
|
|||
|
# Version 0.9
|
|||
|
#
|
|||
|
#
|
|||
|
if (Test-Path C:\PSFunctions.ps1) {
|
|||
|
. "C:\PSFunctions.ps1"
|
|||
|
} else {
|
|||
|
Write-BuildLog "PSFunctions.ps1 not found. Please copy all PowerShell files from B:\Automate to C:\ and rerun AddHosts.ps1"
|
|||
|
Read-Host "Press <Enter> to exit"
|
|||
|
exit
|
|||
|
}
|
|||
|
#if ((Test-Administrator) -and (Test-Path "C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe")) {
|
|||
|
# Write-BuildLog " "
|
|||
|
# Write-BuildLog "This script should not be 'Run As Administrator'"
|
|||
|
# Write-BuildLog " "
|
|||
|
# Write-BuildLog "Just double click the shortcut"
|
|||
|
# Write-BuildLog " "
|
|||
|
# Read-Host "Press <Enter> to exit"
|
|||
|
# exit
|
|||
|
#}
|
|||
|
$a = (Get-Host).UI.RawUI
|
|||
|
$b = $a.WindowSize
|
|||
|
$b.Height = $a.MaxWindowSize.Height -1
|
|||
|
$a.WindowSize = $b
|
|||
|
# WASP is a 64bit plugin, the Guest Cust. PowerCLI commands are only 32bit
|
|||
|
#import-module C:\windows\system32\WASP.dll
|
|||
|
#select-window -Title "Administrator: C:\*" | set-windowposition -left 3 -top 3
|
|||
|
|
|||
|
$Subnet = ((Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .).IPAddress[0]).split(".")[2]
|
|||
|
If ($Subnet -eq "199") {
|
|||
|
Write-BuildLog "Building Primary Site"
|
|||
|
$HostPrefix = "host"
|
|||
|
$DCName = "Lab"
|
|||
|
$ClusterName = "Local"
|
|||
|
$SRM = $False
|
|||
|
}
|
|||
|
If ($Subnet -eq "201") {
|
|||
|
Write-BuildLog "Building SRM Site"
|
|||
|
$HostPrefix = "host1"
|
|||
|
$DCName = "SRM"
|
|||
|
$ClusterName = "DR"
|
|||
|
$SRM = $True
|
|||
|
}
|
|||
|
|
|||
|
if ((Get-Service vpxd).Status -eq "Starting") {
|
|||
|
Write-BuildLog "The vCenter service is still starting; script will pause until service has started."
|
|||
|
do {
|
|||
|
Start-Sleep -Seconds 30
|
|||
|
} until ((Get-Service vpxd).Status -eq "Running")
|
|||
|
} elseif ((Get-Service vpxd).Status -eq "Stopped") {
|
|||
|
Write-BuildLog "The vCenter service is stopped. Please verify the DC VM is powered on and databases have started."
|
|||
|
Read-Host "Press <Enter> to exit"
|
|||
|
exit
|
|||
|
}
|
|||
|
|
|||
|
if ((Get-PSSnapin -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue) -eq $null) {
|
|||
|
try {
|
|||
|
Write-BuildLog "Loading PowerCLI plugin, this may take a little while."
|
|||
|
Add-PSSnapin VMware.VimAutomation.Core
|
|||
|
}
|
|||
|
catch {
|
|||
|
Write-BuildLog "Unable to load the PowerCLI plugin. Please verify installation or install VMware PowerCLI and run this script again."
|
|||
|
Read-Host "Press <Enter> to exit"
|
|||
|
exit
|
|||
|
}
|
|||
|
}
|
|||
|
for ($i=1;$i -le 4; $i++) {
|
|||
|
$vmhost = "$HostPrefix$i.lab.local"
|
|||
|
$ping = new-object System.Net.NetworkInformation.Ping
|
|||
|
$Reply = $ping.send($vmhost)
|
|||
|
if ($Reply.status <EFBFBD>eq "Success") {
|
|||
|
$MaxHosts = $i
|
|||
|
} else {
|
|||
|
$i =4
|
|||
|
}
|
|||
|
}
|
|||
|
If (!($MaxHosts -ge 2)){
|
|||
|
Write-Host "Couldn't find first two hosts to build, need host1 & host2 built before running this script"
|
|||
|
Read-Host "Build the hosts & rerun this script"
|
|||
|
Exit
|
|||
|
}
|
|||
|
Write-BuildLog " "
|
|||
|
If (!(Test-Path "B:\*")) { Net use B: \\nas\Build}
|
|||
|
if (Test-Path "B:\Automate\automate.ini") {
|
|||
|
Write-BuildLog "Determining automate.ini settings."
|
|||
|
$AdminPWD = ((Select-String -SimpleMatch "Adminpwd=" -Path "B:\Automate\automate.ini").line).substring(9)
|
|||
|
$createds = ((Select-String -SimpleMatch "BuildDatastores=" -Path "B:\Automate\automate.ini").line).substring(16).Trim()
|
|||
|
$createvm = ((Select-String -SimpleMatch "BuildVM=" -Path "B:\Automate\automate.ini").line).substring(8).Trim()
|
|||
|
$createxp = ((Select-String -SimpleMatch "BuildViewVM=" -Path "B:\Automate\automate.ini").line).substring(12).Trim()
|
|||
|
if ($createds -like "true") {
|
|||
|
$createds = $true
|
|||
|
Write-BuildLog " Datastores will be built and added to vCenter."
|
|||
|
} else {
|
|||
|
$createds = $false
|
|||
|
}
|
|||
|
if ($createvm -like "true") {
|
|||
|
$createvm = $true
|
|||
|
$ProdKey = ((Select-String -SimpleMatch "ProductKey=" -Path "B:\Automate\automate.ini" -List).line).substring(11).Trim()
|
|||
|
Write-BuildLog " Windows 2003 VM for Lab will be created."
|
|||
|
} else {
|
|||
|
$createvm = $false
|
|||
|
}
|
|||
|
if ($createxp -like "true") {
|
|||
|
$createxp = $true
|
|||
|
$XPKey = ((Select-String -SimpleMatch "ViewVMProductKey=" -Path "B:\Automate\automate.ini").line).substring(17)
|
|||
|
Write-BuildLog " Windows XP VM for VMware View Lab to be built."
|
|||
|
} else {
|
|||
|
$createxp = $false
|
|||
|
}
|
|||
|
} else {
|
|||
|
Write-BuildLog "Unable to find B:\Automate\automate.ini. Where did it go?"
|
|||
|
}
|
|||
|
|
|||
|
Write-BuildLog "Connect to vCenter; this takes a while and may show a warning in yellow"
|
|||
|
|
|||
|
try {
|
|||
|
If ($SRM -eq $True) {$Connect = "vc2.lab.local"}
|
|||
|
Else {$VCServer = "vc.lab.local"}
|
|||
|
$Connect = Connect-VIServer $VCServer
|
|||
|
}
|
|||
|
catch {
|
|||
|
Write-BuildLog "Unable to connect to vCenter. Exiting."
|
|||
|
Read-Host "Press <Enter> to exit"
|
|||
|
exit
|
|||
|
}
|
|||
|
Write-BuildLog "Create datacenter and cluster"
|
|||
|
if ((Get-DataCenter | where {$_.Name -eq $DCName}) -eq $null) {
|
|||
|
$newDC = New-DataCenter -Location (Get-Folder -NoRecursion) -Name $DCName
|
|||
|
$dc = $newDC.ExtensionData.MoRef
|
|||
|
$pool = New-Object VMware.Vim.IpPool
|
|||
|
$pool.name = "MyIPPool"
|
|||
|
$pool.ipv4Config = New-Object VMware.Vim.IpPoolIpPoolConfigInfo
|
|||
|
$pool.ipv4Config.subnetAddress = "192.168.$Subnet.0"
|
|||
|
$pool.ipv4Config.netmask = "255.255.255.0"
|
|||
|
$pool.ipv4Config.gateway = "192.168.$Subnet.2"
|
|||
|
$pool.ipv4Config.range = "192.168.$Subnet.200#16"
|
|||
|
$pool.ipv4Config.dns = New-Object System.String[] (1)
|
|||
|
$pool.ipv4Config.dns[0] = "192.168.$Subnet.4"
|
|||
|
$pool.ipv4Config.dhcpServerAvailable = $false
|
|||
|
$pool.ipv4Config.ipPoolEnabled = $true
|
|||
|
$pool.ipv6Config = New-Object VMware.Vim.IpPoolIpPoolConfigInfo
|
|||
|
$pool.ipv6Config.subnetAddress = ""
|
|||
|
$pool.ipv6Config.netmask = "ffff:ffff:ffff:ffff:ffff:ffff::"
|
|||
|
$pool.ipv6Config.gateway = ""
|
|||
|
$pool.ipv6Config.dns = New-Object System.String[] (1)
|
|||
|
$pool.ipv6Config.dns[0] = ""
|
|||
|
$pool.ipv6Config.dhcpServerAvailable = $false
|
|||
|
$pool.ipv6Config.ipPoolEnabled = $false
|
|||
|
$pool.dnsDomain = ""
|
|||
|
$pool.dnsSearchPath = ""
|
|||
|
$pool.hostPrefix = ""
|
|||
|
$pool.httpProxy = ""
|
|||
|
$pool.networkAssociation = New-Object VMware.Vim.IpPoolAssociation[] (1)
|
|||
|
$pool.networkAssociation[0] = New-Object VMware.Vim.IpPoolAssociation
|
|||
|
$pool.networkAssociation[0].network = New-Object VMware.Vim.ManagedObjectReference
|
|||
|
$pool.networkAssociation[0].network.type = "DistributedVirtualPortgroup"
|
|||
|
$pool.networkAssociation[0].network.Value = "dvportgroup-178"
|
|||
|
$pool.networkAssociation[0].networkName = ""
|
|||
|
$PoolManager = Get-View -Id 'IpPoolManager-IpPoolManager'
|
|||
|
$Nul = $PoolManager.CreateIpPool($dc, $pool)
|
|||
|
}
|
|||
|
if ((Get-Cluster | where {$_.Name -eq $ClusterName}) -eq $null) {
|
|||
|
$Cluster = New-Cluster $ClusterName -DRSEnabled -Location $DCName -DRSAutomationLevel FullyAutomated
|
|||
|
}
|
|||
|
|
|||
|
for ($i=1;$i -le $MaxHosts; $i++) {
|
|||
|
$Num = $i +10
|
|||
|
$VMHost = $HostPrefix
|
|||
|
$VMHost += $i
|
|||
|
$VMHost += ".lab.local"
|
|||
|
$VMotionIP = "172.16.$SubNet."
|
|||
|
$VMotionIP += $Num
|
|||
|
$IPStoreIP1 = "172.17.$SubNet."
|
|||
|
$IPStoreIP1 += $Num
|
|||
|
$IPStoreIP2 = "172.17.$SubNet."
|
|||
|
$Num = $i +20
|
|||
|
$IPStoreIP2 += $Num
|
|||
|
$FTIP = "172.16.$SubNet."
|
|||
|
$FTIP += $Num
|
|||
|
$Num = $i +40
|
|||
|
$vHeartBeatIP = "172.16.$SubNet."
|
|||
|
$vHeartBeatIP += $Num
|
|||
|
Write-BuildLog $VMHost
|
|||
|
if ((Get-VMHost | where {$_.Name -eq $VMHost}) -eq $null) {
|
|||
|
$Null = Add-VMHost $VMhost -user root -password $AdminPWD -Location $ClusterName -force:$true
|
|||
|
Start-Sleep -Seconds 30
|
|||
|
try {
|
|||
|
$null = Get-VMHost $VMHost
|
|||
|
}
|
|||
|
catch {
|
|||
|
Write-BuildLog "Unable to find " $VMHost "; please verify the host is built and rerun the AddHosts script."
|
|||
|
Read-Host "Press <Enter> to exit"
|
|||
|
exit
|
|||
|
}
|
|||
|
Start-Sleep 5
|
|||
|
While ((Get-VMHost $VMHost).ConnectionState -ne "Connected"){
|
|||
|
Write-BuildLog " "
|
|||
|
Write-BuildLog $VMHost " is not yet connected. Pausing for 5 seconds."
|
|||
|
Write-BuildLog " "
|
|||
|
Start-Sleep 5
|
|||
|
}
|
|||
|
$VMHostObj = Get-VMHost $VMHost
|
|||
|
if (($vmhostObj.ExtensionData.Config.Product.FullName.Contains("ESXi")) -and ((get-VmHostNtpServer $VMhostobj) -ne "192.168.199.4")) {
|
|||
|
# These services aren't relevant on ESX Classic, only ESXi
|
|||
|
$null = Add-VMHostNtpServer -NtpServer "192.168.199.4" -VMHost $VMhost
|
|||
|
$ntp = Get-VMHostService -VMHost $VMhost | Where {$_.Key -eq "ntpd"}
|
|||
|
$null = Set-VMHostService $ntp -Policy "On"
|
|||
|
$SSH = Get-VMHostService -VMHost $VMhost | Where {$_.Key -eq "TSM-SSH"}
|
|||
|
$null = Set-VMHostService $SSH -Policy "On"
|
|||
|
$TSM = Get-VMHostService -VMHost $VMhost | Where {$_.Key -eq "TSM"}
|
|||
|
$null = Set-VMHostService $TSM -Policy "On"
|
|||
|
if ($vmhostObj.version.split(".")[0] -ne "4") {
|
|||
|
if ($PCLIVerNum -ge 51) {
|
|||
|
$null = Get-AdvancedSetting -Entity $VMHostObj -Name "UserVars.SuppressShellWarning" | Set-AdvancedSetting -Value "1" -confirm:$false
|
|||
|
} else {
|
|||
|
$null = Set-VMHostAdvancedConfiguration -vmhost $VMhost -Name "UserVars.SuppressShellWarning" -Value 1
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
$DSName = $VMHost.split('.')[0]
|
|||
|
$DSName += "_Local"
|
|||
|
$sharableIds = Get-ShareableDatastore | Foreach {$_.ID }
|
|||
|
$null = Get-Datastore -vmhost $vmhost | Where {$sharableIds -notcontains $_.ID } | Set-DataStore -Name $DSName
|
|||
|
$switch = Get-VirtualSwitch -vmHost $vmHostobj
|
|||
|
if($switch -isnot [system.array]) {
|
|||
|
Write-BuildLog " Configuring network."
|
|||
|
$null = set-VirtualSwitch $switch -Nic vmnic0,vmnic1 -confirm:$false
|
|||
|
$pg = New-VirtualPortGroup -Name vMotion -VirtualSwitch $switch
|
|||
|
if ($vmhostObj.ExtensionData.Config.Product.FullName.Contains("ESXi")) {
|
|||
|
$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $VMotionIP -SubnetMask "255.255.255.0" -vMotionEnabled:$true -ManagementTrafficEnabled:$True
|
|||
|
} else {
|
|||
|
$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $VMotionIP -SubnetMask "255.255.255.0" -vMotionEnabled:$true
|
|||
|
$pg = New-VirtualPortGroup -Name vHeartBeat -VirtualSwitch $switch
|
|||
|
$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $vHeartBeatIP -SubnetMask "255.255.255.0" -ConsoleNIC
|
|||
|
}
|
|||
|
$pg = New-VirtualPortGroup -Name FT -VirtualSwitch $switch
|
|||
|
$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $FTIP -SubnetMask "255.255.255.0" -FaultToleranceLoggingEnabled:$true
|
|||
|
$pg = New-VirtualPortGroup -Name IPStore1 -VirtualSwitch $switch
|
|||
|
$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $IPStoreIP1 -SubnetMask "255.255.255.0"
|
|||
|
$pg = New-VirtualPortGroup -Name IPStore2 -VirtualSwitch $switch
|
|||
|
$null = New-VMHostNetworkAdapter -VMHost $vmhost -Portgroup $pg -VirtualSwitch $switch -IP $IPStoreIP2 -SubnetMask "255.255.255.0"
|
|||
|
$null = Get-VMHostStorage $VMHost | Set-VMHostStorage -SoftwareIScsiEnabled $true
|
|||
|
$null = get-virtualportgroup -name vMotion | Get-NicTeamingPolicy | Set-NicTeamingPolicy -MakeNicActive vmnic1
|
|||
|
$null = get-virtualportgroup -name vMotion | Get-NicTeamingPolicy | Set-NicTeamingPolicy -MakeNicStandby vmnic0
|
|||
|
$pnic = (Get-VMhostNetworkAdapter -VMHost $VMHost -Physical)[2]
|
|||
|
$switch = New-VirtualSwitch -VMhost $vmHost -Nic $pnic.DeviceName -NumPorts 128 -Name vSwitch1
|
|||
|
$null = New-VirtualPortGroup -Name Servers -VirtualSwitch $switch
|
|||
|
$null = New-VirtualPortGroup -Name Workstations -VirtualSwitch $switch
|
|||
|
$null = set-VirtualSwitch $switch -Nic vmnic2,vmnic3 -confirm:$false
|
|||
|
Start-Sleep -Seconds 30
|
|||
|
If ($SRM -ne $True) {
|
|||
|
Write-BuildLog " Add NFS datastores"
|
|||
|
# Build datastore now added in unattend script
|
|||
|
#$null = New-Datastore -nfs -VMhost $vmhost -Name Build -NFSHost "172.17.199.7" -Path "/mnt/LABVOL/Build" -readonly
|
|||
|
$null = New-Datastore -nfs -VMhost $vmhost -Name NFS01 -NFSHost "172.17.199.7" -Path "/mnt/LABVOL/NFS01"
|
|||
|
$null = New-Datastore -nfs -VMhost $vmhost -Name NFS02 -NFSHost "172.17.199.7" -Path "/mnt/LABVOL/NFS02"
|
|||
|
}
|
|||
|
if ($vmhostObj.version.split(".")[0] -ne "4") {
|
|||
|
$null = remove-datastore -VMhost $vmhost -datastore remote-install-location -confirm:$false
|
|||
|
}
|
|||
|
Write-BuildLog " Configuring iSCSI"
|
|||
|
$MyIQN = "iqn.1998-01.com.vmware:" + $VMHost.split('.')[0]
|
|||
|
$null = Get-VMHostHba -VMhost $vmhost -Type iScsi | Set-VMHostHBA -IScsiName $MyIQN
|
|||
|
If ($SRM -ne $True) {
|
|||
|
$null = Get-VMHostHba -VMhost $vmhost -Type iScsi | New-IScsiHbaTarget -Address 172.17.199.7 -Type Send
|
|||
|
$null = Get-VMHostStorage $VMHost -RescanAllHba
|
|||
|
}
|
|||
|
}
|
|||
|
$null = Move-VMhost $VMHost -Destination $ClusterName
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Write-BuildLog "Restarting all hosts for consistency. This will take a few minutes."
|
|||
|
$null = Get-VMHost -location $ClusterName | Restart-VMHost -confirm:$false -Force
|
|||
|
Write-Host "Wait until all hosts have stopped pinging"
|
|||
|
$PingStatus = @()
|
|||
|
for ($i=1;$i -le $MaxHosts; $i++) {$PingStatus +=$True}
|
|||
|
do {
|
|||
|
Start-Sleep -Seconds 1
|
|||
|
$ping = new-object System.Net.NetworkInformation.Ping
|
|||
|
for ($i=1;$i -le $MaxHosts; $i++) {
|
|||
|
$VMHost = $HostPrefix
|
|||
|
$VMHost += $i
|
|||
|
$VMHost += ".lab.local"
|
|||
|
If ((!(($ping.send($vmhost)).status <EFBFBD>eq "Success")) -and ($PingStatus[$I-1] -eq $True)) {$PingStatus[$I-1] = $False}
|
|||
|
}
|
|||
|
$StayHere = $False
|
|||
|
for ($i=1;$i -le $MaxHosts; $i++) {
|
|||
|
If ($PingStatus[$I-1] -eq $True) {$StayHere = $True}
|
|||
|
}
|
|||
|
} while ($StayHere)
|
|||
|
Write-Host "Wait until all hosts are pinging"
|
|||
|
do {
|
|||
|
Start-Sleep -Seconds 1
|
|||
|
$ping = new-object System.Net.NetworkInformation.Ping
|
|||
|
for ($i=1;$i -le $MaxHosts; $i++) {
|
|||
|
$VMHost = $HostPrefix
|
|||
|
$VMHost += $i
|
|||
|
$VMHost += ".lab.local"
|
|||
|
If (($ping.send($vmhost)).status <EFBFBD>eq "Success") {$PingStatus[$I-1] = $True}
|
|||
|
}
|
|||
|
$StayHere = $False
|
|||
|
for ($i=1;$i -le $MaxHosts; $i++) {
|
|||
|
If ($PingStatus[$I-1] -eq $False) {$StayHere = $True}
|
|||
|
}
|
|||
|
} while ($StayHere)
|
|||
|
Write-Host "Wait until all hosts are Connected"
|
|||
|
for ($i=1;$i -le $MaxHosts; $i++) {$PingStatus +=$False}
|
|||
|
do {
|
|||
|
Start-Sleep -Seconds 1
|
|||
|
for ($i=1;$i -le $MaxHosts; $i++) {
|
|||
|
$VMHost = $HostPrefix
|
|||
|
$VMHost += $i
|
|||
|
$VMHost += ".lab.local"
|
|||
|
If ((get-vmhost -name $VMHost).ConnectionState -eq "Connected" ) {$PingStatus[$I-1] = $True}
|
|||
|
}
|
|||
|
$StayHere = $False
|
|||
|
for ($i=1;$i -le $MaxHosts; $i++) {
|
|||
|
If ($PingStatus[$I-1] -eq $False) {$StayHere = $True}
|
|||
|
}
|
|||
|
} while ($StayHere)
|
|||
|
Write-Host "Wait 2 minutes so last host is properly up"
|
|||
|
start-sleep 120
|
|||
|
If ($SRM -ne $True){
|
|||
|
if (((Get-OSCustomizationSpec | where {$_.Name -eq "Windows"}) -eq $null) -and ($ProdKey -ne $null) ){
|
|||
|
$null = New-OsCustomizationSpec -Name Windows -OSType Windows -FullName Lab -OrgName Lab.local -NamingScheme VM -ProductKey $ProdKey -LicenseMode PerSeat -AdminPass VMware1! -Workgroup Workgroup -ChangeSid -AutoLogonCount 999
|
|||
|
}
|
|||
|
if (((Get-OSCustomizationSpec | where {$_.Name -eq "WinXP"}) -eq $null) -and ($ProdKey -ne $null)) {
|
|||
|
$null = New-OsCustomizationSpec -Name WinXP -OSType Windows -FullName Lab -OrgName Lab.local -NamingScheme VM -ProductKey $XPKey -LicenseMode PerSeat -AdminPass VMware1! -Workgroup Workgroup -ChangeSid -AutoLogonCount 999
|
|||
|
}
|
|||
|
$VMHostObj = Get-VMHost $VMHost
|
|||
|
If (($VMHostObj.Version.Split("."))[0] -eq "6") {
|
|||
|
$MinVMFSVer = 5
|
|||
|
} Else {
|
|||
|
$MinVMFSVer = 3
|
|||
|
}
|
|||
|
if ($CreateDS) {
|
|||
|
Write-BuildLog "Creating iSCSI datastores."
|
|||
|
$iSCSILUNs = get-scsilun -vmhost $VMHost -CanonicalName "t10.*"
|
|||
|
if ($vmhostobj.version.split(".")[0] -ne "4") {
|
|||
|
if (((Get-Datastore | where {$_.Name -eq "iSCSI1"}) -eq $null) ) {
|
|||
|
$null = New-Datastore -VMHost $VMHost -Name iSCSI1 -Path $iSCSILUNs[0].CanonicalName -Vmfs -FileSystemVersion 5
|
|||
|
Write-BuildLog "Created iSCSi1 Datstore"
|
|||
|
} else {
|
|||
|
Write-BuildLog "Registering all VMs found on existing datastore iSCSI1."
|
|||
|
Register-VMs ("iSCSI1")
|
|||
|
}
|
|||
|
}
|
|||
|
if ((Get-Datastore | where {$_.Name -eq "iSCSI2"}) -eq $null) {
|
|||
|
$null = New-Datastore -VMHost $VMHost -Name iSCSI2 -Path $iSCSILUNs[1].CanonicalName -Vmfs -FileSystemVersion $MinVMFSVer
|
|||
|
Write-BuildLog "Created iSCSi2 Datastore"
|
|||
|
} else {
|
|||
|
Write-BuildLog "Registering all VMs found on existing datastore iSCSI2."
|
|||
|
Register-VMs ("iSCSI2")
|
|||
|
}
|
|||
|
if ((Get-Datastore | where {$_.Name -eq "iSCSI3"}) -eq $null) {
|
|||
|
$null = New-Datastore -VMHost $VMHost -Name iSCSI3 -Path $iSCSILUNs[2].CanonicalName -Vmfs -FileSystemVersion $MinVMFSVer
|
|||
|
Write-BuildLog "Created iSCSi3 datstore"
|
|||
|
} else {
|
|||
|
Write-BuildLog "Registering all VMs found on existing datastore iSCSI3"
|
|||
|
Register-VMs ("iSCSI3")
|
|||
|
}
|
|||
|
}
|
|||
|
Write-BuildLog "Setting up HA on cluster since shared storage is configured."
|
|||
|
$Cluster = Get-Cluster -Name $ClusterName
|
|||
|
$null = set-cluster -cluster $Cluster -HAEnabled:$True -HAAdmissionControlEnabled:$True -confirm:$false
|
|||
|
$null = New-AdvancedSetting -Entity $cluster -Type ClusterHA -Name 'das.isolationaddress1' -Value "192.168.$SubNet.4" -confirm:$false -force
|
|||
|
$null = New-AdvancedSetting -Entity $cluster -Type ClusterHA -Name 'das.isolationaddress2' -Value "172.17.$SubNet.7" -confirm:$false -force
|
|||
|
$null = New-AdvancedSetting -Entity $cluster -Type ClusterHA -Name 'das.usedefaultisolationaddress' -Value false -confirm:$false -force
|
|||
|
$spec = New-Object VMware.Vim.ClusterConfigSpecEx
|
|||
|
$null = $spec.dasConfig = New-Object VMware.Vim.ClusterDasConfigInfo
|
|||
|
$null = $spec.dasConfig.admissionControlPolicy = New-Object VMware.Vim.ClusterFailoverResourcesAdmissionControlPolicy
|
|||
|
$null = $spec.dasConfig.admissionControlPolicy.cpuFailoverResourcesPercent = 50
|
|||
|
$null = $spec.dasConfig.admissionControlPolicy.memoryFailoverResourcesPercent = 50
|
|||
|
$Cluster = Get-View $Cluster
|
|||
|
$null = $Cluster.ReconfigureComputeResource_Task($spec, $true)
|
|||
|
Write-BuildLog "Waiting two minutes for HA to complete configuration."
|
|||
|
Start-Sleep -Seconds 120
|
|||
|
|
|||
|
$VMHostObj = Get-VMHost $VMHost
|
|||
|
$VMName="Template2012"
|
|||
|
if (($CreateVM) -and ((Get-VM -name $VMName -ErrorAction "SilentlyContinue") -eq $null ) -and (test-path "\\192.168.199.7\build\Win2012.ISO")) {
|
|||
|
$Datastore = Get-Datastore -VMhost $vmHost -name "NFS01"
|
|||
|
Start-Sleep -Seconds 2
|
|||
|
if (!(Get-PSDrive -Name NFS01 -ErrorAction "SilentlyContinue")) {
|
|||
|
$null = New-PSDrive -Name NFS01 -PSProvider ViMdatastore -Root '\' -Location $Datastore
|
|||
|
}
|
|||
|
#Create new VM if existing VM or template doesn't exist
|
|||
|
if (!(Test-Path NFS01:\$VMName\$VMName.vmdk)) {
|
|||
|
Write-BuildLog "Creating Template2012 VM as Windows Server 2012"
|
|||
|
If ((Get-vmhost)[0].version -lt "5.5.0"){
|
|||
|
$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 768 -DiskMB 16384 -DiskStorageFormat Thin -GuestID windows8Server64Guest
|
|||
|
get-networkadapter $MyVM |set-networkadapter -type e1000 -confirm:$false
|
|||
|
} Else {
|
|||
|
$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 768 -DiskMB 16384 -DiskStorageFormat Thin -GuestID windows8Server64Guest -Version "v8"
|
|||
|
}
|
|||
|
$null = New-CDDrive -VM $MyVM -ISOPath "[Build] /Win2012.ISO" -StartConnected
|
|||
|
$null = New-FloppyDrive -VM $MyVM -FloppyImagePath "[Build] Automate/BootFloppies/Nested2012.flp" -StartConnected
|
|||
|
$strBootHDiskDeviceName = "Hard disk 1"
|
|||
|
$viewVM = Get-View -ViewType VirtualMachine -Property Name, Config.Hardware.Device -Filter @{"Name" = "^$VMName$"}
|
|||
|
## get the VirtualDisk device, then grab its Key (DeviceKey, used later)
|
|||
|
$intHDiskDeviceKey = ($viewVM.Config.Hardware.Device | ?{$_.DeviceInfo.Label -eq $strBootHDiskDeviceName}).Key
|
|||
|
## bootable Disk BootOption device, for use in setting BootOrder (the corresponding VirtualDisk device is bootable, assumed)
|
|||
|
$oBootableHDisk = New-Object -TypeName VMware.Vim.VirtualMachineBootOptionsBootableDiskDevice -Property @{"DeviceKey" = $intHDiskDeviceKey}
|
|||
|
## bootable CDROM device (per the docs, the first CDROM with bootable media found is used)
|
|||
|
$oBootableCDRom = New-Object -Type VMware.Vim.VirtualMachineBootOptionsBootableCdromDevice
|
|||
|
## create the VirtualMachineConfigSpec with which to change the VM's boot order
|
|||
|
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec -Property @{"BootOptions" = New-Object VMware.Vim.VirtualMachineBootOptions -Property @{BootOrder = $oBootableCDRom, $oBootableHDisk}}
|
|||
|
$null = $viewVM.ReconfigVM_Task($spec)
|
|||
|
Write-BuildLog "Powering on VM and installing Windows."
|
|||
|
$null = Start-VM $MyVM
|
|||
|
} else {
|
|||
|
Write-BuildLog "Found existing WinTemplate."
|
|||
|
if (Test-Path NFS01:\$VMName\$VMName.vmtx) {
|
|||
|
Write-BuildLog "Registering existing Template2012 template."
|
|||
|
$vmxFile = Get-Item NFS01:\$VMName\$VMName.vmtx
|
|||
|
$null = New-Template -VMHost $VMHost -TemplateFilePath $vmxFile.DatastoreFullPath
|
|||
|
Write-BuildLog "Existing WinTemplate Template added to inventory."
|
|||
|
}
|
|||
|
}
|
|||
|
Start-Sleep -Seconds 2
|
|||
|
$null = Remove-PSDrive NFS01
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if ($vmhostObj.version.split(".")[0] -eq "4") {
|
|||
|
$Datastore = Get-Datastore -VMhost $vmHost -name "iSCSI2"
|
|||
|
$VMName="WinTemplate4"
|
|||
|
} else {
|
|||
|
$Datastore = Get-Datastore -VMhost $vmHost -name "iSCSI1"
|
|||
|
$VMName="WinTemplate"
|
|||
|
}
|
|||
|
|
|||
|
if (($CreateVM) -and ((Get-VM -name $VMName -ErrorAction "SilentlyContinue") -eq $null ) -and (test-path "\\192.168.199.7\build\Auto2K3.ISO")) {
|
|||
|
if (!(Get-PSDrive -Name iSCSI1 -ErrorAction "SilentlyContinue")) {
|
|||
|
$null = New-PSDrive -Name iSCSI1 -PSProvider ViMdatastore -Root '\' -Location $Datastore
|
|||
|
}
|
|||
|
Start-Sleep -Seconds 2
|
|||
|
#Create new VM if existing VM or template doesn't exist
|
|||
|
if (!(Test-Path iSCSI1:\$VMName\$VMName.vmdk)) {
|
|||
|
Write-BuildLog "Creating WinTemplate VM Windows Server 2003."
|
|||
|
If ((Get-vmhost)[0].version -lt "5.5.0"){
|
|||
|
$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 384 -DiskMB 3072 -DiskStorageFormat Thin -GuestID winNetEnterpriseGuest
|
|||
|
} Else {
|
|||
|
$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 384 -DiskMB 3072 -DiskStorageFormat Thin -GuestID winNetEnterpriseGuest -Version "v8"
|
|||
|
}
|
|||
|
$null = New-CDDrive -VM $MyVM -ISOPath "[Build] /Auto2K3.iso" -StartConnected
|
|||
|
Write-BuildLog "Powering on VM and installing Windows."
|
|||
|
$null = Start-VM $MyVM
|
|||
|
} else {
|
|||
|
Write-BuildLog "Found existing WinTemplate."
|
|||
|
if (Test-Path iSCSI1:\$VMName\$VMName.vmtx) {
|
|||
|
Write-BuildLog "Registering existing WinTemplate template."
|
|||
|
$vmxFile = Get-Item iSCSI1:\$VMName\$VMName.vmtx
|
|||
|
$null = New-Template -VMHost $VMHost -TemplateFilePath $vmxFile.DatastoreFullPath
|
|||
|
Write-BuildLog "Existing WinTemplate Template added to inventory."
|
|||
|
}
|
|||
|
}
|
|||
|
Start-Sleep -Seconds 2
|
|||
|
$null = Remove-PSDrive iSCSI1
|
|||
|
}
|
|||
|
$VMName = "WinXP"
|
|||
|
$Datastore = Get-Datastore "iSCSI2"
|
|||
|
if (($CreateXP) -and ((Get-VM -name $VMName -ErrorAction "SilentlyContinue") -eq $null ) -and (test-path "\\192.168.199.7\build\AutoXP.iso")) {
|
|||
|
if (!(Get-PSDrive -Name iSCSI2 -ErrorAction "SilentlyContinue")) {
|
|||
|
$null = New-PSDrive -Name iSCSI2 -PSProvider ViMdatastore -Root '\' -Location $Datastore
|
|||
|
}
|
|||
|
Start-Sleep -Seconds 2
|
|||
|
#Create new VM if existing VM or template doesn't exist
|
|||
|
if (!(Test-Path iSCSI2:\$VMName\$VMName.vmdk)) {
|
|||
|
Write-BuildLog "Creating Windows XP VM for View."
|
|||
|
If ((Get-vmhost)[0].version -lt "5.5.0"){
|
|||
|
$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 384 -GuestID winXPProGuest
|
|||
|
} Else {
|
|||
|
$MyVM = New-VM -Name $VMName -VMhost $vmHost -datastore $Datastore -NumCPU 1 -MemoryMB 384 -GuestID winXPProGuest -Version "v8"
|
|||
|
}
|
|||
|
$null = New-CDDrive -VM $MyVM -ISOPath "[Build] /AutoXP.iso" -StartConnected
|
|||
|
$null = New-FloppyDrive -VM $MyVM -FloppyImagePath "[Build] Automate/BootFloppies/vmscsi-1.2.0.4.flp" -StartConnected
|
|||
|
$strBootHDiskDeviceName = "Hard disk 1"
|
|||
|
$viewVM = Get-View -ViewType VirtualMachine -Property Name, Config.Hardware.Device -Filter @{"Name" = "^$VMName$"}
|
|||
|
## get the VirtualDisk device, then grab its Key (DeviceKey, used later)
|
|||
|
$intHDiskDeviceKey = ($viewVM.Config.Hardware.Device | ?{$_.DeviceInfo.Label -eq $strBootHDiskDeviceName}).Key
|
|||
|
## bootable Disk BootOption device, for use in setting BootOrder (the corresponding VirtualDisk device is bootable, assumed)
|
|||
|
$oBootableHDisk = New-Object -TypeName VMware.Vim.VirtualMachineBootOptionsBootableDiskDevice -Property @{"DeviceKey" = $intHDiskDeviceKey}
|
|||
|
## bootable CDROM device (per the docs, the first CDROM with bootable media found is used)
|
|||
|
$oBootableCDRom = New-Object -Type VMware.Vim.VirtualMachineBootOptionsBootableCdromDevice
|
|||
|
## create the VirtualMachineConfigSpec with which to change the VM's boot order
|
|||
|
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec -Property @{"BootOptions" = New-Object VMware.Vim.VirtualMachineBootOptions -Property @{BootOrder = $oBootableCDRom, $oBootableHDisk}}
|
|||
|
$null = $viewVM.ReconfigVM_Task($spec)
|
|||
|
$Null = Start-VM $MyVM
|
|||
|
} else {
|
|||
|
Write-BuildLog "Found existing WinXP."
|
|||
|
if (Test-Path iSCSI1:\$VMName\$VMName.vmtx) {
|
|||
|
Write-BuildLog "Registering existing WinTemplate template."
|
|||
|
$vmxFile = Get-Item iSCSI2:\$VMName\$VMName.vmtx
|
|||
|
$null = New-Template -VMHost $VMHost -TemplateFilePath $vmxFile.DatastoreFullPath
|
|||
|
Write-BuildLog "Existing WinTemplate Template added to inventory."
|
|||
|
}
|
|||
|
}
|
|||
|
Start-Sleep -Seconds 2
|
|||
|
$null = Remove-PSDrive iSCSI2
|
|||
|
}
|
|||
|
$VMName = "TTYLinux"
|
|||
|
if ((Get-VM -name $VMName -ErrorAction "SilentlyContinue") -eq $null ) {
|
|||
|
Write-BuildLog "Registering existing tiny TTYLinux VM."
|
|||
|
$Datastore = Get-Datastore "Build"
|
|||
|
if (!(Get-PSDrive -Name Build -ErrorAction "SilentlyContinue")) {
|
|||
|
$null = New-PSDrive -Name Build -PSProvider ViMdatastore -Root '\' -Location $Datastore
|
|||
|
}
|
|||
|
$Datastore = Get-Datastore "iSCSI3"
|
|||
|
if (!(Get-PSDrive -Name iSCSI3 -ErrorAction "SilentlyContinue")) {
|
|||
|
$null = New-PSDrive -Name iSCSI3 -PSProvider ViMdatastore -Root '\' -Location $Datastore
|
|||
|
}
|
|||
|
if (!(Test-Path iSCSI3:/TTYLinux/TTYLinux.vmx)) {
|
|||
|
Write-BuildLog "Copying TTYLinux VM to iSCSI3 datastore."
|
|||
|
$Datastore = Get-Datastore "iSCSI3"
|
|||
|
Copy-DatastoreItem Build:/Automate/ShellVMs/TTYLinux iSCSI3:\ -recurse
|
|||
|
}
|
|||
|
$vmxFile = Get-Item iSCSI3:/TTYLinux/TTYLinux.vmx
|
|||
|
$null= New-VM -VMFilePath $VMXFile.DatastoreFullPath -VMHost $vmhost -Location "vm" -name "TTYLinux"
|
|||
|
Start-Sleep -Seconds 2
|
|||
|
$null = Remove-PSDrive Build
|
|||
|
$null = Remove-PSDrive iSCSI3
|
|||
|
}
|
|||
|
}
|
|||
|
Write-BuildLog " "
|
|||
|
|
|||
|
$null = Disconnect-VIServer -Server * -confirm:$false
|
|||
|
if (Test-Path "C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe") {
|
|||
|
Read-Host " Configuration complete, press <Enter> to continue."
|
|||
|
}
|
|||
|
exit
|