Установка и использование PowerCLI

В этой статье попытаюсь рассмотреть инсталляцию замечательного инструмента для администрирования и автоматизации управления виртуальной средой vSphere – PowerCLI. По правде сказать, PowerCLI поддерживает и может управлять не только vSphere, но и рядом других продуктов VMware, а именно:

  • NSX-T
  • VMware Cloud Director
  • VMware vSAN
  • VMware Site Recovery Manager
  • vRealize Operations Manager
  • VMware Horizon
  • VMware Cloud on AWS
  • VMware Hybid Cloud Extension

Но к сожалению, или к счастью данный список за пределами нашего топика, и мы сосредоточены на установке и базовом использовании PowerCLI.

Что такое PowerCLI? Это инструмент администрирования вышеописанных продуктов VMware из командной оболочки PowerShell, который после инсталяции добавляет множество дополнительных командлетов в PowerShell для работы с ними. Становиться очень удобно автоматизировать многие рутинные процессы и отчеты в инфраструктуре. Для базового администрирования vSphere PowerCLI не сильно подходит ввиду определенной сложности команд и времени, необходимом на их ввод в консоль.

 Когда-то давно, во времена прекрасного C# vSphere Client и когда не выпускались патчи на vSphere пачками, да и в принципе все было безоблачнее, а зеленый цвет – зеленее, PowerCLI распространялся в виде MSI установочного файла, который можно было загрузить с официального сайта VMware, предварительно зарегистрировавшись на нем. Так было до версии 6.5. Но времена изменились и теперь мы имеем версию 12.1.0, а на дворе 2021 год,  PowerCLI стал загружаемым модулем в составе PowerShell, и его установка сводится к импорту этого самого модуля средствами самого PowerShell, вместо запуска MSI. В данный момент установить PowerCLI можно на все платформы, поддерживающие и PowerShell, то есть и на Mac и на Linux помимо Windows. Посмотрим программные требования для PowerCLI на всех платформах:

Тип ОСВерсия .NET Версия PowerShell
Windows.NET Framework 4.7.2 или новееWindows PowerShell 5.1 или новее
Linux.NET Core 3.1PowerShell 7
macOS.NET Core 3.1PowerShell 7

Рассмотрим два варианта установки PowerCLI. Первый вариант прост и подразумевает наличие на машине, на которой производится установка доступа в интернет, а второй – где интернета нет. В обоих случаях, если присутствует старая версия, установленная при помощи MSI файла, ее необходимо удалить через панель управления.

Установка PowerCLI на машину с интернетом

Как ясно из названия нам потребуется доступ в интернет и консоль PowerShell. Запускаем PowerShell от имени администратора и используем команду:

Install-Module -Name VMware.PowerCLI

Опционально можно использовать ключ, чтобы установить PowrCLI только для текущего пользователя:

Install-Module -Name VMware.PowerCLI -Scope CurrentUser

Если на нашей машине ранее не было установок модулей PowerShell из интернета, то скорее всего пошик ругнется на источник пакетов PSGellery и спросит, что делать, выбираем «Y» и продолжается установка. После завершения процесса инсталляции модуля PowerCLI убеждаемся, что все установилось и появились новые командлеты:

Get-Command -Module *VM*

Нам вывалится огромный список командлетов PowerCLI, что означает что установка прошла успешно и можно приступать к их использованию.

Установка PowerCLI на машину без интернета

Частенько в работе инженеров и администраторов возникает задача установить PowerCLI не имея выхода в мировую паутину, например разворачивая инфраструктуру где ни будь в вагончике в Сибири либо же по соображениям политик безопасности.

Нам потребуется загрузить ZIP архив с файлами модулей PowerCLI с официального сайта — https://code.vmware.com/web/tool/12.1.0/vmware-powercli . Скачиваем его. Затем нам нужно определить в какой директории расположены уже существующие модули PowerShell, это повлияет на то, куда нам нужно будет распаковать скачанный архив. В этом нам поможет команда:

$ENV:PSModulePath.Split(";")

Мы увидим список мест где у нас лежат модули пошика, у меня это:

C:\Users\User\Documents\WindowsPowerShell\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\Windows\system32\WindowsPowerShell\v1.0\Modules

Если мы хотим, чтобы PowerCLI был доступен для всех пользователей данного компьютера, нам нужно распаковать скачанный архив в “C:\Program Files\WindowsPowerShell\Modules”, а если требуется что бы только текущий пользователь мог использовать PowerCLI, то наш выбор “C:\Users\%UserName%\Documents\WindowsPowerShell\Modules ”.

Если вы устанавливаете PowerCLI этим методом, то после того как вы распаковали содержимое архива по одному из путей выше, нужно разблокировать папки модулей командой:

Get-Childitem -Path 'C:\Program Files\WindowsPowerShell\Modules\VMware*' -Recurse | Unblock-File

В моем примере указан путь установки для всех пользователей, в вашем случае используйте тот куда вы распаковали.

Теперь проверяем ранее приведенной командой доступность командлетов PowerCLI.

Get-Command -Module *VM*

Видим, что они присутствуют и можем приступать к работе.

Как пользоваться PowerCLI

Теперь остановимся на использовании данного решения в администрировании. Итак, после того как мы установили PowerCLI и воспылали желанием его использовать, нам нужно подключиться к нашей инфраструктуре vSphere, это может быть, как vCenter так и одиночный хост ESXi. В случае хоста ESXi нужно учесть, что если он лицензирован бесплатной лицензией, то использовать PowerCLI с ним не получиться. Давайте начнем. Открываем консоль PowerShell и запускаем команду:

Connect-Viserver –Server <IP or hostname>

Эта команда подключает нас к инфраструктуре VMware. Нам сразу же всплывет окно для вывода логина и пароля и после успешной аутентификации мы будем подключены к vCenter или ESXi. Логин с паролем мы можем ввести вместе с командой:

Connect-Viserver –Server <IP или hostname> -User administrator@vsphere.local –Password VMware!23

Но это достаточно небезопасно. Можно использовать переменную для аутентификационных данных, а потом вставить ее в команду выше:

$cred=Get-Credentials
Connect-Viserver –Server <IP или hostname> -Credentials $cred –SaveCredentials

В команде выше мы использовали ключ «–SaveCredentials», с помощью которого наши логин и пароль запоминаются PowerShell-ом и в последствии при подключении к этому vCenter нам нет необходимости повторно их вводить, если мы работаем на машине под тем же самым пользователем. Если вы подключаетесь к vCenter в первый раз, у которого нет доверенного сертификата, как это бывает в большинстве случаев, то добавьте ключ «–Force» в конец команды, что бы проверка сертификата игнорировалась. Или используйте предварительно команду ниже, чтобы определить будущую реакцию PowerCLI на не доверенные сертификаты.

Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false

После того как мы залогинились, можно приступать к работе. Что бы ознакомиться с доступными командами PowerCLI можно использовать команду ниже.

Get-Command -Module vmware*

И Мы увидим весь список доступных команд PowerCLI. С помощью следующей команды мы можем получить информацию о какой-либо интересующей нас команде, о ее синтаксисе и функционале.

Get-Help <имя команды> -Full

Например:

Get-Help Stop-VM –Full

Это отлично помогает разобраться в устройстве командлетов и подобрать нужный для ситуации. Запомнить все командлеты нереально, даже если вы пользуетесь PowerCLI и PowerShell постоянно, то и дело придется регулярно использовать Get-Help. Теперь рассмотрим базовые команды и примеры с ними.

Работа с VM

Для базовой работы с виртуальными машинами в vSphere используются командлеты, в составе которых есть «VM». Вот список этих команд:

Remove-VM
New-VM
Set-VM
Move-VM
Start-VM
Stop-VM
Suspend-VM
Restart-VM

Думаю, понятно по названию команд что они делают. Давайте рассмотрим пару примеров. В примере ниже мы создадим VM с простой конфигурацией.

New-VM -Name new-vm -Location Folder-name -VMHost esxi-a-01 -Datastore datastore-a -DiskGB 256 -NumCpu 4 -MemoryMB 2048 -Portgroup vm-net

А теперь из шаблона с использование кастомизации.

New-VM -Template vm-template -OSCustomizationSpec linux-spec -Name new-vm -Location Folder-name -VMHost esxi-a-01 -Datastore datastore-a -Portgroup vm-net

Клонирование существующей виртуальной машины.

New-VM -VM 2016-template -Name new-vm -VMHost esxi-a-01 -Datastore datastore-01 -Location Folder-name -VMHost esxi-a-01 -Portgroup vm-net

А теперь рассмотрим более интересный пример. У PowerShell есть много прекрасных свойств и одно из них — это работа с различными источниками данных, например, с CSV фалами. Для начала нам нужен CSV файл со списком VM и их требуемыми характеристиками. Например, такого состава.

namememcpugb
vm-0122128
vm-0242256

Мы с помощью PowerShell импортируем содержимое файла в переменную, а затем циклом воспроизведем команду по созданию VM с параметрами из ее строки.

$csv=import-csv -Path 'C:\Temp\vms.csv'
foreach ($vm in $csv){New-VM -Name $vm.name -NumCpu $vm.cpu -DiskGB $vm.gb -MemoryGB $vm.mem -VMHost esxi-a-01  -Datastore datatore} 

Также возможно создать множество машин похожим способом, но с использованием XML файла как источника информации. Допустим мы имеем XML с таким содержанием.

Теперь загрузим его содержимое в переменную.

[xml]$xml = Get-Content C:\Temp\NewVM.xml

Затем создаем машину.

$xml.NewVM.VM | foreach {New-VM -VMHost esxi-name -Name $_.VMName -DiskGB 10 -MemoryGB $_.RAM -NumCpu $_.NumCPU -Datastore Storage}

И вуаля… Можно усложнять у увеличивать количество данных в источнике информации, что придаст нам удобности и гибкости. Так же мы с помощью PowerCLI можем использовать недоступный из GUI инструмент – InstantClone, который используется в VMware Horizon для быстрого создания машин для развертывания VDI ресурсов. Об этом отлично написано в блоге Уильяма Лама.

Теперь сделаем с помощью PowerCLI список всех включенных машин и выгрузим его в CSV файл.

Get-VM | Where-Object {$_.PowerState –eq “PoweredOn”} |  Export-Csv C:\Temp\vms.csv -NoTypeInformation -UseCulture -Force

Список машин, где не установлены VMware Tools или устарели.

get-vm | where {$_.ExtensionData.Guest.ToolsStatus -notlike "toolsOk"} | select name, @{Name='Tools Status';Expression={$_.ExtensionData.Guest.ToolsStatus}} | export-csv -path " C:\Temp\vms.csv"

Где подключен CD привод и отключим его.

Get-VM | Where-Object {$_.PowerState –eq “PoweredOn”} | Get-CDDrive | FT Parent, IsoPath
Get-VM | Where-Object {$_.PowerState –eq “PoweredOn”} | Get-CDDrive | Set-CDDrive -NoMedia -Confirm:$False

Список снепшотов. О это моя любимая тема. Когда инфраструктура большая и множество людей имеют доступ к vSphere, в промышленных масштабах растет и количество создаваемых снепшотов, которые нам как администратору приходиться вовремя удалять.

get-vm | get-snapshot | select vm, name, sizegb | ft -AutoSize

Управление хостами ESXi

Рассмотрим примеры управлением ESXi хостами. Для этого нам понадобятся команды с именами «VMHost».

Add-VMHost
Move-VMHost
Remove-VMHost
Restart-VMHost
Set-VMHost
Start-VMHost
Stop-VMHost
Suspend-VMHost

По названиям команд нетрудно определить их назначение.

Введем хост в Maintenance Mode.

Set-VMhost -VMHost esxi-a-01 -State Maintenance

Переместим хост в другой кластер, для этого предварительно нужно ввести его в Maintenance.

Move-VMHost –VMHost esxi-a-01 –Destination ‘Cluster-B’

С остальными командами проблем думаю не должно быть, кроме того, что перед какими-то серьезными действиями хост должен быть переведен в Maintenance Mode.

Операции с хранилищами

Для работы с хранилищами vSphere есть следующие командлеты:

Get-Datastore
Remove-Datastore
Set-Datastore
Move-Datastore

А также мы можем примонтировать с помощью PowerCLI одно или несколько датасторов к нашей машине и производить операции с ними, копировать файлы и так далее. В этом нам поможет нативный PSProvider VMware – VimDatastore.

$datastore=Get-datastore 'datatstore'
New-PSDrive -Name Datastore -Location $datastore -Root "\" -PSProvider Vimdatastore 

Проверим содержимое хранилища:

Get-ChildItem Datastore:\

Мы так же можем копировать файлы и папки между нашим примонтированным хранилищем vSphere и нашей машиной, что существенно облегчает это по сравнению с аналогичными действиями в GUI vSphere Client.

Copy-DatastoreItem -Item 'C:\Users\User\Downloads\TEMPLATE_RHEL_7_7_v2_2\*' -Destination Datastore:\TEMPLATE_RHEL_7_7_v2_2\

Теперь вернемся к более повседневным задачам администрирования vSphere и приведем пример создания нового хранилища NFS.

New-Datastore -Nfs -VMHost esxi-a-01 -Name NFSDatastore -Path /mynfs -NfsHost 10.10.10.3

Создание хранилища VMFS. Тут все немного сложнее, потому что нам нужно выбрать устройство для дальнейшей разметки в VMFS. А информацию об устройстве еще нужно получить, для определения устройства используется его идентификатор вида «naa.XXX XXX». Используем команду ниже и указываем хост, имеющий доступ к устройству.

Get-ScsiLun -VmHost esxi-a-02.lab.local | ft -AutoSize

Выделенное CanonicalName и есть нужный идентификатор устройства. Подсказка – используйте «FormatTable Autosize» для того что бы получаемая информация целиком помещалась на экране консоли. Теперь используем следующую команду для создания хранилища.

New-Datastore -Name 'new-datastore' -VMHost esxi-a-02.lab.local -Path naa.60003ff44dc75adcb3b3ca5f12bc9aa8 -Vmfs

Готово.

 Итоги

PowerCLI это мощнейший инструмент для автоматизации виртуальной инфраструктуры VMware. Он очень гибок и удобен, а синтаксис достаточно понятен и легко запоминается. В некоторых случаях он представляет даже больше удобства и функционала чем другие продукты VMware, разработанные специально для автоматизации, это линейка vRealize, но у каждого из этих решений свое назначение и сравнивать их – неправильно. Функционал PowerCLI выходит намного дальше, чем те примеры, которые я привел в данной статье и писать о нем и приводить другие примеры можно бесконечно долго.