Простая GUI утилита для управления standard vSwitch в VMWare vSphere через PowerCLI

в 17:47, , рубрики: GUI, powercli, powershell, VMware, vsphere 5, виртуализация, Песочница, метки: , , , ,

Доброго времени суток, уважаемые читатели!

Мне бы хотелось поделиться с вами простым, и на мой взгляд, удобным способом управления виртуальными коммутаторами в инфраструктуре VMWare vSphere, не используя vDS (vSphere Distributed Switch).
Кто-то не использует vDS потому, что не видит в них надобности. Кто-то потому, что ему неудобно. Кто-то потому, что нет лицензии — ведь vDS требует Enterprise Plus лицензию 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 и завершении задачи.
image
Прикрутим код для соединения с виртуальной ифнраструктурой:

$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.
При запуске должно появиться окно:
image
Авторизируемся на vCenter.
image

Создадим пробную портгруппу «test».
image
И удалим ее
image
По аналогии и с остальными функциями.

Исходный код лежит на 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

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