VMware PowerCLI: Управляем облаками и всем всем всем из командной строки:

в 17:15, , рубрики: powercli, powershell, VMware, автоматизация труда админа, виртуализация, системное администрирование, метки: , , ,

advbg
image

О рутине и борьбе с ней

Всем нам очень нравятся продукты VMware! Помимо всеми нами любимого Workstation, WMware предлагает мощнейшие средства виртуализации на корпоративном и мультикорпоративном уровне.
Располагая нескольким гипервизорами ESXi с помощью vSphere, установленного, например, на одну из виртуальных машин, живущей на одном из этих же гипервизоров, мы можем довольно легко управлять всеми подключенными гипервизорами, управлять всеми ресурсами, создавать, удалять, править виртуальные машины и т.д. Можем подключиться, например, с помощью vSphere Client и получить довольно приятный вид всей нашей виртуальной инфраструктуры.
Правда в один момент, эта инфраструктура может стать очень большой и неподъемной. Всякого рода администрирование в один момент может занимать слишком времени и отнимать слишком много усилий. Некоторые задачи выполнять периодично, что малость надоедает.
Возникает довольно резонный вопрос, а что из этого всего можно заскриптить и как? Вот тут к нам приходит на помощь PowerCLI.
PowerCLI это расширение для Windows Powershell, которое добавляет более 400 новых командлетов для управления Виртуальной инфраструктурой, в том числе и Cloud. Скачать продукт можно отсюда communities.vmware.com/community/vmtn/server/vsphere/automationtools/powercli. Там же располагается ссылки и на документацию, на блог и на community.

Немного о Powershell

После установки дистрибутива, запускаем ярлык PowerCLI. Откроется консоль, по сути являющейся полноценной Powershell, но с прогруженными Снапинами для управления Виртуальной инфраструктурой. Можно просто открыть Powershell и догрузить снапины из папки, где установлен PowerCLI.
Вкратце напомню о синтаксисе Powershell. Команды в нем формируются следующим образом:
Verb-Noun –Param1 String [[-Param2] int] [-Param3 short] [-SwitchParam] [-EnumParam {Val1 | .. | ValN]} [CommonParameters]
Verb – как следует из определение это действие, которое нужно выполнить над Noun, подав параметры по имени или по позиции. При этом результатом исполнения будет .Net объект. Далее эти объекты записывать в переменные или можно подать их по pipeline на какой-нибудь командлет. Например:
Get-Process -name notepad | Stop-Process
Здесь мы берем все процессы с именем notepad с помощью комадлета Get-Process и передаем его по pipeline комадлету Stop-Process, который их останавливает.

Как это работает в PowerCli

Применяем эту философию для управления нашей инфраструктурой:
# Получаем виртуальную машину по имени и записываем ее в переменную
PS> $vm = Get-VM -Name DemoMachine
# Показываем
PS> $vm
Name PowerState Num CPUs Memory (MB)
---- ---------- -------- -----------
DemoMachine PoweredOff 1 256

Можем усложнить команду и показать другую информацию. Как в примере с notepad, берем виртуальную машину, передаем ее по pipeline на Select-Object, которая берет часть полей объекта виртуальной машины и результат передаем на Format-Table, который форматирует вывод.
PS> $vm | Select-Object Name,VMHost,Version | Format-Table -AutoSize
Name VMHost Version
---- ------ -------
DemoMachine 10.23.83.210 v7

Попробуем теперь что-нибудь изменить. Допустим, у нас добавили памяти на хостовых машинах. Одной строчкой мы можем проапгрейдить все виртуальные машины, например, в маркетинговом отделе:
PS> Get-VM –Location MarketingPool | Set-VM –MemoryMB 512 –Confirm:$false
Name PowerState Num CPUs Memory (MB)
---- ---------- -------- -----------
MarketingVM05 PoweredOff 1 512
MarketingVM04 PoweredOff 1 512
MarketingVM03 PoweredOff 1 512
MarketingVM01 PoweredOff 1 512
MarketingVM02 PoweredOff 1 512

Рассмотрим еще несколько красноречивых примеров:
# Делаем снапшот виртуальной машины
PS> Get-VM -Location DevelopmentPool | New-Snapshot -Name "ClearState"

# Возвращаем все виртуалные машины к снапшоту
PS> Get-VM -Location DevelopmentPool | Set-VM -Snapshot "ClearState"

# Убираем ненужные снапшоты с определенным именем
PS> Get-VM -Location DevelopmentPool | Get-Snapshot -Name "ClearState" | Remove-Snapshot

# Смотрим состояние всех datastore-ов
PS> Get-Datastore | Select Name,CapacityGB,FreespaceGB | Format-Table -AutoSize

# Смотрим какие харды стоят на девелоперских машинах
PS> Get-VM -Location DevelopmentPool | Get-HardDisk | Select Parent,Name,CapacityKB,StorageFormat

# Получаем информацию об ESX(i) хостах
PS> Get-VMHost | Select Name,Manufacturer,Model,NumCpu,MemoryTotalMB,CpuTotalMhz,ApiVersion | ft -AutoSize

Модное нынче слово облак...

Данные команды выполнялись на vSphere, но как я уже сказал подобным образом мы можем управлять и Cloud инфраструктурой. Для этого есть свой набор комадлетов.
Подключившись с облаку, нам интересно, какие у на есть виртуальные машины. Выполняем:
PS> Get-CIVM | Select Name
Name
----
CloudVM03
CloudVM04
CloudVM01
CloudVM02
CloudVM05

Ну и, наконец, мы можем выполнять команды и над vSphere и над Cloud одновременно.
Одной строкой мы можем переместить виртуальные машины в Cloud:
PS> Get-VM –Location AccountingPool | Import-CIVapp –OrgVdc AccountingVdc
Name Enabled InMaintenanceMode Owner
---- ------- ----------------- -----
AccountingVM03 True False system
AccountingVM04 True False system
AccountingVM01 True False system
AccountingVM02 True False system
AccountingVM05 True False system

Вот так! Все очень просто!

Напоследок немного магии

С помощью командлетов можно взаимодействовать и с гостевой операционной системой. Для этого на ней должны быть установлены VMware Tools. Проапдейтить их можно так:
PS> Get-VMGuest VM | Update-Tools

Что же в себя включает данное взаимодействие? Например, мы хотим переписать некий файл на все наши виртуальные машины (в случае под Windows) на определенное место:
PS> Get-VM | Copy-VMGuestFile -Source c:text.txt -Destination c:temp -GuestToLocal -HostUser root -HostPassword pass1 -GuestUser user -GuestPassword pass2

И самое интересное – выполняем скрипт на гостевой ОС:
PS>$script = '"%programfiles%Common FilesMicrosoft SharedMSInfomsinfo32.e
xe" /report "%tmp%inforeport"'
Invoke-VMScript -ScriptText $script -VM MyVM -HostCredential $hostCredential -GuestCredential $guestCredential -ScriptType Bat

Командлет позволяет выполнение bat/bash/powershell скриптов.
Я уверен, большинство из Вас уже почувствовали всю силу этого взаимодействия! С их помощью можно создавать, например, мощные post-provisioning конфигурации.

Вывод

Итак, PowerCLI является довольно мощным инструментом для администрирования всей Виртуальной инфраструктурой. Можно создавать сложные сценарии для всякого рода манипуляций над ней. Эти сценарии можно, например, запускать периодически или использовать для подъема среды. Можно также создавать сценарии для disaster recovery. Свойства и подход Powershell позволяют довольно легко – малым количеством команд манипулировать большим количеством объектов.
По приведенной выше ссылке можно получить полную инструкцию по использованию сего продукта. Там же в community можно спросить об интересующих Вас проблемах. Оно является одним из самых больших для powershell вообще.

Автор: advbg


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js