Данный текст – памятка самому себе, и инструкция для тех, кто с данным скриптовым языком не работал, но хочет (или нужда заставляет).
Эта инструкция не претендует на полноту и академичность. Рекомендации даются те, до которых додумался автор – а не самые лучшие на всем свете и во все времена. Кстати, советы и комментарии приветствуются.
Эта инструкция претендует на быстрое освоение азов и начало использования мощного механизма автоматизации vSphere (и View, и много чего еще).
Итак - чтобы начать получать профит от PowerShell для vSphere, выполняем простую последовательность шагов:
1) Устанавливаем необходимое
1.а) На Win7\2008 только PowerCLI
1.б) На WinXP\2003 еще и PowerShell предварительно
1.в) Вспомогательные сторонние утилиты
2) Настраиваем профиль для удобной работы
3) Узнаем и запоминаем азы
3.а) С чего начать
3.б) Куда посмотреть
3.в) Основные конструкции и хинты
4) Где взять готовое
4.а) Ссылки
4.б) Onyx
А теперь по пунктам.
1) Устанавливаем необходимое
1.а) на Win7\2008 только PowerCLI
На современных ОС от Майкрософт PowerShell (в тексте иногда будет сокращаться как posh) уже установлен.
Поэтому сразу идем на
http://vmware.com/go/powercli и загружаем последнюю версию PowerCLI.
Перед установкой запускаем posh и разрешаем выполнение неподписанных скриптов вот такой командой
Set-ExecutionPolicy RemoteSigned
или
Set-ExecutionPolicy Unrestricted
Первое более правильно с точки зрения формальной безопасности, второе – слегка более комфортно. Я в своей НЕ производственной среде использую второй вариант.
А теперь устанавливаем PowerCLI. Next, Next, Finish.
1.б) на WinXP/2003 еще и PowerShell предварительно
Идем на
http://www.microsoft.com/powershell, загружаем себе Windows Management Framework Core (!) – это название пакета, в который входит PowerShell. Вполне вероятно, что posh не установится без
.Net Framework 2 SP1.
Затем идем на
http://vmware.com/go/powercli и загружаем последнюю версию PowerCLI.
Перед установкой запускаем posh и разрешаем выполнение неподписанных скриптов вот такой командой
Set-ExecutionPolicy RemoteSigned
или
Set-ExecutionPolicy Bypass
Первое более правильно с точки зрения формальной безопасности, второе – слегка более комфортно- меньше подтверждений требуют. Я в своей НЕ производственной среде использую второй вариант.
А теперь устанавливаем PowerCLI. Next, Next, Finish.
1.в) вспомогательные сторонние утилиты
Я предложу пока парочку – PowerGUI и PowerTab.
PowerGUI
Загружаем PowerGUI отсюда –
http://www.powergui.org.
Без затей устанавливаем.
Я пользуюсь практически только его PowerGUI Script Editor:
UPD. В составе актуальной версии posh поставляется продукт PowerShell ICE - как раз редактор для написания скриптов. Пользуюсь теперь им.
Эта штука дает удобный интерфейс для написания скриптов, подсветка синтаксиса, подстановка параметров и переменных.
PowerTab
UPD. сейчас я этой штукой не пользуюсь, как-то с опытом она стала менее удобной, но как памятку оставлю.
Для начала маленькая иллюстрация:
Начните писать какую-нибудь команду в консоли PowerCLI. Например:
Get-VM
Но ограничьтесь только
Get-V
И нажмите Tab. Вы увидите, что PowerCLI дописал вам команду до Get-VApp. Нажмите Tab снова – команда поменялась на следующий подходящий вариант (Get-Variable). Так можно Tab’ом перебрать до необходимой нам команды. Запомним такое поведение.
Загружаем PowerTab отсюда -
http://powertab.codeplex.com/.
Запускаем PowerCLI и выполняем команду:
$env:PSModulePath
На выходе получаем что-то вроде:
C:\Documents and Settings\mmm\Мои документы\WindowsPowerShell\Modules;
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\
Вот по любому из этих путей скопируйте каталог PowerTab из ранее загруженного архива.
Теперь в окне PowerCLI выполните команду
Import-Module PowerTab
Я на все вопросы нажимал Enter, устанавливая модуль с параметрами по умолчанию.
Начните писать какую-нибудь команду в консоли PowerCLI. Например:
Get-VM
Но ограничьтесь только
Get-V
И нажмите Tab.
Теперь по нажатию Tab в консоли PowerCLI мы вместо поочередного добивания подходящих вариантов наблюдаем более удобную картину:
Выбрать нужную команду или там параметр объекта теперь проще.
Обратите внимание – команда Import-Module загрузила нам PowerTab только до закрытия окна PowerCLI. Для постоянного использования этой утилиты следует добавить ее импорт в профиль – см. п.2.
Подробности про модули в общем см. тут -
about_Modules.
2) Настраиваем профиль для удобной работы
Профиль – это скрипт posh, выполняемый при запуске.
В нем удобно определять всякие постоянно используемые мелочи.
Это функции, переменные, псевдонимы команд, настройки цветов консоли и пр.
Здесь я приведу пример своего профиля, с неполными комментариями – что не прокомментировано здесь будет затронуто в п.3.
Итак, нам нужен профиль.
Сначала проверяем, существует он у нас или нет. Выполним команду
test-path $profile
Если на выходе false, то профиля нет, и его надо создать. Для этого выполните команду
new-item -path $profile -itemtype file -force
Теперь профиль создан.
Когда профиль создан, или уже существовал, отредактируем его. Выполните команду
notepad $profile
В блокноте откроется файл (в первый раз он будет пуст) – и сюда следует добавить нужные нам вещи.
Вот что добавлено у меня:
$vc = "vcenter4.vm4.ru"
##адрес сервера vCenter
$esx1 = "esx1.vm4.ru"
## имя одного сервера ESX
$esx2 = "esxi2.vm4.ru"
## имя другого сервера ESX
$vccred = Get-VICredentialStoreItem -host $vc -file D:\cred.xml
## Это файл с учетными данными для подключения к vCenter
function pro {notepad $profile}
## Теперь написав "pro" я открываю профиль для редактирования
add-pssnapin VMware*
## Для подгрузки командлетов vSphere в стандартный posh
Connect-VIServer $vc -User $vccred.user -Password $vccred.Password
## инициация подключения к vCenter
Import-module PowerTab
## Импорт модуля PowerTab
new-alias -name vm -value Get-VM
## Псевдоним для Get-VM = vm
function vmON {get-vm | ? {$_.PowerState -eq "PoweredOn"}}
## функция vmON выводящая список всех включенных ВМ
cd \
clear
Теперь при старте powerCLI данные команды будут выполняться автоматически. Конкретно в моем случае –
- Создается несколько переменных, в частности $vc – мой сервер vCenter.
- Создается функция pro – этими тремя буквами я вызываю редактирование профиля.
- Создается псевдоним vm – этими двумя буквами я вызываю команду Get-VM.
- Набрав vmON я получаю список включенных ВМ. vmON это имя функции, реализующей данную выборку.
- Загружается модуль PowerTab.
- Устанавливается соединение с сервером vCenter, авторизация производится учетными данными, ранее сохраненными в файл d:\cred.xml. Кстати - если вы запускаете PowerShell работая в учетной записи Windows, имеющей право на доступ к vCenter, то достаточно выполнить
Connect-VIServer $vcпри такой команде posh попытается авторизоваться из под текущего пользователя.
Вот по последнему пункту маленькое отступление – необходимо создать файл-хранилище учетной записи. Для этого выполните команду
New-VICredentialStoreItem -host $vc -user administrator -Password gfhjkm -File d:\cred.xml
Однажды созданный, файл раз за разом используется в профиле.
Этот механизм авторизации использую я – но я не утверждаю, что такой следует использовать вам.
Про профиль -
about_Profiles.
UPD.
Как поменять цвета консоли PowerShell -
http://habrahabr.ru/blogs/powershell/126965/.
Появилась рекомендация по ускорению первого выполнения скрипта posh -
How to speed-up the execution of the first PowerCLI cmdlet.
Вроде как .Net что-то там компилирует, в первый раз, поэтому два подряд выполнения одного скрипта могут на порядок отличаться по скорости. Вот для борьбы с этим есть пара действий.
UPD. У вас есть ярлык для запуска PowerShell, и ярлык для запуска PowerCLI. Они отличаются тем, что второй подгружает командлеты VMware, а первый - нет. Чтобы командлеты VMware подгружались всегда, в профиль стоит добавить
add-pssnapin VMware*
UPD.
3) Узнаем и запоминаем азы
Данный текст - всего лишь памятка, поэтому тут только некоторые основы.
3.а) С чего начать
Запустите установленный PowerCLI, и выполните команду
Get-VM
эта команда (командлет по правильному) показывает информацию (на это указывает Get в названии) по объектам виртуальные машины (VM в названии).
По схеме действие-объект построены все или почти все командлеты posh, и часто по названию можно сориентироваться.
Например, существуют командлеты Start-VM, Export-VMHostProfile и т.п.
Важно – каждая команда выдает на выходе объект. Когда после Get-VM мы на экране видим следующее:
То
важно понимать – команда показала нам не текст с именем ВМ, статусом ВКЛ\ВЫКЛ и пр, а команда получила список объектов (тут – виртуальных машин), и на экран вывела некоторые свойства этих объектов, примерно так:
объект_ВМ1. Имя объект_ВМ1. Статус
объект_ВМ2. Имя объект_ВМ2. Статус
объект_ВМ3. Имя объект_ВМ3. Статус
…
Это означает две вещи – мы можем использовать любое свойство объекта, который получил наш командлет, и мы можем объект\объекты с вывода одного командлета подавать на вход другому.
Например – возьмем банальный CD-ROM виртуальной машины. Для получения информации о нем существует командлет Get-CDDrive.
Ему на вход следует подать список ВМ - о приводах которых (или одной которой) надо вывести информацию. Прочтя краткий хелп, мы видим, что у этой команды есть параметр –VM. Пробуем:
Get-CDDrive -VM *
Видим список подключенных cd-rom, и что именно подключено, для любой ВМ (тут звездочка – классический символ подстановки вида «любой набор символов», т.е. тут мы выбираем ВМ с любым именем, т.е. выбираем все ВМ):
Вывод не особо читаем, но форматирование займемся чуть позже.
А можно сделать чуток по другому:
Get-CDDrive –VM (а в скобках не указывать конкретную ВМ или символ подстановки, а вставить командлет делающий выборку виртуальных машин)
например так:
Get-CDDrive - VM (Get-VM)
На выход получим то же самое (Get-VM ,без параметров возвращает все имеющиеся ВМ).
Наконец, можно расположить команлеты в обратном порядке – сначала сделать выборку, а потом передать результаты в Get-CDDrive:
Get-VM | Get-CDDrive
эти три варианта идентичны. Обычно лучше использовать последний вариант – удобнее. Сделали одну выборку, затем поставили вертикальную черту «|» - и после нее пишем действия над результатами первой операции – вертикальная черта как раз предписывает передать объекты «по конвейеру».
Итак – несколько важных фактов:
1) Командлеты работают над и возвращают как результаты работы объекты.
2) Обычно мы обращаемся к свойствам объектов.
3) Объекты можно передавать по конвейеру.
Осталось понять – а как мне узнать нужный командлет, нужное свойство, и как мне реализовать мелкие фишки – типа форматирования плохочитаемого дефолтного вывода.
3.б) Куда посмотреть
У нас есть понимание того, что мы хотим получить. Теперь надо это понимание реализовать в скрипте. Начинаем, вестимо, с команд – какая команда выполняет желаемое?
Как узнать командлет.
Первое о чем стоит сказать – можно просто получить список всех возможных команд PowerCLI:
Get-VICommand
Так как полный список обычно не нужен, можно сделать фильтрацию по действию или объекту:
Get-VICommand | ? { $_.Noun -eq 'VM' }
Все командлеты выглядящие как “что-то-VM”
(можно слегка по-другому это вызывать
get-command -Module vmware* -verb get )
А следующая команда покажет все командлеты выглядящие как “Get- что-то”
Get-VICommand | ? { $_.Verb –eq 'Get'}
Или еще можно вот так:
Help *vm*
Список команд, в названии которых есть подстрока в звездочках.
Вообще, команда help (она является псевдонимом для командлета Get-Help) очень полезна. Есть разные ключики:
help Get-VM – краткая справка по командлету
help Get-VM –full - полная справка
help Get-VM –examples - примеры
help Get-VM –online – онлайн справка
Итак, командлет мы найдем - просто отталкиваясь от ожидаемого имени. Теперь бы разобраться с тем, какую инфу, какие свойства объектов этот командлет нам может дать.
Свойства
Самая главная тут команда – Get-Member, или ее псевдоним gm. Этот командлет следует применить после командлета, выдающего объект, чьи свойства нас интересуют. Например конвейер
get-vm | get-member
покажет список свойств ВМ.
Например, нас интересует свойство Guest.
Теперь можно например так
(Get-VM ad).Guest
нам покажут значение этого свойства для ВМ с именем «AD».
Но там может быть много полей с дополнительными данными. Чтобы увидеть их – повторим итерацию:
(Get-VM ad).Guest | gm
А чтобы не просматривать свойства по одному, а увидеть все варианты:
Get-VM ad | Format-Custom guest -depth 2
с помощью этой команды мы можем увидеть доступную информацию, а потом обращаться только к нужным полям, например так:
(Get-VM ad).guest.vm.harddisks
Ну и хелп, конечно, никто не отменял.
Для не информационных комадлетов, таких как Get, а чего-то вроде New-VM, Set-VirtualSwitch и т.п. вариант с Get-Member не прокатит – там придется читать хелп.
А вот тут приведен скрипт, выполнение которого сформирует csv-файл с данными по параметрам каждого командлета PowerCLI -
http://www.lucd.info/2011/03/04/powercli-cmdlet-xref-another-look/
3.в) Основные конструкции и хинты
Upd. Get-View
есть специфический командлет - get-view.
позволяет получить инфу, иногда недоступную больше никак. Иногда - в более удобном виде\месте чем другими способами.
вот тут -
Use PowerShell to Simplify Access to Data Through PowerCLI - оптимизация работы с ним.
Выборка объектов по критерию
Полезно использовать конструкцию
where {$_.Поле –оператор_сравнения значение} например
get-vm | where {$_.PowerState -eq "PoweredOn"}
Мне больше нравится писать не where, а знак вопроса:
get-vm | ? {$_.PowerState -eq "PoweredOn"}
В этих двух конструкциях вы видите «$_». Это – указание на объект, переданный на вход. В скрипте из примера что происходит – «Get-VM» без параметров возвращает список вообще всех ВМ, т.е. не объект, а массив объектов. Мы хотим обратиться к каждому объекту из массива, и проверить значение в свойстве PowerState. Переменная «$_» как раз и позволяет обратиться не к свойству конкретного объекта, а к свойству
каждого объекта, переданного на вход.
Операции сравнения
Введем переменные для иллюстрации:
$vm_list = “vm1”, “vm2”,”vm3”
$vm_test = “vm3”
Равно.
Следующее утверждение неверно
$vm_list –eq $vm
а вот это верно:
“vm3” –eq $vm_test
Неравно.
-ne
Большем чем.
-gt
например
if(6 -gt 5) { echo "6 больше чем 5" }
Меньше чем.
-lt
Больше равно.
-ge
Меньше равно.
-le
Содержит.
Следующее утверждение истинно:
$vm_list –contains $vm_test
Не содержит.
$vm_list –notcontains $vm_test
А если к любому оператору сравнения вначале приписать букву “c”, то операция сравнения будет выполнена с учетом регистра.
“vm3” –сeq $vm_test
Символы подстановки
* - что угодно
[ab]* - строка начинающаяся с a ИЛИ b
? – любой один символ
Использование:
Get-VM *
Get-VM viewdesktop?
UPD. из комментариев.:
Еще может быть полезен оператор сравнения "-like" - поиск по простому шаблону - когда не помнишь точное название VM или чтобы не вписывать весь Datastore ID.
Вывод нужных свойств объектов
Если вернутся к срипту, показывающему данные CD-ROM всех наших ВМ:
Get-VM | Get-CDDrive
то мы вспомним, что информация на выходе не особо читаема
Улучшим это.
Для улучшения вывода можно применить командлет Select-Object, позволяющий вывести на экран указанные свойства, примерно так:
командлет1 | командлет2 | Select-Object название_свойства1, название_свойства2.
А откуда взять названия свойства? Из Get-Member:
Или, в некоторых ситуациях, может пригодиться добавить в конце
| Format-Table –Wrap
как видно – длинные строки были отформатированы при помощи переноса строки.
Разбор csv файла
Сам файл c:\vms.csv
name,host,datastore
vmt1,esxi2.vm4.ru,iSCSI_main_100GB
vmt2,esxi2.vm4.ru,iSCSI_main_100GB
vmt3,esxi2.vm4.ru,iSCSI_main_100GB
заносим файл в переменую:
$vmcsv = import-csv C:\vms.csv
Используем его вот такой конструкцией:
foreach ($line in $vmcsv)
{ new-vm -Name $line.name -vmhost $line.host -datastore $line.datastore}
Запуск такого скрипта создаст мне три виртуальные машины, на указанно хосте, с указанными именами и на указанном хранилище. Прочие параметры так же можно явно указать, при необходимости.
Организация циклов
$str = New-Object System.Text.StringBuilder
for($i=0; $i -lt 5; $i++)
{ $str = $str.Append([String]::Format("{0} ", $i)) }
echo $str.ToString()
Здесь мы определили строковую переменную $str, в начале она пуста.
Затем начали цикл for, определили переменную $i, используем ее как счетчик.
Пока $i меньше 5 к переменной $str добавляем пробел и значение $i на текущем этапе.
После завершения цикла на экран будет выведено строковое значение $str, это будет
1 2 3 4.
Пример с if else уже был:
if(6 -gt 5) { echo "6 больше чем 5" }
В if может быть только одно условие.
Сортировка
Для сортировки применяется конструкция sort-object. Например, для сортировки виртуальных машин по тому, на каком хосте они работают, надо выполнить такую цепочку:
Get-VM | Sort-Object Host
здесь Host – свойство объекта виртуальная машина.
Можно сразу по нескольким полям:
Get-VM | Sort-Object Host, Name
тут виртуальные машины сначала будут отсортированы по хостам, внутри этой сортировки – по именам.
Добавив ключ –descending сортируем в обратном порядке.
Форматирование
Format-List - вывод списком свойств объекта
Get-vm | sort-object PowerState | format-list -groupby PowerState
Выбрали все ВМ –> отсортировали по вкл\выкл –> результаты в виде списка, да еще разбитые на подкатегории по статусу ВКЛ\ВЫКЛ ВМ.
Может быть полезно
Get-vm | sort-object PowerState | format-list *
Вывод всех полей.
Format-Table - вывод таблицей
Очень полезна следующая конструкция:
Get-vm | get-member | format-table –wrap
Будет с переносом строк текста внутри строк таблицы – без этого длинные примечания нечитабельны
Format-Wide - вывод списком в несколько столбцов одного свойства.
Get-vm | format-wide –autosize
Выводит только имя (по умолчанию), но в несколько столбцов. Удобнее для просмотра длинных списоков. Autosize – он сам выбирает число столбцов.
Или сами выбираем не имя, а другое поле объекта
Get-vm | format-wide guest
Format-Custom Форматирование по некому шаблону.
По умолчанию, я так понимаю, в виде xml.
UPD. Из комментариев.
- Вывод в файл осуществалется ">" либо ">>"
- Экпорты Export-csv, Export-clixml, convertto-html - назначение понятно по названию.
Запуск самостоятельного скрипта
Если скрипт лежит в каталоге c:\posh, то вариантов несколько:
1. В консоли posh указать полный путь
c:\posh\script1.ps1
2. Перейти в этот каталог
cd c:\posh
затем выполнить скрипт
./script1.ps1
или
.\script1.ps1
3. В переменной окружения path добавить каталог со скриптом
$env:path += “c:\posh”
при регулярных обращениях к скриптам из каталога лучше добавить эту строку в профиль.
Ну или без затей сделать это из графического интерфейса – в свойствах моего компьютера -> вкладка дополнительно -> кнопка переменные среды.
Затем в консоли вызываем скрипт просто по имени
script1
Если хотим выполнить posh-скрипт откуда-то еще, например из планировщика, то как вариант, создаем батник, в него пишем
%SystemRoot%\system32\windowspowershell\v1.0\powershell.exe -psc "C:\Program Files\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" -command "c:\posh\script1.ps1"
Звуковая сигнализация
Можно сделать вот так:
$beep = “`a”
здесь перед a стоит обратная кавычка, которая на клавише с буквой ё.
Тогда обратившись к этой переменной
$beep
вы услышите писк
А если в переменную занести слегка другое значение
$beep = “`a`a `a `a `a `a `a `a `a ”
то услышим много писка.
Помогает, когда надо привлечь внимание.
Как поправить конфиг ВМ
http://communities.vmware.com/thread/306105?tstart=30
Скопировать что-то на VMFS хранилище
Все хранилища подмонтируются в posh-диск vmstores.
Так что если выполнить
cd vmstores:
(двоеточие в конце принципиально)
а затем делать dir\ls и углубиться в структуру каталогов – найдем нужное. затем можно использовать mkdir для создания каталогов и Copy-DatastoreItem для копирования данных на хранилище.
Например
mkdir test cd ./test Copy-DatastoreItem -Item C:\some_file.ext
После этого мы обнаружим на VMFS\NFS хранилище каталог test и соответствующий файл внутри.
А еще можно сделать
cd vi:
и тогда мы попадем в иерархию vCenter как на posh-диск.
Можно с помощью dir\ls и cd спускать по структуре пулов\ vApp, хостов\кластеров, и выполняя, например, get-vm, получать на выход только объекты с текущего уровня.
Чтобы скрипт не требовал подтверждения
Добавить -Confirm:$false
Как положить файл на файловую систему ESX(i)
http://communities.vmware.com/message/1630559#1630559
Вкратце – вызов ssh сессии из powerCLI скрипта.
Запустить команду в гостевой ОС из сессии PowerCLI к vCenter\ESX(i)
Есть специальный командлет Invoke-VMScript
Например, мы массово хотим сделать ipconfig/release. Нам поможет скрипт
Get-VM | Invoke-VMScript –ScriptText “ipconfig/release” –ScriptType Bat –guestuser DomainAdmin –GuestPassword gfhjkm
Запускать в госте можно команды PowerShell, CMD и BASH.
Или передавать путь к скрипту внутри
Get-VM | Invoke-VMScript –ScriptText “c:\a.bat” –ScriptType Bat –guestuser DomainAdmin –GuestPassword gfhjkm
Если передаваемая внутрь команда – не PowerShell, то для Windows гостей нужно указать тип -
–ScriptType Bat.
4) Где взять готовое
4.а) Ссылки
4.б) Onyx
Для того, чтобы продолжить, очень полезной может оказаться утилита
Onyx. Очень, очень прикольная штука, хоть пока и не в статусе релиза. Примерный план получения profit'а:
1) По ссылке скачали архив, распаковали, запустили исполняемый файл. Нажали звездочку, и указали адрес vCenter.
2) Клиентом vSphere подключаемся на ту машину и порт, где запущен Onyx.
3) В окне Onyx нажимаем пиктограмму начала записи, и в клиенте vSphere выполняем действия, которые мы хотели бы заскриптовать. В окне Onyx появится готовый скрипт для этого! Левая из пиктограмм сохранит содержимое окна в файл скрипта PowerShell.
Те скрипты, на которых экспериментировал я, выполнялись и делали нужную работу без дополнительных усилий с моей стороны. В Onyx я сохранил скрипт под именем ps_start_SQL_VM.ps1. В PowerCLI я запустил файл с таким именем. Все.
Конец.