понедельник, 20 марта 2017 г.

VCAP6-DCV Deploy

Не так давно я успешно сдал экзамен 3V0-623 на статус VMware Certified Advanced Professional 6 – Data Center Virtualization Deployment.

В свое время я уже рассказывал о сдаче VCAP-DCA.

Экзамен представляет собой одну большую лабораторную работу, состоящую из 27 заданий, и полностью копирует интерфейс labs.hol.vmware.com.

Из печального - на все про все дается 205 минут, не важно - являешься ли ты носителем языка или нет - дополнительных 30 минут для не-англоговорящих в этом экзамене не предусмотрено. С одной стороны это справедливо, т.к. уровень изложения вопросов ну очень простой и не требует сколь-нибудь серьезных познаний в языке, с другой - дополнительные 30 минут в таких экзменах приходятся как нельзя кстати.

Я не сдавал VCAP по vSphere 5, но по моим ощущениям данных экзамен сильно упрощен по сравнению с VCAP-DCA. В заданиях четко прописано, что надо сделать, разве что пошаговую инструкцию не приводят, нет воды в стиле: "Компания XYZ, являющаяся лидером индустрии, хочет повысить отдачу от инвестиций путем повышения показателя консолидации, бла-бла..."

На мой вгляд, экзамен проверяет вовсе не уровень знаний продуктов VMware, а умение решать задачи в условиях жесткой нехватки времени, а также тренерует терпение, когда из-за тормозного интерфейса вы пытаетесь вбить какую-нибудь команду типа esxcli software vib list и у вас задваивается или затраивается половина символов, а кнопку backspace не работает...

Определенную сложность составляла работа с интерфейсом на мониторе с разрешением 1280 x 1024. Изначально, область с текстом заданий отъедала где-то 1/3 экрана, оставляя под рабочую область смехотворные 800 пикселей, чего совершенно недостаточно для работы с консолями.

Отдельно хотелось бы сказать по поводу производительности лаборатории. Все операции выполнялись крайне быстро, чего нельзя сказать об интерфейсе. По всей видимости, из-за нестабильного соединения с Интернет, у меня несколько раз подвисал интерфейс, постоянно задваивался ввод команд с клавиатуры, перетаскивание или выделение элементов интерфейса были сущим кошмаром. Хорошо, что в интерфейсе экзамена предусмотрена возможность копирования текста - достаточно выделить нужный фрагмент и перетащить его мышкой в нужное поле ввода. Поэтому мой совет для тех, кто планирует сдавать этот экзамен - оставляйте вопросы, которые предполагают работу с CLI или написание скриптов, напоследок, так вы сможете решить больше заданий и повысить свои шансы на успешную сдачу.

Что касается подготовки, то при наличии у вас практического опыта работы с vSphere, vCenter, vSphere Replication и VDP экзамен не покажется вам сложным. Для подготовки я использовал blueprint к экзамену, а также несколько неофициальных руководств:


И конечно, много-много практики в лабораторных работах labs.hol.vmware.com и на собственном стенде.

понедельник, 6 февраля 2017 г.

Пример интеграции VMware vCenter IPAM и Windows IP Address Management

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

Я довольно долго пользовался данным методом выдачи адресов для ВМ в своей лаборатории, однако при всей своей простоте он имеет ряд недостатков. Во-первых, выданные адреса хранятся в текстовом файле, что затрудняет отслеживание свободных адресов и удаление неиспользуемых. Во-вторых, Perl я совсем не знаю, из-за чего крайне затруднительно редактировать скрипт для добавления новых функций.

Поэтому недавно я решил переписать сценарий и интегрировать его со службой Windows IP Address Management, которая присутствует в Windows Server 2012 R2 и более поздних версиях.

Вкратце, выдача адресов работает следующим образом:
  1. При создании ВМ из шаблона, vCenter запускает скрипт на Perl и передает ему XML документ, который содержит информацию о ВМ (имя, расположение, количество сетевых адаптеров и группы портов, к которым они подключены).
  2. Скрипт Perl, в свою очередь, запускает сценарий на Powershell и передает ему XML документ.
  3. Сценарий Powershell подключается к серверу IPAM, запрашивает свободный IP адрес из диапазона, который соответствует группе портов виртуального коммутатора, и резервирует его за ВМ.
  4. Сценарий Powershell возвращает модифицированный XML документ с зарезервированными IP адресами скрипту Perl, который отдает его vCenter.
  5. vCenter использует полученные адреса при создании ВМ.
У данного метода тоже есть ряд недостатков. Скрипт генерирует только IP адрес, маска подсети, маршрутизатор по умолчанию и адрес DNS сервера должны быть прописаны в настройках Customization Specification. Скрипты работают только на vCenter под Windows, т.к. vCenter Server Appliance не поддерживает сценарии на Powershell. Возможно в будущем у меня дойдут руки, чтобы сделать обеспечить работу скрипта и под Appliance.

Ниже приведен пример настройки серверов IPAM и vCenter, а также скрипты на Perl и Powershell.

Настройка

Для начала установите роль IPAM сервера.

Настройте сервер IPAM (Provision the IPAM server). Для хранения конфигурации я использовал встроенную БД и ручной режим настройки политик (Manual).

Создайте новый блок адресов Add IPv4 Address Block. В поле Network ID укажите адрес подсети, задайте маску (Prefix length), начальный и конечный IP адрес блока. Оставьте остальные настройки по умолчанию.

Создайте новую подсеть Address Subnet. В поле Name укажите имя группы портов на виртуальном коммутаторе. В качестве Network ID укажите адрес подсети, укажите маску подсети. Оставьте остальные настройки в значении по умолчанию.

Создайте новый диапазон адресов (Add IP Address Range). В поле Network ID укажите адрес подсети, в поле Prefix length укажите длину маски. В полях Start IP address и End IP address укажите начальный и конечный адрес диапазона для выдачи. Оставьте остальные значения по умолчанию.

Создайте служебную доменную учетную запись, например, Company\IPAMUser.

Назначьте учетной записи роль IP Address Record Administrator Role. Для этого в консоли IPAM перейдите на вкладку ACCESS CONTROL > Access Policies и создайте новую политику (Add Access Policy). В политике в поле User alias укажите имя служебной учетной записи, а поле Access Settings укажите роль и область действия роли (\Global).

На сервере IPAM в консоли управления локальными пользователями и группами добавьте служебную учетную запись в группу "WinRMRemoteWMIUsers_".

На сервере vCenter установите консоль администрирования IPAM (Features > Remote Server Administration Tools > Feature Administration Tools > IP Address Management (IPAM) Client).

Если сервер IPAM и сервер vCenter не являются членами одного домена, и не используется Kerberos аутентификация, то на сервере vCenter вам потребуется добавить сервер IPAM в перечень доверенных серверов, например:
winrm set winrm/config/client @{TrustedHosts="ipam02.company.local"}
или настроить подключение с использованием HTTPS, как описано в статье http://blog.vmpress.org/2009/11/winrm-windows-server-2008.html

На сервере vCenter установите Perl и добавьте параметры в Advanced Settings в настройках vCenter, как это описано в статье http://blog.vmpress.org/2015/06/ip-vmware-vcenter.html

Сохраните скрипт Perl на сервере vCenter, например, в файл "C:\Scripts\wrapper.pl".
use strict;
use warnings;
use MIME::Base64;
use Encode qw(encode);


#Read XML document from STDIN
sub ReadFromSTDIN($) {
my ($fh) = @_;
my $line;
my $doc;
do {
$line = <$fh>;
$doc .= $line;
} while (defined($line) && $line !~ /<\/generator>/);
local $/ = undef;
return $doc;
}

#Write modified XML document to STDOUT
sub WriteToSTDOUT($$) {
my ($fh, $doc) = @_;
print $fh $doc;
}

#Encode XML document to Base64 format
sub EncodeXML($) {
my ($doc) = @_;
my $encoded = encode_base64(encode("UTF-8", $doc));
$encoded =~ s/[\x0A\x0D]//g;
return $encoded;
}

# Main
eval {
my $doc = ReadFromSTDIN(\*STDIN);
my $encoded = EncodeXML($doc);
my $result = `"powershell.exe -file C:\\scripts\\ipam.ps1 $encoded"`;
WriteToSTDOUT(\*STDOUT, $result);
exit(0);
}
При необходимости отредактируйте путь к сценарию Powershell, не забудьте про экранирование символа "\" в пути.

Сохраните сценарий Powershell на сервере vCenter, например, в файл "C:\scripts\ipam.ps1".
param (
[string]$InputString
)

#Return credetials to connect to IPAM server
function generate-Credentials($Username, $Password) {
$Pass = ConvertTo-SecureString -String $Password -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username, $Pass
return $Cred
}

#If hostname is empty, set hostname = VM name
function generate-VMName($xml) {
$LastIndexOf = $xml.generator.vm.LastIndexOf("/")
$VMName = $xml.generator.vm.Substring($LastIndexOf+1)
if($xml.generator.hostname -eq "") {
$xml.generator.hostname = $VMName
}
return $xml
}

#Request free IP address from IPAM Subnet name equal to NIC's virtual switch port group
function get-IPAddress ($CimSession, $SubnetName) {
$IPAddress = (get-ipamsubnet -addressfamily ipv4 -cimsession $CimSession | where {$_.Name -eq $SubnetName} | get-ipamrange -addressfamily ipv4 | find-ipamfreeaddress).ipaddress
return $IPAddress
}

#Convert Base64 string to XML document
[xml]$xml = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($InputString))

#IPAM server address, username and password
$IpamServer = "ipam02.company.local"
$Username = "COMPANY\IPAMUser"
$Password = "P@ssw0rd"
$Credentials = generate-Credentials $Username $Password
$xml = generate-VMName $xml
$CimSession = New-CimSession -ComputerName $IpamServer -Credential $Credentials

#Request and assign IP addresses for all NICs
foreach ($element in $xml.generator.nics) {
$SubnetName = $element.nic.Network
$ipaddress = get-IPAddress $CimSession $SubnetName
#Reserve IP address from IPAM and write it to XML document
if($ipaddress) {
Add-IpamAddress -IpAddress $ipaddress -AssignmentType auto -devicetype VM -devicename $xml.generator.hostname 

-MacAddress $element.nic.macaddress -CimSession $CimSession
$element.nic.ipaddress = $ipaddress.ToString()
}
}
return $xml.InnerXml
В сценарии Powershell задайте адрес сервера IPAM и укажите имя и пароль служебной учетной записи.

Отредактируйте параметры в Advanced Settings в настройках vCenter, указав путь к исполняемому файлу Perl и скрипту.
В параметре config.guestcust.name-ip-generator.arg1 укажите путь к скрипту "C:\scripts\wrapper.pl".
В параметре config.guestcust.name-ip-generator.arg2 укажите путь к скрипту "C:\scripts\wrapper.pl".
В параметре config.guestcust.name-ip-generator.program укажите путь к исполняемому файлу "C:\Perl64\Bin\perl.exe".

Создайте или отредактируйте существующие настройки Customization Specification на сервере vCenter. На вкладке Configure Network выберите ручной вариант настройки адресации (Manually select custom settings) и отредактируйте настройки виртуального сетевого адаптера.

На вкладке IPv4 выберите вариант Use an application configure on the vCenter Server to generate an IP address, задайте маску подсети (Subnet Mask) и маршрутизатор по умолчанию (Default Gateway). На вкладке DNS укажите адрес DNS сервера.

На этом настройка завершена.

Проверка работы

Для проверки работы скрипта запустите его в ручном режиме из командной строки.
С:\Perl64\bin\perl.exe c:\scripts\wrapper.pl
и используйте тестовый XML документ, например:
<generator>
     <datacenter>/New Datacenter</datacenter>
     <vm>/New Datacenter/vm/New Virtual Machine</vm>
     <vm-moref>vim.VirtualMachine:vm-249</vm-moref>
     <hostname/>
     <uuid>502081ef-91df-7455-e570-be1f6d4f5abc</uuid>
     <guest>winXPProGuest</guest>
     <nics>
        <nic id="0">
           <ipaddress/>
           <iparg></iparg>
           <macaddress>00:50:56:a0:70:15</macaddress>
           <network>VM Network</network>
        </nic>
     </nics>
</generator>
Если все настроено корректно, то в результате работы скрипта вы увидите XML со сгенерированным IP адресом.

А на сервере IPAM появится информация о выданном IP адресе.

После проверки на тестовом XML можно попробовать создать ВМ из шаблона.

пятница, 6 января 2017 г.

Создаем свой виртуальный Appliance для автоматического развертывания и настройки ВМ

Уже давно многие вендоры используют механизм распространения своих приложений в виде виртуальных апплайнсов (Virtual Appliance). VMware vSphere поддерживает импорт ВМ из шаблонов, созданных в формате Open Virtualization Format 1.0.

В качестве примеров таких приложений можно привести VMware vCenter Server Appliance, vRealize Operations Manager Appliance, vRealize Automation и другие.

Среди плюсов OVF - возможность автоматизировать процесс настройки ВМ при развертывании, например, задавать имя, IP адрес и другие сетевые настройки, пароль администратора и т.д.

Все настройки описываются в формате параметр/значение (OVF Properties) в свойствах виртуальной машины.

В качестве примера рассмотрим процедуру создания своего собственного шаблона OVF.

Создаем свой OVF шаблон на базе ОС Windows

Процедуру создания OVF шаблона можно разделить на несколько этапов:
  1. Создание эталонного образа ВМ, установка ОС и приложений внутри ВМ.
  2. Настройка параметров OVF в свойствах ВМ.
  3. Выбор механизма передачи параметров OVF в гостевую ОС.
  4. Подготовка скрипта, который использует переданные в гостевую ОС параметры и выполняет необходимые настройки.
  5. Экспорт ВМ в формат OVF/OVA.
В качестве эталонного образа может выступать ВМ с любой ОС, поддерживаемой средой виртуализации, будь то Linux или Windows.

Для включения возможности использования параметров OVF требуется сначала выключить ВМ и в ее свойствах включить поддержку vApp options (для vSphere Web Client это делается на вкладке vApp Options включением опции Enable vApp options, для vSphere Client на вкладке Options -> vApp Options -> vApp options: Enabled.

После включения опций появится возможность задавать базовые настройки для апплайнса, такие как: название апплайнса, производитель, версия, ссылку на сайт.

Перед тем, как задавать значения параметров для передачи в гостевую ОС, потребуется их определить (для vSphere Web Client это делается на той же вкладке vApp Options -> Properties, для vSphere Client - в Options -> vApp Options -> Advanced -> Properties).

Каждый параметр имеет следующий набор свойств:
  • Категория (Category).
  • Отображаемое имя (Label).
  • Идентификатор класса (class ID).
  • Идентификатор ключа (Key ID).
  • Порядковый номер ключа (Key instance ID).
  • Описание (Description).
  • Тип (Type).

Отображаемое имя и описание - это то, что видят пользователи при развертывании данного апплайнса.

Вводимые пользователем данные можно ограничить определенным форматом, выбрав тот или иной тип, например, строка, пароль, целое число, IP адрес, выпадающий список из нескольких пунктов и т.д. Для ряда параметров, типа String или Boolean вы можете указать значение по умолчанию (Default Value), которое будет автоматически установлено при развертывании данного апплайнса.

Идентификатор класса может пригодиться, если вы создаете несколько параметров с одинаковым идентификатором ключа или вам необходимо каким-либо специальным образом обрабатывать группу параметров (и которое пользователь может переопределить, если захочет).

Категория позволяет объединять параметры в определенные логические группы, например, можно создать категорию Network Settings, в которую будут включаться все параметры, относящиеся к сетевым настройкам ВМ. Такие параметры будут отображаться на форме развертывания новой ВМ вместе. Идентификатор ключа позволяет устанавливать порядок отображения параметров на форме в момент развертывания ВМ. Например, если вы хотите, чтобы сначала пользователь вводил сетевой адрес, а потом маску сети, то для первого параметра установите значение Key instance ID равное 0, для второго - 1.

Более детально настройки параметров описаны в документе: https://www.vmware.com/support/developer/converter-sdk/conv43_apireference/vim.vApp.PropertyInfo.html

После создания параметров вам потребуется задать для них какие-либо значения (для vSphere Web Client на той же вкладке vApp Options -> Application properties, для vSphere Client в Options -> vApp Options -> Properties). Если вы разворачиваете ВМ из OVF шаблона, то, соответственно, все параметры нужно будет задать в момент развертывания.

Следующий шаг - выбор способа передачи параметров в гостевую ОС. VMware поддерживает два варианта передачи параметров:
  • Через ISO образ.
  • Через VMware Tools.
Настройка механизма передачи для vSphere Web Client выполняется на вкладке vApp Options -> OVF settings, для vSphere Client в Options -> vApp Options -> OVF Settings).

При передаче параметров через ISO, гипервизор запишет параметры в XML файл, сохранит его в ISO образе и подмонтирует к ВМ через виртуальный CD-привод.

При передаче параметров через VMware Tools, можно будет считать их, воспользовавшись утилитой vmtoolsd из гостевой ОС. Соответственно, для работы данного варианта требуется наличие установленных компонентов VMware Tools.

Для Windows используется команда:
"C:\Program Files\VMware\VMware Tools\vmtoolsd.exe" --cmd "info-get guestinfo.ovfEnv"

Для Linux используется команда:
/usr/sbin/vmtoolsd --cmd "info-get guestinfo.ovfEnv"

Вывод команды:
C:\Users\Administrator>"C:\Program Files\VMware\VMware Tools\vmtoolsd.exe" --cmd "info-get guestinfo.ovfEnv"

<?xml version="1.0" encoding="UTF-8"?>
<Environment
     xmlns="http://schemas.dmtf.org/ovf/environment/1"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:oe="http://schemas.dmtf.org/ovf/environment/1"
     xmlns:ve="http://www.vmware.com/schema/ovfenv"
     oe:id=""
     ve:vCenterId="vm-1930">
   <PlatformSection>
      <Kind>VMware ESXi</Kind>
      <Version>6.0.0</Version>
      <Vendor>VMware, Inc.</Vendor>
      <Locale>en</Locale>
   </PlatformSection>
   <PropertySection>
         <Property oe:key="Administrator_Password" oe:value="P@ssw0rd1"/>
         <Property oe:key="DNS_Servers.3" oe:value="192.168.2.2,192.168.2.1"/>
         <Property oe:key="Default_Gateway.2" oe:value="192.168.3.1"/>
         <Property oe:key="Domain_Suffix.5" oe:value="company.local"/>
         <Property oe:key="Hostname.4" oe:value="server03"/>
         <Property oe:key="IP_Address.0" oe:value="192.168.3.100"/>
         <Property oe:key="Netmask.1" oe:value="255.255.255.0"/>
   </PropertySection>
   <ve:EthernetAdapterSection>
      <ve:Adapter ve:mac="00:50:56:a3:33:53" ve:network="vs-VLAN3" ve:unitNumber="7"/>
   </ve:EthernetAdapterSection>
</Environment>

Обратите внимание на цифры, присутствующие в названии параметров - это Key instance ID, который был задан при определении параметра. Если вы не задавали Key instance ID и Class ID, то имя параметра будет соответствовать значению Key ID.

Для считывания параметров можно воспользоваться простым скриптом на Powershell.
$sdpath = "C:\Program Files\VMware\VMware Tools\vmtoolsd.exe" 

[xml]$xml = & $sdpath --cmd "info-get guestinfo.ovfEnv" | Out-String

$properties = $xml.Environment.PropertySection.Property
$AdministratorPassword = ($properties | where-object {$_.Key -eq "Administrator_Password"}).Value
$IPAddress = ($properties | where-object {$_.Key -eq "IP_Address.0"}).Value
$Netmask = ($properties | where-object {$_.Key -eq "Netmask.1"}).Value
$DefaultGateway = ($properties | where-object {$_.Key -eq "Default_Gateway.2"}).Value
$DNSServers = ($properties | where-object {$_.Key -eq "DNS_Servers.3"}).Value
$Hostname = ($properties | where-object {$_.Key -eq "Hostname.4"}).Value
$DomainSuffix = ($properties | where-object {$_.Key -eq "Domain_Suffix.5"}).Value

После получения параметров вы можете дописать скрипт, который выполнит все необходимые настройки внутри гостевой ОС, например, задаст пароль локального администратора и переименует компьютер:
net user Administrator $AdministratorPassword
rename-computer -NewName $Hostname

Или настроит статический IP адрес, маску и маршрутизатор по умолчанию на сетевом адаптере:
#https://d-fens.ch/2013/11/01/nobrainer-using-powershell-to-convert-an-ipv4-subnet-mask-length-into-a-subnet-mask-address/
function Convert-IpAddressToMaskLength([string] $dottedIpAddressString)
{
  $result = 0; 
  # ensure we have a valid IP address
  [IPAddress] $ip = $dottedIpAddressString;
  $octets = $ip.IPAddressToString.Split('.');
  foreach($octet in $octets)
  {
    while(0 -ne $octet) 
    {
      $octet = ($octet -shl 1) -band [byte]::MaxValue
      $result++; 
    }
  }
  return $result;
}

$PrefixLength = Convert-IpAddressToMaskLength($Netmask)

New-NetIPAddress -InterfaceAlias "Ethernet" -IPAddress $IPAddress -PrefixLength $PrefixLength -DefaultGateway $DefaultGateway
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses $DNSServers

Возможности скрипта ограничены только вашей фантазией, при желании, можно автоматически создавать новый домен, разворачивать Exchange Server, используя параметры, заданные пользователем при развертывании ВМ из шаблона.

Предположим, что скрипт, выполняющий нужные настройки написан, и возникает закономерный вопрос - как его запускать?

Для ОС Windows есть несколько вариантов:
  • Использовать планировщик задач (Task Scheduler), который будет запускать скрипт при старте компьютера.
  • Использовать локальную групповую политику (gpedit.msc Computer Configuration -> Windows Settings -> Scripts (Startup/Shutdown) -> Startup), которая также запустит скрипт при старте компьютера.
  • Использовать сценарий setupcomplete.cmd, запускающийся после выполнения Sysprep.
Первые два варианта имеют свои недостатки, т.к. они будут запускать скрипт при каждой загрузке ОС. Поэтому нам потребуются дополнительные механизмы внутри самого скрипта, которые бы проверяли, что он уже отрабатывал, или которые бы отключали задание в планировщике или групповую политику после первого успешного запуска.

Более простым вариантом является использование связки Sysprep и файла C:\Windows\Setup\Scripts\setupcomplete.cmd внутри которого можно настроить запуск нашего скрипта на PowerShell, например:
"C:\Windows\System32\WindowsPowershell\v1.0\powershell.exe" "C:\Customization\script.ps1"

Также нам потребуется файл ответов unattend.xml для автоматической настройки через Sysprep. Вот пример файла для Windows Server 2012 R2 Standard:
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
   <settings pass="generalize">
      <component name="Microsoft-Windows-PnpSysprep" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <PersistAllDeviceInstalls>true</PersistAllDeviceInstalls>
      </component>
   </settings>
   <settings pass="oobeSystem">
      <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <OOBE>
            <SkipMachineOOBE>true</SkipMachineOOBE>
            <HideEULAPage>true</HideEULAPage>
            <SkipUserOOBE>true</SkipUserOOBE>
            <ProtectYourPC>1</ProtectYourPC>
         </OOBE>
         <TimeZone>Russian Standard Time</TimeZone>
         <UserAccounts>
            <AdministratorPassword>
               <Value>P@ssw0rd</Value>
               <PlainText>true</PlainText>
            </AdministratorPassword>
         </UserAccounts>
      </component>
   </settings>
   <settings pass="specialize">
      <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <RegisteredOwner>User</RegisteredOwner>
         <RegisteredOrganization>Company</RegisteredOrganization>
         <ProductKey>D2N9P-3P6X9-2R39C-7RTCD-MDVJX</ProductKey>
         <ComputerName>*</ComputerName>
      </component>
      <component name="Microsoft-Windows-UnattendedJoin" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <Identification>
            <JoinWorkgroup>WORKGROUP</JoinWorkgroup>
         </Identification>
      </component>
   </settings>
</unattend>

Последнее, что остается - запустить Sysprep, указав файл ответов:
"C:\Windows\System32\Sysprep\sysprep.exe" /generalize /oobe /shutdown /unattend:C:\Sysprep\unattend.xml

При следующем включении ВМ, Sysprep автоматически сгенерирует новый SID и имя компьютера, а в конце запустить скрипт setupcomplete.cmd, который, в свою очередь, запустит наш скрипт.

После выключения ВМ вы можете экспортировать ее в OVF/OVA формат (Template -> Export OVF Template).

Наш шаблон для развертывания апплайнса готов.

Изменение конфигурации ВМ при развертывании

Помимо настройки гостевой ОС, OVF позволяет пользователю изменять конфигурацию ВМ в момент развертывания. Допустим, вы хотите сделать один универсальный шаблон, подходящий и для тестового развертывания, и для типового развертывания, и для развертывания в высоконагруженных средах. Отредактировав файл OVF, вы можете добавить меню с выбором предопределенной аппаратной конфигурации ВМ, например:
  • Small - 1 процессор, 512 МБ ОЗУ.
  • Normal - 2 процессора, 1024 МБ ОЗУ.
  • Large - 4 процессора, 4096 МБ ОЗУ.
В зависимости от выбранного пользователем варианта, гипервизор создаст ВМ с нужным количеством ядер и оперативной памяти.

Откройте файл .OVF в текстовом редакторе (если вы экспортировали ВМ в OVA архиве, то сначала распакуйте его содержимое, используя любой архиватор).

В файле после секции <References></References> вставьте текст, описывающий варианты конфигурации ВМ:
 <DeploymentOptionSection>
<Info>Deployment options for VMware Virtual SAN Witness Appliance</Info>
<Configuration ovf:id="Small">
   <Label>Small</Label>
<Description>VM with 1 CPU and 512MB RAM.</Description>
</Configuration>
<Configuration ovf:id="Normal">
   <Label>Normal</Label>
<Description>VM with 2 CPU and 1024MB RAM.</Description>
</Configuration>
<Configuration ovf:id="Large">
   <Label>Large</Label>
<Description>VM with 4 CPU and 4096MB RAM.</Description>
</Configuration>
  </DeploymentOptionSection>

Найдите в файле секцию <VirtualHardwareSection></VirtualHardwareSection> внутри которой описывается аппаратная конфигурация ВМ. Найдите области с тегами <Item></Item>, описывающие конфигурацию процессоров и ОЗУ, например:
      <Item>
        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
        <rasd:Description>Number of Virtual CPUs</rasd:Description>
        <rasd:ElementName>2 virtual CPU(s)</rasd:ElementName>
        <rasd:InstanceID>1</rasd:InstanceID>
        <rasd:ResourceType>3</rasd:ResourceType>
        <rasd:VirtualQuantity>2</rasd:VirtualQuantity>
      </Item>
      <Item>
        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
        <rasd:Description>Memory Size</rasd:Description>
        <rasd:ElementName>4096MB of memory</rasd:ElementName>
        <rasd:InstanceID>2</rasd:InstanceID>
        <rasd:ResourceType>4</rasd:ResourceType>
        <rasd:VirtualQuantity>4096</rasd:VirtualQuantity>
      </Item>

Замените их на теги с аттрибутами, указывающие на ранее добавленные варианты конфигураций, например:
      <Item ovf:configuration="Small">
        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
        <rasd:Description>Number of Virtual CPUs</rasd:Description>
        <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
        <rasd:InstanceID>1</rasd:InstanceID>
        <rasd:ResourceType>3</rasd:ResourceType>
        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
      </Item>
      <Item ovf:configuration="Normal">
        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
        <rasd:Description>Number of Virtual CPUs</rasd:Description>
        <rasd:ElementName>2 virtual CPU(s)</rasd:ElementName>
        <rasd:InstanceID>1</rasd:InstanceID>
        <rasd:ResourceType>3</rasd:ResourceType>
        <rasd:VirtualQuantity>2</rasd:VirtualQuantity>
      </Item>
      <Item ovf:configuration="Large">
        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
        <rasd:Description>Number of Virtual CPUs</rasd:Description>
        <rasd:ElementName>4 virtual CPU(s)</rasd:ElementName>
        <rasd:InstanceID>1</rasd:InstanceID>
        <rasd:ResourceType>3</rasd:ResourceType>
        <rasd:VirtualQuantity>4</rasd:VirtualQuantity>
      </Item>
      <Item ovf:configuration="Small">
        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
        <rasd:Description>Memory Size</rasd:Description>
        <rasd:ElementName>512MB of memory</rasd:ElementName>
        <rasd:InstanceID>2</rasd:InstanceID>
        <rasd:ResourceType>4</rasd:ResourceType>
        <rasd:VirtualQuantity>512</rasd:VirtualQuantity>
      </Item>
      <Item ovf:configuration="Normal">
        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
        <rasd:Description>Memory Size</rasd:Description>
        <rasd:ElementName>1024MB of memory</rasd:ElementName>
        <rasd:InstanceID>2</rasd:InstanceID>
        <rasd:ResourceType>4</rasd:ResourceType>
        <rasd:VirtualQuantity>1024</rasd:VirtualQuantity>
      </Item>
      <Item ovf:configuration="Large">
        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
        <rasd:Description>Memory Size</rasd:Description>
        <rasd:ElementName>4096MB of memory</rasd:ElementName>
        <rasd:InstanceID>2</rasd:InstanceID>
        <rasd:ResourceType>4</rasd:ResourceType>
        <rasd:VirtualQuantity>4096</rasd:VirtualQuantity>
      </Item>

Аналогичным образом вы можете добавлять в ВМ сетевые адаптеры, задавать количество и объем жестких дисков и т.д.

Сохраните и закройте OVF файл.

Откройте MF файл, который размещается в том же каталоге, что и OVF. С помощью команды
Get-FileHash -Path .\appliance.ovf -Algorithm sha1 

посчитайте новую хэш-сумму и запишите в MF файл.

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

Автоматизация процедуры развертывания апплайнса из шаблона

Шаблон апплайнса для развертывания и настройки ВМ готов. Но создавать новые ВМ через vSphere Client или vSphere Web Client довольно скучное занятие. Хотелось бы и его автоматизировать. Помочь в этом нам может утилита OVF Tool (https://www.vmware.com/support/developer/ovf/).

После установки запустите команду, указав путь к OVF файлу, чтобы получить информацию о шаблоне:
C:\Users\Administrator>"C:\Program Files\VMware\VMware OVF Tool\ovftool.exe" "D:\Software\appliance01\appliance01.ovf"
OVF version:   1.0
VirtualApp:    false
Name:          Test Appliance
Version:       1.0
Full Version:  1.0.0
Vendor:        Company inc.
Product URL:   http://blog.vmpress.org
Vendor URL:    http://blog.vmpress.org

Download Size:  68096 bytes

Deployment Sizes:
  Flat disks:   1024.00 MB
  Sparse disks: Unknown

Networks:
  Name:        VM Network
  Description: The VM Network network

Virtual Machines:
  Name:               appliance01
  Operating System:   windows8server64guest
  Virtual Hardware:
    Families:         vmx-10
    Number of CPUs:   1
    Cores per socket: 1
    Memory:           512.00 MB

    Disks:
      Index:          0
      Instance ID:    11
      Capacity:       1024.00 MB
      Disk Types:     SCSI-lsilogicsas

    NICs:
      Adapter Type:   E1000e
      Connection:     VM Network

Properties:
  Key:         Netmask
  Label:       Netmask
  Type:        ip

  Key:         Default_Gateway
  Label:       Default Gateway
  Type:        ip

  Key:         IP_Address
  InstanceId   0
  Category:    Network Settings
  Label:       IP Address
  Type:        ip
  Description: Укажите IP адрес для виртуальной
               машины.

Deployment Options:
  Id:          Small
  Label:       Small
  Description: VM with 1 CPU and 512MB RAM.

  Id:          Normal
  Label:       Normal
  Description: VM with 2 CPU and 1024MB RAM.

  Id:          Large
  Label:       Large
  Description: VM with 4 CPU and 4096MB RAM.

  Id:          Large
  Label:       Large
  Description: VM with 4 CPU and 4096MB RAM.

Чтобы создать новую ВМ из шаблона выполните команду:
C:\Users\Administrator>"C:\Program Files\VMware\VMware OVF Tool\ovftool.exe" --noSSLVerify^
 --acceptAllEulas^
 --name="TestVM01"^
 -ds="stor01"^
 --net:"VM Network"="VM Network 2"^
 --deploymentOption="Small"^
 --prop:"Default_Gateway"="192.168.1.1"^
 --prop:"IP_Address.0"="192.168.1.100"^
 --prop:"Netmask"="255.255.255.0"^
 --powerOn^
 "X:\Software\appliance01\appliance01.ovf"^
 vi://Administrator:P@ssw0rd@vcenter.company.local/VDC/host/CLU01

Символ "^" переноса строки и пробелы в начале каждой строки используются для лучшей читаемости (при желании можно написать команду в одну строчку).

--noSSLVerify - пропускает проверку SSL сертификата на vCenter Server.
--acceptAllEulas - автоматически принимает лицензионное соглашение в шаблоне апплайнса.
--name="TestVM01" - задает имя создаваемой ВМ.
-ds="stor01" - указывает имя хранилища, где требуется разместить ВМ.
--net:"VM Network"="VM Network2" - указывает к какой сети следует подключить адаптер, где название "VM Network" должно совпадать с именем сети (можно посмотреть в выводе первой команды, заданной в апплайнсе, а "VM Network 2" - группе портов в виртуальной инфраструктуре, куда требуется подключить виртуальный адаптер.
--deploymentOption - указывает тип создаваемой ВМ.
--prop:<Параметр>=<Значение> - перечень параметров можно посмотреть в выводе первой команды OVF Tool.
--powerOn - (опционально) - включить ВМ после создания.
"X:\Software\appliance01\appliance01.ovf" - путь к OVF файлу.
vi://Administrator:P@ssw0rd@vcenter.company.local/VDC/host/CLU01 - указывает адрес сервера vCenter для подключения (vcenter.company.local), логин (Administrator), пароль (P@ssw0rd), имя виртуального ЦОД (VDC) и кластера (CLU01), где будет создана ВМ.

Дополнительные параметры к OVF Tools можно посмотреть в руководстве пользователя.

понедельник, 7 ноября 2016 г.

Экзамен на статус VCP6-NV

Не так давно я сдавал экзамен 2V0-641 для получения статуса VCP6-NV. И пока воспоминания еще свежи, я хочу поделиться с вами несколькими рекомандациями касаемо экзамена.

Экзамен включает в себя 85 вопросов. По формату он ничем не отличается от любого другого экзамена, будь то VCP6-DCV или VCP6-DTM, поэтому если вы уже сдавали эти экзамены, то процесс не будет для вас в новинку.

Большая часть вопросов касается VMware NSX, однако встречаются вопросы и по стандартным и распределенным виртуальным коммутаторам.

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

Подготовку к экзамену (как и к любым другим) следует начинать с чтения Blueprint: https://mylearn.vmware.com/mgrReg/plan.cfm?plan=64297&ui=www_cert

Важно помнить, что экзамен не охватывает функциональные возможности, появившиеся в NSX 6.2.x: Cross-vCenter, Hardware VTEP, Traceflow и др. - учтите это при подготовке.

Касаемо материалов для подготовки. Думаю, не стоит говорить, что официальная документация обязательна к прочтению, так вот: официальная документация обязательна к прочтению. Что касается функционала распределенных коммутаторов, то рекомендую освежить в памяти Networking Guide по vSphere.

Другой, крайне полезный документ - Design Guide по NSX. В сети есть несколько версий design guide, читать лучше всего последнюю актуальную версию: VMware NSX for vSphere Network Virtualization Design Guide ver 3.0 (в Blueprint дана ссылка на более старую версию, в которой не хватает полезной информации). Не думаю, что сильно ошибусь, если скажу, что примерно на четверть всех вопросов в экзамене можно ответить, прочитав этот документ от и до.

Кроме того, если вы работает в компании партнере VMware и имеете доступ к порталу Partner Central, непременно скачайте один или два архива с документацией SET по NSX. Архивы содержат море полезной документации, начиная с описания эталонного дизайна, и заканчивая инструкциями по внедрению и сопровождению.

В Интернете вы можете найти разнообразные инструкции по подготовке к экзамену - вещи крайне полезные, но не стоит ограничиваться только ими. Вот примеры:
Для тех, кто любит смотреть обучающие видео я рекомендую:
  • vBrownBag VCP-NV - базовый курс, который подойдет для начинающих.
  • VCIX-NV - продвинутый курс, не смотрите, что это видео для подготовки к старшей сертификации VCIX, для VCP он тоже отлично подойдет.
Если у вас есть возможность - посетите авторизованные курсы NSX: Install, Configure, Manage (или хотя бы раздобудьте учебное пособие). Курс пригодится для того, чтобы структурировать имеющиеся знания, а также понять логику работы таких механизмов, как ARP Proxy, Distributed Firewall, L2 Bridging, Designated Interface.

Помимо курса вы можете использовать официальное руководство VCP6-NV Official Cert Guide. Книга полезна хотя бы тем, что содержит вопросы для самоподготовки, которые не лишним будет пройти.

Обязательно уделите внимание практике. Если у вас нет своего стенда, то его могут прекрасно заменить лабораторные работы на VMware HOL Online. В практике я рекомендую не останавливаться только на базовых вещах, типа создания логических коммутаторов или виртуальных маршрутизаторов, но также основательно попрактиковаться в вопросах траблшутинга работы NSX и виртуальных коммутаторов, включая такие штуки, как Flow Monitoring и Activity Monitoring, Service Composer, Data Security, ведения журналов; про функционал распределенного коммутатора не забывайте - знание LACP, Port Mirroring, Network IO Control пригодятся на экзамене.

Еще одна рекомендация касаемо подготовки. Многие из вас должны быть в курсе, что помимо VCP присутствует и более простой сертифицированный статус VCA (VMware Certified Assosiate). Тем, кто не уверен в своих силах одолеть VPC, рекомендуется сначала сдать VCA. Эти экзамены существенно дешевле, к ним можно подготовиться и сдать, не имея практического опыта. Однако в случае с VCA6-NV экзамен сделан из рук вон плохо. Присутствует большое количество опечаток, двусмысленности, откровенно бредовых и неуместных вопросов. Например, мне за экзамен попалось два вопроса на знание Horizon View, хотя, казалось бы, при чем он здесь? Поэтому не уверен, что сдача VCA несет в себе какой-то смысл, разве что нервы потренировать.

Обязательно пройдите бесплатный тестовый экзамен на сайте VMware. Вопросы в нем максимально приближены к вопросам экзамене, поэтому, если вы провалите тестовый экзамен, то знайте - к настоящему вы еще не готовы.

среда, 26 октября 2016 г.

VMworld 2016 Europe (день 3)

Отчет о третьем (последнем) дне VMworld 2016 Europe. Первая и вторая части.

Фотографии с мероприятия.

Сессии

Третий день на VMworld всегда проходит по укороченной программе. С одной стороны - конференция работает до 16 часов, с другой - за два дня все выматываются, и даже на партнерской выставке на тебя порой смотрят усталыми глазами: "-Про наше решение хочешь услышать? Вот тебе флешка, пользуйся на здоровье!" 

Первая сессия, которую я посетил (Simplifying Disaster Recovery in 2016 using VSAN, NSX and SRM [STO7802]) касалась синергетического эффекта, который можно получить при совместном использовании NSX, Virtual SAN и SRM при построении катастрофоустойчивых виртуальных инфраструктур.

Традиционные DR решения уже давно научились обеспечивать автоматическое восстановление в части вычислительных ресурсов (серверов), и даже на уровне СХД за счет механизма синхронизации/репликации данных все выглядит неплохо, но больным местом остается сеть. Без наличия растянутых L2 сетей или механизмов по переносу целого сегмента с перенастройкой маршрутизатора, восстановление оборачивается головной болью. А ведь еще надо обеспечить защиту на уровне брандмаэура и балансирование нагрузки восстановленных сервисов в резервном ЦОД.

Помочь в этом может VMware NSX. Начиная с версии 6.2, NSX поддерживает распределенную инсталляцию (Cross vCenter NSX), включающую до восьми серверов vCenter.

При этом появляется возможность использовать универсальные объекты - логические сети, распределенные маршрутизаторы, распределенный брандмауэр, группы безопасности, доступные в виртуальной инфраструктуре под управлением любого из серверов vCenter. Все это позволяет легко восстановить ВМ из основного ЦОД в резервный, сохраняя ее привязку к логической сети и правила фильтрации трафика.

При использовании распределенной инсталляции с использованием Cross vCenter NSX требуется определиться с тем, использовать функцию Local Egress для распределенных коммутаторов, или нет. Local Egress позволяет решить проблему Hairpinning, при которой ВМ, расположенные на одной площадке общаются с внешним миром через маршрутизаторы, расположенные на второй площадке, что приводит к дополнительной нагрузке на межсайтовое соединение. 

Что касается Virtual SAN, то он, в свою очередь, избавляет администратора от необходимости работы с LUN'ами СХД и хранилищами ВМ, заменяя это механизмом управления ресурсами хранения через политики (Storage Policies Based Management). Virtual SAN позволяет обеспечить высокий уровень доступности подсистемы хранения (до 99,9999% при использовании двойного зеркалирования данных, FTT=2), что обеспечивает RTO порядка 32 секунд в год при нулевом RPO. Для FTT=1, соответственно, 99,999% и 5 минут простоя в год.

Для Virtual SAN может быть обеспечен RPO в 5 минут при репликации средствами vSphere Replication (при репликации с других СХД RPO составляет 15 минут). Кроме того, для Virtual SAN поддерживается сценарий, при котором защита данных обеспечивается как средствами распределенного кластера (Virtual SAN Stretched Cluster), так и vSphere Replication в связке с SRM.

Также во время выступления упомянули о варианте развертывания двух распределенных кластеров Virtual SAN, узлы-свидетели которых располагаются друг на друге. Данное решение на текущий момент не поддерживается, но если очень хочется, то заказчик может обратиться в VMware, чтобы пройти процедуру RPQ (Request Product Qualification).

Заключительная сессия, на которой я побывал (An Overview of the vCenter Server Appliance Management Interface and API [INF9144]), касалась, по большей части, нововведений vCenter Server Appliance 6.5. Во-первых, в vCenter Server Appliance наконец-то интегрировали vSphere Update Manager. Больше не требуется разворачивать отдельный сервер на Windows для обновления хостов ESXi.

Во-вторых, это переработанный мастер установки, который теперь можно будет запускать не только под Windows, но также Linux и MAC OS. Через мастер установки также возможно перенести настройки с существующей инсталляции vCenter Server for Windows на апплайнс, при необходимости сохранив записи в журналах событий и счетчики производительности виртуальной инфраструктуры.

В-третьих, vCenter Appliance имеет встроенный механизм резервного копирования (Native Backup and Restore), который сохраняет все настройки и данные vCenter в виде единого архива на сервер про протоколу FTP(s) / HTTP(s) / SCP, который затем можно восстановить на чистый апплайнс. Размер такого бекапа существенно меньше бекапа всей ВМ vCenter целиком.

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

Существенной доработке подвергся vCenter Appliance Management User Interface (VAMI). Теперь в VAMI появился встроенный мониторинг состояния компонентов vCenter, уровня загрузки ресурсов и размер занятого дискового пространства. Таким образом, даже в случае недоступности служб vCenter Server возможно будет провести базовую диагностику, подключившись к VAMI.

Завершение

Подошел к концу еще один VMworld. Этот год принес приятный сюрприз в виде анонса новой версии vSphere и других продуктов. Часть нововведений, представленных VMware, вроде Cloud Foundation или vSphere Integrated Containers выглядят вполне понятно и логично, другие, вроде VMware Cloud on AWS, вызывают настороженно-оптимистический интерес, т.к. как можно увидеть, далеко не все инициативы, о которых рассказывают на VMworld, принимаются заказчиками (вспомнить хотя бы EVO:RAIL, EVO SDDC). Пожелаем же VMware успехов. До встречи в следующем году!