Автоматическое развертывание и добавление ESXi к vCenter

Очень часто, когда инфраструктура vSphere не маленького объема, а процедура инсталляции гипервизора ESXi происходит нечасто, но в больших количествах сразу (например, завезли несколько серверов для увеличения ресурсов кластера), а также когда нет возможности использовать AutoDeploy и HostProfiles, на помощь приходит автоматизация более дешевыми методами. Этим методом нельзя полностью автоматизировать весь процесс по установке и добавлению хоста в vCenter, но вполне возможно сделать процесс инсталляции полностью автоматическим, а с добавлением хоста в vCenter нам поможет опубликованный ранее скрипт PowerCLI.

Теперь давайте определимся с тем, как все будет работать. В данном примере мы не используем среду PXE для загрузки, у нас нет DHCP в инфраструктуре и брать данные для настроек будущего ESXi хоста нашему скрипту неоткуда кроме как из своего же установочного образа. Безусловно есть более сложные и функциональные варианты «тихой» установки ESXi, но все они требуют дополнительных примочек в виде PXE boot, DHCP/TFTP, в нашем случае этих служб нет, и мы полагаемся на минимализм решения. Процесс будет протекать следующим образом:

  1. Запускается установщик ESXi и устанавливает гипервизор без вмешательства
  2. ESXi принимает положенные ему временные сетевые настройки
  3. Запускается скрипт PowerCLI, задает хосту его конечные параметры (hostname и IP) и присоединяет к vCenter

Все достаточно просто, но есть момент где нам придется всё-таки вмешаться в процесс руками (запустить скрипт PowerCLI). Процесс выглядит как конвейер, где PowerCLI принимает эстафету после установки ESXi, почти что руками. Повторюсь не все полностью автоматически, но без использования сторонних сервисов. Перейдем к теории с практикой.

Итак, при установке ESXi, когда загрузился Bootloader, происходит загрузка ядра ESXi, а оно считывает инструкции по дальнейшим действиям с ks.cfg (он же kickstart скрипт) если это настроено, который по умолчанию находится в директории /etc/vmware/weasel/ на RAM диске. Стандартный ks.cfg, не используется при загрузке установщика, так как что бы использовать его в файле boot.cfg, расположенном в /EFI/BOOT/ и в корне установочного образа не прописано к нему обратиться и процесс установки подлежит полностью ручному управлению. Boot.cfg – это файл, указывающий загрузчику с какими параметрами загрузить ESXi и в каком режиме. Что бы установщик ESXi задействовал kickstart скрипт, необходимо для параметра kernelopt изменить значения указывающее на расположение нашего заранее отредактированного ks.cfg. Например:

kernelopt=runweasel ks=cdrom:/KS.CFG

В данном примере указывается что, kickstart скрипт находится в CD-ROM (на том же носителе, что и установщик), в корневой директории. Теперь перейдем к редактированию самого ks.cfg. Стандартный файл содержит следующее:             

#
# Sample scripted installation file
#

# Accept the VMware End User License Agreement
vmaccepteula

# Set the root password for the DCUI and Tech Support Mode
rootpw myp@ssw0rd

# Install on the first local disk available on machine
install --firstdisk --overwritevmfs

# Set the network to DHCP on the first network adapter
network --bootproto=dhcp --device=vmnic0

# A sample post-install script
%post --interpreter=python --ignorefailure=true
import time
stampFile = open('/finished.stamp', mode='w')
stampFile.write( time.asctime() )

Мы приведем его к следующему виду:

#
# Sample scripted installation file
#

# Accept the VMware End User License Agreement
vmaccepteula
reboot

# Set the root password for the DCUI and Tech Support Mode
rootpw VMware!@#

# Install on the first local disk available on machine
install --firstdisk --overwritevmfs

# Set the network to DHCP on the first network adapter
network --bootproto=static --device=vmnic0 --ip=10.10.10.10 --gateway=10.10.10.1
--nameserver=1.1.1.5 --netmask=255.255.255.0 --vlanid=123 –-hostname=localhost --addvmportgroup=0

# A sample post-install script
%post --interpreter=python --ignorefailure=true
import time
stampFile = open('finished.stamp', mode='w')
stampFile.write( time.asctime() )

Разберемся что мы добавили. Изменения минимальны и большая их часть касается IP. Итак:

rootpw VMware!@# — Задаем пароль от root

--bootproto=static – Назначение статических сетевых настроек при установке

--device=vmnic0 – Выбор физического адаптера в качестве uplink

--ip=10.10.10.10 --gateway=10.10.10.1 --nameserver=1.1.1.5  --netmask=255.255.255.0   – думаю понятно. Тут задаем временный адрес, шлюз, DNS, маску для нашего хоста, который в последствии измениться с помощью PowerCLI.

--vlanid=123 – указываем менеджмент VLAN для временной сети

–-hostname=localhost – имя хоста.

--addvmportgroup=0 – Не добавлять VM Network партгруппу  

Reboot – Указываем что после установки хост будет автоматически перезагружен.

Список настроек не велик и конфигурирует самое важное. Однако, если какой ни будь из этих пунктов будет некорректно задан или пропущен, установка остановиться на полпути в ожидании нажатия Enter или может быть прекращена. Следует быть внимательным. Так же очень важный пункт — install —firstdisk –overwritevmfs, который определяет на какое устройство будет установлен ESXi. В нашем примере ESXi будет установлен на первый в списке доступных локальных устройств. Итак, после того как все настройки внесены в boot.cfg и ks.kfg, а сами файлы помещены в соответствующее им расположение (boot.cfg – корень образа и efi/boot/, а ks.cfg — корень образа), загружаемся с нашей флешки или Virtual CD. Установка производится сама, затем ESXi перезагружается и в бой вступает PowerCLI. Обратите внимание, что временный IP для менеджмента следует давать в том же VLAN, что и целевой адрес ESXi, так нам будет проще потом переназначить сетевые настройки. А вот и переписанный немного скрипт PowerCLI:

#Создается фунция по добавлению ESXi в vCenter
function Add-ESXi
{
 Param
 (
 [Parameter(Mandatory=$true, Position=0)]
 [string] $ESXiName,
 [Parameter(Mandatory=$true, Position=1)]
 [string] $VCSA,
 [Parameter(Mandatory=$true, Position=3)]
 [string] $VDSName,
 [Parameter(Mandatory=$true, Position=4)]
 [string] $Datacenter
)



  

  
  

#Коннектимсся к VCSA
Write-Host 'Connecting to '$VCSA
Connect-VIServer -Server $VCSA
$Location=$Datacenter

#Добавляем хост
Add-VMHost -Name $ESXiName -Location $Location -User root -Password password -Force 

# Переменные хоста и VCSA
$ESXIHost=Get-VMhost $ESXiName
$logDir="[datastore] log_folder"
$logHost="udp://loghost:514"
$VMHostModel=($ESXIHost | Get-View).Hardware.SystemInfo.Model
$VMHostModelName=$VMHostModel.ToString()



#Определяем блейд или нет, нужно если аплинки у различных моделей отличаются по номеру интерфейса.
If($VMHostModelName -eq 'blade_model') 
 {
  Write-Host -ForegroundColor Gray 'This is Blade System, set Uplinks to vmnic0 & vmnic1'
  $uplink1=Get-VMHostNetworkAdapter -VMHost $ESXIHost -Name "vmnic0"
  $uplink2=Get-VMHostNetworkAdapter -VMHost $ESXIHost -Name "vmnic1"
 }
elseIf($VMHostModelName -eq 'rack_model') 
 {
  Write-Host -ForegroundColor Gray 'This is Rack System, set Uplinks to vmnic4 & vmnic5'
  $uplink1=Get-VMHostNetworkAdapter -VMHost $ESXIHost -Name "vmnic4"
  $uplink2=Get-VMHostNetworkAdapter -VMHost $ESXIHost -Name "vmnic5"
 }
else
 {
  Write-host -ForegroundColor Red -BackgroundColor Black "Unknown Model"
  break
 }


#Задаем хосту AdvancedSettings, если нужно.
Get-AdvancedSetting -Entity $ESXIHost -Name "Syslog.global.defaultRotate" | Set-AdvancedSetting -Value 100 -confirm:$false
Get-AdvancedSetting -Entity $ESXIHost -Name "Syslog.global.defaultSize" | Set-AdvancedSetting -Value 5120 -confirm:$false
Get-AdvancedSetting -Entity $ESXIHost -Name "Syslog.global.logDir" | Set-AdvancedSetting -Value $logDir -confirm:$false
Get-AdvancedSetting -Entity $ESXIHost -Name "Syslog.global.logDirUnique" | Set-AdvancedSetting -Value true -confirm:$false
Get-AdvancedSetting -Entity $ESXIHost -Name "Syslog.global.logHost" | Set-AdvancedSetting -Value $logHost -confirm:$false

#Меняем PowerManagement на HighPerfamance
(Get-View (Get-VMHost -Name $ESXIHost | Get-View).ConfigManager.PowerSystem).ConfigurePowerPolicy(2)

#Задаем сервера NTP
Add-VmHostNtpServer -VMHost $ESXIHost -NtpServer 172.16.100.112, 172.16.100.113
#Делаем настройку FireWall для NTP
Get-VMHostFirewallException -VMHost $ESXIHost | where {$_.Name -eq "NTP client"} | Set-VMHostFirewallException -Enabled:$true
#Настраиваем службу NTP на запуск и правила ее запуска с хостом.
Get-VmHostService -VMHost $ESXIHost | Where-Object {$_.key -eq "ntpd"} | Start-VMHostService

#Сетевые переменные
$VDS=Get-VDSwitch -Name $VDSName
$vmkerneladapter=Get-VMHostNetworkAdapter -VMHost $ESXIHost -Name "vmk0"

#Добавляет хост в VDS
Add-VDSwitchVMHost -VDSwitch $VDSName -VMHost $ESXIHost

#Запихиваем физические интерфейсы в аплинки и мигрируем vmk0 интерфейс в VDS
$VDS | Add-VDSwitchPhysicalNetworkAdapter -VMHostPhysicalNic $uplink1, $uplink2 -VMHostVirtualNic $vmkerneladapter -VirtualNicPortgroup 'Vlan 3011' -Confirm:$false

#Удаляем VSS
Remove-VirtualSwitch -VirtualSwitch vSwitch0 -Confirm:$false

#Включаем на vmk0 vMotion.
$ESXIHost | Get-VMHostNetworkAdapter -Name vmk0 |Set-VMHostNetworkAdapter -VMotionEnabled $true -Confirm:$false

#Отключаемся от вицентра
disconnect-VIServer -Server $VCSA -Confirm:$false



}


$ESXi_TemporaryIP=10.10.10.10                               #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>временный IP ESXi
$ESXi_TargetIP=10.1.1.10                                    #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>целевой IP ESXi
$ESXi_Name='hostname'                                       #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ESXi hostname
$ESXi_Domain='domain.local'                                 #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ESXi domain name
$ESXi_FQDN=$ESXi_Name+'.'+$ESXi_Domain                      #<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ESXi hostaname+domain name
$vcenter_name='VCSA_NAME'                                   #<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Задаем имя вицентра
$VDS_name='VDS_Name'                                        #<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Задаем имя вицентра
$Datacenter_name='datacenter_name'                          #<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Задаем имя распределенного виртуального коммутатора




#Задаем нашему хосту ESXi его целевые сетевые настройки взамен временных, выданных ks.cfg
Connect-VIServer -Server $ESXi_TemporaryIP -User root -Password VMware!23 
Get-VMHostNetwork | Set-VMHostNetwork -DomainName $ESXi_Domain -HostName $ESXi_Name 
(Get-VMHost | Get-EsxCli).network.ip.interface.ipv4.set('vmk0',$ESXi_TargetIP, '255.255.255.0', $null, 'static')
true
disconnect-VIServer -Force -Confirm:$false

#Запускаем и ждем.
Add-ESXi -ESXiName $ESXi_FQDN -VCSA $vcenter_name -VDSName $VDS_name -Datacenter $Datacenter_name

Удачи!