Главная System Center, Virtualization, Новое Массовое развертывание виртуальных машин с использованием SCVMM2008R2 SP1
  • Массовое развертывание виртуальных машин с использованием SCVMM2008R2 SP1

    massЕсли вы слышали о Hyper-V – то наверняка слышали и об инструменте под названием Microsoft System Center Virtual Manager, предназначенном, как ни странно, для управления виртуальными машинами. Вдаваться в описание я не буду – в интернетах о нем не писал разве что ленивый, я опишу одну конкретную задачу, на поиск решения которой я потратил достаточно много времени. Итак, задача: создать с помощью VMM много виртуальных машин, присвоить статические IP-адреса и прочие сетевые настройки (маска, шлюз, DNS, etc.) и ввести в домен. К сожалению, здесь не все так просто, как кажется.

    Как известно, в VMM есть возможности массового развертывания виртуальных машин. Для этого используются так называемые шаблоны (Templates). Конструктивно шаблон состоит из образа виртуального жесткого диска(ов), настроек виртуального “железа” – кол-во процессоров, объем памяти, сетевые адаптеры, etc. и настроек гостевой ОС: имя компьютера, Product Key, пароль локального админа, и т.д. Файлы образов VHD хранятся в расшареных папках баблиотек (Library Share), по умолчанию – на самом сервере VMM, а все настройки – в базе данных MS SQL, используемой для работы VMM.

    Итак, первым делом необходимо создать шаблон (или шаблоны – если их будет несколько). Для этого создается виртуальная машина, на нее устанавливается ОС, другой софт (если необходимо) и с помощью визарда New Template конвертируется в шаблон. В процессе конвертации гостевая ОС обрабатывается с помощью sysprep, затем файл VHD копируется в Library Share, а сама виртуальная машина удаляется.

    После создания шаблона развертывание виртуалок будет производиться в 2 этапа:

    1. Собственно создание виртуалок
    2. Ввод в домен – удаленно, с помощью утилиты psexec

    Развертывание

    Итак, мы создали шаблон. В процессе создания шаблона нужно было определить настройки – как “железа” так и гостевой ОС. По какой-то до сих пор непонятной мне причине в Microsoft решили не добавлять в этот визард возможности задания статических сетевых настроек. При этом можно задать введение в домен. Попробуем создать виртуалку из шаблона.

    К сожалению, мы не сможем вводить наши виртуалки в домен через визард – поскольку перед этим необходимо прописать сетевые настройки.

    SCVMM

    Как это сделать? Единственный способ, который я смог найти – использование секции GuiRunOnce.

    Сразу, пока не перешли дальше: задавать пароль локального администратора в визарде тоже нельзя. Если его задать – после загрузки гостевой ОС придется набирать этот пароль для входа в систему. Если же пароль здесь не задавать – вход в систему произойдет автоматически, и секция GuiRunOnce корректно отработает. Тем не менее, пароль задавать нужно. Во-первых – в целях безопасности, во-вторых – без пароля не отработает команда psexec. Так что оставляем пароль пустым, он будет задан командой net user в GuiRunOnce.

    Я добавлял следующие команды:

    netsh interface ipv4 set address "Local Area Connection" static 172.16.0.10 255.255.0.0 172.16.0.254

    netsh interface ipv4 add dnsserver "Local Area Connection" 172.16.0.1

    netsh firewall set opmode mode=disable

    net user administrator P@ssw0rd

    Пояснения: первая и вторая команда задают сетевые настройки: IP 172.16.0.10, Mask 255.255.0.0, Gaterway 172.16.0.254, DNS 172.16.0.1. Третья команда выключает Windows Firewall (нужно для корректной отработки psexec – см. далее), истинные джедаи вместо отключения фаерволла могут задать соответствующие правила. Четвертая команда задает пароль для учетной записи локального администратора.

    Перед тем, как нажать Finish – не забудьте установить галочку Power on virtual machine after creation, чтобы виртуалка запустилась автоматически сразу после создания.

    Ввод в домен

    Итак, виртуалка создалась и запустилась. Можно зайти на нее и посмотреть, что сетевые настройки применились (IP-адрес должен быть 172.16.0.10 и т.д.). Теперь нашу виртуалку нужно вводить в домен. Чтобы ввести в домен, нужно выполнить на ней команду:

    netdom join %computername% /d:test.local /ud:test\administrator /pd:P@ssw0rd /reb:15

    Эта команда введет виртуальную машину в домен test.local (имя компьютера было уже установлено при развертывании – его мы и оставим). В тестовой среде была использована учетная запись администратора домена. В целях безопасности в продакшен-среде я рекомендую создать отдельную учетку, делегировать ей права на ввод в домен и использовать ее. Учетные записи компьютеров в нужных OU можно (и нужно) будет создать предварительно – вручную или же скриптом.

    Поскольку виртуалок у нас будет много, заходить на каждую и выполнять команду мы не будем. Для автоматизации мы используем отличную утилиту psexec от Марка Руссиновича. В нашем случае команда будет выглядеть так:

    psexec \\172.16.0.10 –u administrator –p P@ssw0rd netdom join %computername% /d:test.local /ud:test\administrator /pd:P@ssw0rd /reb:15

    К сожалению, эта команда возьмет значение переменной %computername% не с виртуалки, а с той ОС, где эта команда выполнялась. Чтобы команда отработала корректно, мы сделаем так:

    1. Создаем *.cmd-файл
    2. Помещаем в него команду netdom join …(далее по тексту)
    3. С помощью pscexec с ключом –c выполняем этот командный файл на целевой виртуалке:

    psexec \\172.16.0.10 –c –u administrator –p P@ssw0rd addtodomain.cmd

    Автоматизация

    Поскольку, как уже было сказано – виртуалок у нас будет много – нам необходимо автоматизировать процесс. Проще всего для этого использовать Power Shell. Для того, чтобы скрипты корректно отработали – необходимо, чтобы на компьютьере была установлена консоль управления SCVMM и в консоли Power Shell необходимо загрузить соответствующие расширения.

    Предварительно нужно подготовить список виртуалок, которые мы будем развертывать. Проще всего это сделать в Excel, и сохранить результаты в формате CSV. В результате должно получиться что-то наподобие:

    Vmname,IP,Mask,Gateway,DNS
    Alpha,172.16.0.10,255.255.0.0,172.16.0.254,172.16.0.1
    Bravo,172.16.0.11,255.255.0.0,172.16.0.254,172.16.0.1
    Charlie,172.16.0.12,255.255.0.0,172.16.0.254,172.16.0.1
    Delta,172.16.0.13,255.255.0.0,172.16.0.254,172.16.0.1
    Echo,172.16.0.14,255.255.0.0,172.16.0.254,172.16.0.1
    Foxtrot,172.16.0.15,255.255.0.0,172.16.0.254,172.16.0.1

    Теперь можно написать скрипт, в частности на PowerShell, который создаст виртуалки из шаблона с параметрами, взятыми из списка. У меня скрипт получился такой:

    $VMS = Import-CSV c:\temp\vm.csv

    $Template = Get-Template -VMMServer localhost | where {$_.Name -eq "Test-alpha"}
    $VMHost = Get-VMHost -VMMServer localhost | where {$_.Name -eq "hyperv.test.local"}
    $HardwareProfile = Get-HardwareProfile -VMMServer localhost | where {$_.Name -eq "HW Profile1"}

    $VMS | Foreach-Object

    {
    $VMName=$_.Vmname
    $IP=$_.IP
    $Mask=$_.Mask
    $Gateway=$_.Gateway
    $DNS=$_.DNS

    New-VM -Template $Template -Name $VMName -VMHost $VMHost -Path "c:\VM" -Owner "TEST\administrator" -HardwareProfile $HardwareProfile -ComputerName $VMName -TimeZone 170 -GuiRunOnceCommands "netsh interface ipv4 set address ""Local Area Connection"" static $IP $Mask $Gateway", "netsh interface ipv4 add dnsserver ""Local Area Connection"" $DNS", "netsh firewall set opmode mode=disable", "net user administrator P@ssw0rd" -RunAsSystem -StartAction TurnOnVMIfRunningWhenVSStopped -DelayStart 0 -StopAction ShutdownGuestOS -StartVM -JobGroup 63e01329-c734-4c1b-a796-1ed955bda1eb -RunAsynchronously
    }

    Теперь можно запустить наш скрипт и идти курить (пить кофе, чай, пиво, и т.п.) – процесс длится достаточно долго, особенно когда виртуалок много.

    После того, как все виртуалки будут созданы и запущены – нужно “пройтись” по ним с помощью psexec и ввести в домен. Для этого создаем еще один Power Shell-скрипт.

    Предполагается, что файл domain.cmd у нас уже создан и лежит в том же каталоге, что и скрипт.

    $VMS = Import-CSV c:\temp\vm.csv

    $VMS | Foreach-Object {
    $IP=$_.IP
    .\psexec.exe \\$IP -c -u administrator -p P@ssw0rd domain.cmd
    }

    После отработки этого скрипта все наши виртуальные машины из списка будут введены в домен. Поздравляю, вы выполнили этот квест!

    P.S. Знаю, что в скрипты еще много чего можно добавить – запись в лог, например, или во втором скрипте обойтись без CMD-шника, а брать computername из CSV, и наверняка многое другое – тем не менее, направление куда копать я задал. Если кому-то пригодиться в работе – буду рад. Комментарии, разумеется, приветствуются.

    Александр Косивченко,

    MVP:VM

Комментарии

  1. Ближайший ToDo List:

    1) Прикрутить запись в Log-файл — нужно разве что для 2го скрипта, по 1му все Job'ы и так видны в консоли VMM

    2) В 1м скрипте добавить поле hostname, чтобы брал имя хоста из CSV

    Что еще можно добавить?

  2. Например добавить в отдельный текстовый файл нумераторы.

    При создании виртуальной машины, ее название берется из, допустим фиксированного префикса «VM» и нумератора из файла «1», после создания нумератор изменяется на «2», тогда можно избежать заполнения имен виртуалок при повторном запуске скрипта.

  3. Зачем — нумераторы, отдельные файлы? Мне кажется, проще всего Excel'ем сформировать CSV и по нему уже делать виртуалки. Во всяком случае, это решение более универсальное. По-моему так.©

  4. Не проще. Задача вполне конкретна — дать статические IP и ввести в домен. Насколько я понял из чтения по диагонали — ни та ни другая статья именно эту задачу не решают.

    Моя статья — обычное HOWTO по конкретной проблеме и ничего больше.

  5. Unatended файл позволяет задавать статику.

    Просто способ не совсем секурный получился.

  6. Позволять-то он позволяет, но это же придется генерить сотню XML-ников, по одному для каждой виртуалки?

  7. Когда речь о сотнях виртуалок, то использование статики смахивает на самобичивание )))

  8. @8 или на приступы паранойи у безопасников 😉

  9. Скорее уж тогда на незнание мат. части. «Секурные статические адреса», еще и на виртуалках, это из разряда экранирования витой пары «чтоб не считали сигнал»

  10. И тем не менее, при всей глупости — приходится с этим работать 🙁

  11. У нас был как-то крупный госзаказчик и мы делали им серверную для какого-то жутко секретного оборудования. Так вот, всю электронику, которую мы там размещали — кондиционеры, блок согласования, вплоть до пожарных извещателей и датчиков дыма — отправляли в какую-то организацию, где их разбирали, фотографировали в рентгене и проверяли на отсутствие «жучков». При этом они были согласны на потерю гарантии.

    Так-то!

  12. Не знаю как у других, у меня при чтении статьи сразу же возникло желание записать выражение "netsh interface ipv4 set address «„Local Area Connection“» static $IP $Mask $Gateway", "netsh interface ipv4 add dnsserver «„Local Area Connection“» $DNS", «netsh firewall set opmode mode=disable», «net user administrator P@ssw0rd» в переменную, а уже потом её подавать в командлет.

  13. подскажите пожалуйста как запустить подобный скрипт удаленно?

    на удаленном сервере, на сервере установлен SCVMM

    желательно запустить это скрипт из под php

  14. Думаю, Вам надо посмотреть в сторону SCVMM Self-Service Portal.

  15. SCVMM и Self-Service Portal к нему настроен и работает, но мне нужно чтоб скрипт запускался на сервере SCVMM по событию и с параметрами из биллинга...

    биллинг запущен на linux PHP

  16. SCVMM и Self-Service Portal к нему настроен и работает,

    но мне нужно чтоб скрипт запускался на сервере SCVMM по событию и с параметрами из биллинга...

    биллинг запущен на linux PHP

Опубликовать

Я не робот.