Масове розгортання віртуальних машин із використанням SCVMM2008R2 SP1
Як відомо, у VMM є можливості масового розгортання віртуальних машин. І тому використовуються звані шаблони (Templates). Конструктивно шаблон складається з образу віртуального жорсткого диска (ів), налаштувань віртуального "заліза" - кількість процесорів, обсяг пам'яті, мережні адаптери, etc. та налаштувань гостьової ОС: ім'я комп'ютера, Product Key, пароль локального адміна, і т.д. Файли образів VHD зберігаються в розшарованих папках бібліотек (Library Share), за замовчуванням – на сервері VMM, а всі налаштування – в базі даних MS SQL, що використовується для роботи VMM.
Отже, спочатку необхідно створити шаблон (або шаблони – якщо їх буде кілька). Для цього створюється віртуальна машина, на неї встановлюється ОС, інший софт (якщо необхідно) та за допомогою візарду New Template конвертується у шаблон. У процесі конвертації гостьова ОС обробляється за допомогою sysprep, потім VHD копіюється в Library Share, а сама віртуальна машина видаляється.
Після створення шаблону розгортання віртуалок буде проводитись у 2 етапи:
- Власне створення віртуалок
- Введення в домен – віддалено, за допомогою утиліти psexec
Розгортання
Отже, ми створили шаблон. У процесі створення шаблону потрібно було визначити налаштування як "заліза" так і гостьовий ОС. З якоїсь досі незрозумілої причини в Microsoft вирішили не додавати в цей візард можливості завдання статичних мережевих налаштувань. При цьому можна встановити введення в домен. Спробуємо створити віртуалку із шаблону.
На жаль, ми не зможемо вводити наші віртуалки в домен через Візард - оскільки перед цим необхідно прописати мережеві налаштування.

Як це зробити? Єдиний спосіб, який я зміг знайти, - використання секції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, щоб віртуалка запустилася автоматично відразу після створення.
Введення в домен
netdom join %computername% /d:test.local /ud:test\administrator /pd:P@ssw0rd /reb:15
Оскільки віртуалок у нас буде багато, заходити на кожну та виконувати команду ми не будемо. Для автоматизації ми використовуємо чудову утиліту 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% не з віртуалки, а з ОС, де ця команда виконувалася. Щоб команда відпрацювала коректно, ми зробимо так:
- Створюємо *.cmd-файл
- Поміщаємо до нього команду netdom join …(далі за текстом)
- За допомогою pscexec із ключем –c виконуємо цей командний файл на цільовій віртуалці:
psexec\\172.16.0.10-c-u administrator -pP@ssw0rdaddtodomain.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,22.5.2. 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.1.1.2.1. 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 $VMHost = Get-VMHost -VMMServer localhost where $HardwareProfile = Get-HardwareProfile -VMMServer localhost where
$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 встановити адресу ""Підключення по локальній мережі"" static $IP $Mask $Gateway", "netsh interface ipv4 add dnsserver ""Підключення по локальній мережі"" $DNS", "netsh firewall set opmode mode=disable", "netsh 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 адміністратор -p P@ssw0rd domain.cmd >
Після роботи цього скрипта всі наші віртуальні машини зі списку будуть введені в домен. Вітаю, ви виповнили цей квест!
P.S. Знаю, що в скрипти ще багато чого можна додати – запис влог, наприклад, або в другому скрипті обійтися без CMD-шника, а брати computername з CSV, і, напевно, багато іншого - тим не менш, напрям куди копати я задав. Якщо комусь стане в нагоді в роботі – буду радий. Коментарі, зрозуміло, вітаються.
- Рубрика: System Center,Virtualization,Без рубрики,Нове
- Автор: Олександр Косівченко
- Дата: Fr >
Найближчий ToDo List: 1) Прикрутити запис в Log-файл - потрібно хіба що для 2го скрипта, по 1му всі Job'и і так видно в консолі VMM 2) У 1м скрипті додати поле hostname, щоб брав ім'я хоста з CSV Що ще можна додати?
Наприклад, додати в окремий текстовий файл нумератори. Під час створення віртуальної машини, її назва береться з, допустимо фіксованого префікса “VM” і нумератора з файлу “1”, після створення нумератор змінюється на “2”, тоді можна уникнути заповнення імен віртуалок при повторному запуску скрипта.
Навіщо нумератори, окремі файли? Мені здається, найпростіше Excel сформувати CSV і по ньому вже робити віртуалки. Принаймні це рішення більш універсальне. По-моєму так.
Unatended файл дозволяє задавати статику. Просто спосіб не зовсім секурний вийшов.
Дозволяти він дозволяє, але це ж доведеться генерувати сотню XML-ників, по одному для кожної віртуалки?
Коли мова про сотні віртуалок, то використання статики скидається на самобичування)))
@8 або на напади параної у безпечників 😉
І тим не менш, при всій дурості – доводиться з цим працювати 🙁
У нас був якось великий держзамовник і ми робили їм серверну для якогось страшно секретного обладнання. Так от, усю електроніку, яку ми там розміщували – кондиціонери, блок погодження, аждо пожежних сповіщувачів та датчиків диму – відправляли до якоїсь організації, де їх розбирали, фотографували у рентгені та перевіряли на відсутність “жучків”. При цьому вони погоджувалися на втрату гарантії. Так-то!
- Андрій Шимкін
- 24 April, 2012
Не знаю як у інших, у мене при читанні статті відразу ж виникло бажання записати вираз “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" в змінну, а вже потім її подавати в командлет.
підкажіть будь ласка як запустити подібний скрипт віддалено? на віддаленому сервері, на сервері встановлено SCVMM бажано запустити це скрипт з-під php
Думаю, Вам треба подивитися у бік SCVMM Self-Service Portal.
SCVMM і Self-Service Portal до нього налаштований і працює, але мені потрібно, щоб скрипт запускався на сервері SCVMM за подією та з параметрами з білінгу… білінг запущений на linux PHP
SCVMM і Self-Service Portal до нього налаштований і працює, але мені потрібно щоб скрипт запускався на сервері SCVMM за подією і з параметрами з білінгу ... білінг запущений на linux PHP