Как массово отключить хранилища от хостов VMware ESXI через скрипт
При замене СХД понадобилось отключить датасторы (хранилища) от хостов в VMware. Хостов 8, хранилищ 30. Делать это руками не хотелось. Пришлось изучать PowerCLI.
Решил я все скриптом
- #########################################################################################################
- #
- # Скрипт отключает датасторы у выбранных хостов. Делает Unmount, потом Detach
- # Переменная $hosts — список хостов
- # Переменная $storage — список отключаемых датасторов/хранилищ.
- #
- #########################################################################################################
- # Подключаем оснастку, если ее нет
- if ( (Get-PSSnapin -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue) -eq $null )
- {
- add-pssnapin VMware.*
- }
- else
- {
- Write-Host «Snap in already added.»
- }
- #################################################
- # Убираем ругань на самоподписанный сертификат
- Set-powercliconfiguration -InvalidCertificateAction Ignore -Confirm:$false | out-null
- #################################################
- #vCenter Server
- $vCenter = «bs-vc»
- #I Если не подключены к vCentr, то подключаемся
- if ($global:DefaultVIServers.Count -lt 1)
- {
- Connect-VIServer $vCenter
- }
- # получаем список ESX-серверов
- #$hosts = (Get-Content D:\PowerCLI\1unmountdatastoresservers.txt)
- # Список всех хостов
- # $hosts = Get-VMhost
- # Выборочный список хостов
- $hosts = «bs-esx07″, «bs-esx08″
- # Список Datastores, которые требуется отключить
- #$storage = (Get-Content D:\PowerCLI\storage.txt)
- $storage = «SAS_ThinClient_A_1″, «SAS_ThinClient_A_2″, «SAS_ThinClient_B_1″, «SAS_ThinClient_B_2″
- # Проверяем на каждом хосте
- foreach($esx in $hosts)
- {
- Write-host «Servers: » $esx
- # Подключаемся к хосту для выполнения команды esxcli
- $esxcli = Get-ESXCLI -VMHost $esx
- #Hosts Datastores
- $hostds=Get-Datastore -VMhost $esx
- #Проверяем наличие нужных датасторов на хосте
- foreach ($st in $storage)
- {
- foreach($hds in $hostds)
- {
- #Write-Host «Проверяемый датастор: » $hds
- if ($st -eq $hds)
- {
- Write-Host
- Write-Host «Server: » $esx «have mapped datastores » $hds
- Write-Host
- # Проверяем включен ли SIOC, если да, то отключаем.
- $SIOC = Get-Datastore -Name $hds
- if ($SIOC.StorageIOControlEnabled -eq $True)
- {
- Set-Datastore $hds -StorageIOControlEnabled $false
- # Ждем, когда завершится отключение SIOC
- Start-Sleep -s 10
- }
- $lun = $esxcli.storage.vmfs.extent.list() | Where-Object {$_.VolumeName -eq $hds}
- $device_id=$lun.DeviceName
- #Unmount Datastore
- Write-Host «Unmount datastore » $hds » from » $esx
- $esxcli.storage.filesystem.unmount($true,$hds)
- #Detach Datastore
- Write-Host «Detach datastore » $hds » from » $esx
- $esxcli.storage.core.device.set($device_id,»IsOffline»,$null,»off»)
- }
- }
- }# Конец проверки наличие нужных датасторов на хосте
- } # Конец проверки на каждом хосте
Далее рассмотрим Как очистить все отключенные хранилища у хостов в VMware ESXi через скрипт
Поскольку данная статья теперь вылезает на первой странице поисковой выдачи гугла по запросу «как отключить lun esxi powercli», позволю себе сэкономить время всех зашедших сюда, и запостить лично мной обновлённую версию скрипта (корректно работает на esxi 6+; детачит все extent-ы датастора, а не только первый). Проверен на esxi 6.0, 6.5.
#########################################################################################################
#
# Скрипт отключает датасторы у выбранных хостов. Делает Unmount, потом Detach
# Переменная $hosts — список хостов
# Переменная $storage — список отключаемых датасторов/хранилищ.
#
#########################################################################################################
# Подключаем оснастку, если ее нет
if ( (Get-PSSnapin -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue) -eq $null )
{
add-pssnapin VMware.*
}
else
{
Write-Host «Snap in already added.»
}
#################################################
# Убираем ругань на самоподписанный сертификат
Set-powercliconfiguration -InvalidCertificateAction Ignore -Confirm:$false | out-null
#################################################
#vCenter Server
$vCenter = «vcentr»
#I Если не подключены к vCentr, то подключаемся
if ($global:DefaultVIServers.Count -lt 1)
{
Connect-VIServer $vCenter
}
# получаем список ESX-серверов
#$hosts = (Get-Content D:\PowerCLI\1unmountdatastoresservers.txt)
# Список всех хостов
# $hosts = Get-VMhost
# Выборочный список хостов
$hosts = «esxi-1″,»esxi-2»
# Список Datastores, которые требуется отключить
#$storage = (Get-Content D:\PowerCLI\storage.txt)
$storage = «3par-1″,»3par-2»
# Проверяем на каждом хосте
foreach($esx in $hosts)
{
Write-host «Server: » $esx
# Подключаемся к хосту
$VMHost = Get-VMHost -Name $esx
$StorageSys = Get-View $VMHost.ExtensionData.ConfigManager.StorageSystem
#Hosts Datastores
$hostds=Get-Datastore -VMhost $esx
#Проверяем наличие нужных датасторов на хосте
foreach ($st in $storage)
{
foreach($hds in $hostds)
{
#Write-Host «Проверяемый датастор: » $hds
if ($st -eq $hds)
{
Write-Host
Write-Host «Server» $esx «have mapped datastore» $hds
Write-Host
# Проверяем включен ли SIOC, если да, то отключаем.
$SIOC = Get-Datastore -Name $hds
if ($SIOC.StorageIOControlEnabled -eq $True)
{
Write-Host «Disable SIOC on datastore » $hds
Set-Datastore $hds -StorageIOControlEnabled $false
# Ждем, когда завершится отключение SIOC
Start-Sleep -s 10
}
#Unmount Datastore
Write-Host «Unmount datastore» $hds «from» $esx
$StorageSys.UnmountVmfsVolume($SIOC.ExtensionData.Info.Vmfs.Uuid);
foreach ($lun in $SIOC.ExtensionData.Info.Vmfs.Extent)
{
$device = $StorageSys.StorageDeviceInfo.ScsiLun | where {$_.CanonicalName -eq $lun.DiskName}
#Detach Datastore
Write-Host «Detach device» $lun.DiskName «from» $esx
$storageSys.DetachScsiLun($device.Uuid)
}
}
}
}# Конец проверки наличие нужных датасторов на хосте
} # Конец проверки на каждом хосте