Доброго времени суток, уважаемые читатели!
Мне бы хотелось поделиться с вами простым, и на мой взгляд, удобным способом управления виртуальными коммутаторами в инфраструктуре VMWare vSphere, не используя
Кто-то не использует
Мы тоже пока используем обычные vSwitch, не смотря на наличие более 70 ESXi гипервизоров в инфраструктуре. И так получилось, что за время работы с ними, у меня скопилось множество PowerCLI скриптов для автоматической настройки тех или иных функций. И захотелось их объединить в нечто большее, сделав удобный инструмент для других администраторов. Через некоторое время я наткнулся на пакет Primal Forms (сейчас он называется PowerShell studio, есть урезанный Community Edition) и понял, что следующим шагом будет GUI. Primal Forms позволяет создавать GUI средствами самого PowerShell, однако существенно упрощая этот процесс — достаточно нарисовать GUI в редакторе, а потом простым щелчком по кнопке или другим управляющим элементам дописать код.
В итоге получилась скрипт-утилита позволяющая:
- Добавить портовую группу на все ESXi хосты в конкретный vSwitch
- Удалить портовую группу со всех хостов с конкретного vSwitch
- Добавить новый vSwitch с указанным MTU на все хосты
- Удалить vSwitch со всех хостов
- Проверить целостность: на всех ли хостах портовые группы одинаковы?
Плюс некоторые дополнительные плюшки:
- Включить/выключить SSH на каждом хосте
- Включить/выключить предупреждение о запущенном SSH на каждом хосте
Делать все это вручную на каждом хосте не только утомительно, но и довольно бестолково. Конечно, можно использовать host profiles, но для этого нужно переводить каждый хост в maintance mode. Да и те кто работали с host profiles могут подтвердить, что процесс применения профиля совсем не быстрый.
Примеры кода, и сама утилита под катом.
Через Primal Forms набросал интерфейс, c кнопками под каждое действие. Хотелось бы добавить управление фаерволлом и, например, просмотр снапшотов у всех хостов разом, поэтому с табами — задел на будущее. Заранее забиты дефолтные значения в поля, внизу — статус бар показывающий инфо о соединении с vCenter и завершении задачи.
Прикрутим код для соединения с виртуальной ифнраструктурой:
$buttonConnectToVcenter_Click={
If ($vcenter_address.Text -eq "") {[System.Windows.Forms.MessageBox]::Show("Please specify a VC Server")}
Else
{
$app_statusbar.Text="Connecting" //обновляем статусбар
[System.Windows.Forms.Application]::DoEvents() //чтобы форма не теряла отзывчивость
//загружаем нужные для работы с VMWare Snapin'ы.
Add-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue
Add-PSSnapin VMware.VumAutomation -ErrorAction SilentlyContinue
$VC = Connect-VIServer $vcenter_address.Text
If ($VC.IsConnected -eq $true)
{
$vc_connected=$TRUE
$app_statusbar.Text="Connected"
[System.Windows.Forms.MessageBox]::Show("Connected to "+$vcenter_address.Text)
}
else
{
[System.Windows.Forms.MessageBox]::Show("Connection FAILED - Please try again.")
$vc_connected=$FALSE //соединение провалилось. В дальнейшем будем использовать $vc_connected, чтобы не разрешать выполнения скриптов при не подключенном vcenter.
$app_statusbar.Text="Connection failed"
}
}
}
Дальше все по аналогии. Кнопка — реакция на событие. Например, добавим портовую группу.
$port_group_add_Click={
if ($vc_connected -eq $FALSE)
{
[System.Windows.Forms.MessageBox]::Show("I am not connected to vCenter") //проверяем, а соединение есть?
}
if ($vc_connected -eq $TRUE)
{
//проверяем, нет ли пустых полей в запросе?
If (($switch_name.Text -eq "") -or ($port_group_name_add.Text -eq "") -or ($port_group_vlan_id_add.Text -eq "")) {[System.Windows.Forms.MessageBox]::Show("Parameters missing")}
Else
{
$app_statusbar.Text="Adding port group..."
$esxhosts= Get-VMHost *
$progress.Value=0
$progress_tick=((1/$esxhosts.Count)*100)
foreach ($esxhost in $esxhosts)
{
[System.Windows.Forms.Application]::DoEvents()
$hypervisor = Get-VMHost $esxhost | Get-VirtualSwitch -Name $switch_name.Text
$hypervisor | New-VirtualPortGroup -Name $port_group_name_add.Text -VLanId $port_group_vlan_id_add.Text
$progress.Value=$progress_tick
$progress_tick=$progress_tick+((1/$esxhosts.Count)*100) //обновляем progress bar
}
$progress.Value=100
$app_statusbar.Text="Done!"
}
}
}
Мне бы не хотелось превращать пост в тупую распечатку кода, поэтому приведены лишь пара функций. Если вам интересно посмотреть его целиком — скольте сразу вниз, там ссылка на pastebin. К сожалению, я не программист, работает и ладно. Может быть, кто-нибудь подхватит пару идей из него, или сможет сделать гораздо лучше.
Как это работает?
После установки VMWare PowerCLI администратору доступны сmdlet'ы для работы с vSphere. При наличии работающего PowerShell и установленного PowerCLI — скрипт уже должен работать (кстати, еще Primal Forms позволяет создать exe'шник). Дальше уже PowerCLI позаботится об авторизации и взаимодействии с vSphere.
При запуске должно появиться окно:
Авторизируемся на vCenter.
Создадим пробную портгруппу «test».
И удалим ее
По аналогии и с остальными функциями.
Исходный код лежит на pastebin.
А собранный в Primal Forms exe'шник на depositfiles.
Вообще — PowerCLI в связке с PowerShell представляют потрясающие возможности для автоматизации, управления и мониторинга. Например, к vCenter можно прикрутить plug-in отображающий в отдельной вкладке html-отчет о состоянии виртуальной инфраструктуры, который создается каждое утро средствами PowerCLI и отображает информацию о:
- Хостах с включенным SSH доступом
- Хостах с разным patch level
- Виртуальных машинах у которых есть снапшоты
- Давно не включавшихся виртуальных машинах
- Хостах c NTP отличающимся от заданного
- И другой полезной и бесполезной информацией достойной отдельного хабратопика
Напоследок, хотелось бы поблагодарить форумы vmware communities за ценные подсказки и советы, а так же Михаила Михеева (michigun), благодаря книге которого я начал изучение такой популярной платформы виртуализации как VMWare vSphere, и Максима Мошкова — отличного преподавателя из HP Training Center за познавательные курсы по VMWare, благодаря которым удалось таки сдать на VCP410 и VCP510, да и вообще, узнать много новых вещей.
Автор: Evilence