Задача
В своей работе я использую образы Windows Image — всем известные WIM файлы. Подход, которым я хочу сегодня поделиться, прямо противоположен созданию универсального образа с полным наборам софта и сервисов. Ключевым отличием от «Толстого — Thick» подхода является то, что они что в нем находится минимум — только то, что необходимо для запуска puppet agent и дальнейшей установки необходимого софта. Для установки софта я использую chocolatey, все пакеты берутся с chocolatey.org, а для кастомных пакетов имеется репозиторий на сервере в датацентре). Все остальное — ставится потом, в зависимости от требований конфигурации сервера. На мой взгляд это добавляет намного больше гибкости, и все что нужно, фактически, добавлять сервис паки и большие обновления. И вот сегодня — как раз тот день: «Пора бы обновить образ». Если говорить точнее, то сегодня нужно создать образ с нуля для Windows Server 2012 Standard с определенного ISOшника.
Сложности
Сложностей как таковых здесь нет, единственное что принципиально для меня — все должно быть просто, чтобы через год я (или кто-то из моих админов) открыл свой, прочел короткое README и все понял.
Реализация
На том же сервере, где располагается WDS добавлена роль Hyper-V, на котором есть несколько виртуальных машин, предназначенных специально для этого. В даном случае виртуалка с именем «server-2012-std-img» на которой «голая» версия Server 2012 Standard. Снимать образы с виртуалок намного проще, т.к. можно средствами windows примонтировать vhd и сделать wim capture прямо с примонтированного диска. При данном подходе нет необходимости перезагружать реальный сервер.
Настройка образа
Делаем апдейты. Для установки апдейтов в образ пользуюсь триалом wuinstall. Каждый раз приходится загружать заново (ссылка), т.к. срок триала по все видимости зашит в exe файле. Мысли вслух: Надо бы сделать package для chocolatey для wuinstall, тогда будет возможность автоматизировать установку апдейтов, сделать подарочек моему админу по офису...
There's more than one way to do it
Знаю что можно использовать оффлайн апдейты скачанные через wsusoffline, и делать так называемое «Оффлайн обслуживание образа», но в моей ситуации это не подходит во-первых из-за наличия на 70% серверов Server 2008 (не R2), который сильно отличается (в худшую сторону) от R2 и 2012 по управлению пакетами и функционалу offline servicing. А так как я люблю унификацию процессов где это возможно, делаю это через wsusoffline. К тому же интеграция сервис пака часто не работает через offline servicing. Может кто-то знает, где Microsoft хранит WIM или ISO файлы дистрибутивов с последними обновлениями?
Кстати, я не включаю драйвера в сам образ системы, т.к. они берутся из сетевой папки, которая указывается в unattend.xml конфиге, а папка находится в доступном для установщика Windows месте. Не забудьте удостовериться в правах доступа к Вашей папке с драйверами (которые должны быть, естественно, распакованы с доступными файлами inf).
<settings pass="offlineServicing">
<component name="Microsoft-Windows-PnpCustomizationsNonWinPE" 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">
<DriverPaths>
<PathAndCredentials wcm:action="add" wcm:keyValue="1">
<Credentials>
<Domain>mydomain</Domain>
<Password>wds-password</Password>
<Username>wds-user</Username>
</Credentials>
<Path>\wds-server.mydomain.localREMINSTDrivers</Path>
</PathAndCredentials>
</DriverPaths>
</component>
</settings>
Установка Chocolatey — процесс достаточно простой, главное удостоверьтесь что у Вас стоит фреймворк 3.5.
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%chocolateybin
Все, настройка образа на этом закончился. Пора его создать!
Создание образа
::Config file that contains some paths and date patterns
call config.cmd
SET mountdrive=H
echo Creating image %captured_wims%server-2012server-2012x64.standard.sp2.%date%.%RANDOM%.install.wim
utilsimageximagex.exe /capture %mountdrive%: %captured_wims%server-2012x64.standard.sp2.%date%.%RANDOM%.install.wim " Windows Server 2012 SERVERSTANDARD"
Процесс создания образа Server 2012 Standard со всеми апдейтами занимает около 20 минут на виртуальной машине, на живом сервере, конечно быстрее, но не так удобно. Я не сильно переживаю по этому поводу, т.к. процесс это в большинстве случаев плановый.
Долго-ли коротко-ли, образ создался, скрипт положил его куда надо, назвал как надо — теперь я его беру и добавляю в WDS сервер. Готово!
Забегая вперед скажу, что puppet agent нужно будет установить при первой загрузке новой системы, которую мы будем разворачивать на новом железе, а нужно это для того, чтобы сервер стал доступен для настройки при помощи манифестов puppet. Сделать это можно и вручную, но можно и автоматически.
cinst puppet -ia "PUPPET_MASTER_SERVER=puppet.mydomain.local"
Да, да, если кто не знаком с chocolatey, очень советую испытать эту радость.
В данном случае установится последняя версия этого пакета puppet, которая зарегистрируется на сервере puppet.mydomain.local.
<component name="Microsoft-Windows-Deployment" 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">
<RunSynchronous>
<RunSynchronousCommand wcm:action="add">
<Order>1</Order>
<Description>Install Puppet</Description>
<Path>cinst puppet -ia "PUPPET_MASTER_SERVER=puppet.mydomain.local"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>2</Order>
<Description>Request Certificate</Description>
<Path>("C:Program Files (x86)Puppet LabsPuppetbinpuppet_interactive.bat" --test) && echo OK</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>3</Order>
<Description>Stop Puppet Service</Description>
<Path>(sc stop puppet) && echo Service Stop OK</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>4</Order>
<Description>Start Puppet Service</Description>
<Path>(sc start puppet) && echo Service Start OK</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
Заключение
Таким образом, система пакетов Chocolatey заменяет множество индивидуальных конфигураций, и сильно помогает автоматизировать установку, вместе с тем обеспечивая гибкость конфигурирования (помните, Вы не обязаны использовать chocolatey.org в качестве источника пакетов). Использование менеджера пакетов при развертывании Windows Server, по моему мнению, еще один этап на пути к переносу инфраструктуры на IaaC, а выбор между «Тонким» и «Толстым» образами — ключевым в данной ситуации.
В моей сети Windows и Linux работают в тесной связке друг с другом, поэтому я по возможности стараюсь найти универсальные OpenSource решения, которые будут работать на обоих платформах. Я совершенно не оспариваю факт что SCCM — прекрасный продукт для подготовки, поддержки и развертывания Windows, но он официально не поддерживает Linux (пруф) — а это значит что за Ваши деньги, заплаченные за SCCM, с интеграцией придется разбираться самому. К тому же, Open Source делает нашу жизнь лучше!
А как Вы решаете вопросы гетерогенности инфраструктуры? Очень буду рад услышать Ваше мнение, уважаемый Хабр!
Автор: kireevco