Якщо ви чули про 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 етапи:
- Власне створення віртуалок
- Введення в домен - віддалено, за допомогою утиліти 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, щоб виртуалка запустилася автоматично відразу після створення.
Введення в домен
Отже, виртуалка створилася і запустилася. Можна зайти на неї і подивитися, що мережеві настройки застосувались (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% ні з виртуалки, а з тієї ОС, де ця команда виконувалася. Щоб команда відпрацювала коректно, ми зробимо так:
- Створюємо * .cmd-файл
- Розміщуємо в нього команду netdom join ... (далі по тексту)
- За допомогою 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
}
Після відпрацювання цього скрипта всі наші віртуальні машини зі списку будуть введені в домен. Вітаю, ви виконали цей квест!
PS Знаю, що в скрипти ще багато чого можна додати - запис в лог, наприклад, або в другому скрипті обійтися без CMD-шника, а брати computername з CSV, і напевно багато іншого - тим не менш, напрямок куди копати я задав. Якщо комусь стати в нагоді в роботі - буду радий. Коментарі, зрозуміло, вітаються.
Олександр Косівченко,
MVP: VM
Як це зробити?