Задача
Необходимо развернуть сервер со следующими требованиями:
- Массив дисков RAID-10
- Full Performance in BIOS
- Windows Server 2012 с всеми обновлениями и патчами
- Это будущий сервер приложений со службами для которых необходим .net 4.5
- Мониторинг доступности сервера, а также CPU, Памяти и свободного места на диске
- Необходимо подключить сервер к системе выкатки релизов Octopus Deploy
Сложности
Основное требование здесь — все должно быть максимально автоматизировано, участие человека минимизировано до 1 минута «в начале» и 1 минута «в конце». Целью такой автоматизации является потенциальная необходимость «поднять» в дальнейшем несколько новых серверов достаточно быстро. Решение должно быть не сложным для восприятия младшими админами и разработчиками, в чьи обязанности развертывание серверов не входит.
Решение
Начнем с того, что все, что у меня сейчас есть — это работающий сервер, который подключен к сети. Я знаю его MAC-Адрес и будущее имя (app8). На нем нет ни операционной системы ни возможности вручную вставить диск. Да чего уж греха таить — диска с виндой у меня тоже нет!
Предстоит сделать следующее:
- Настроить параметры производительности BIOS
- Cоздать массив RAID-10
- Загрузится с PXE в загрузчик pxeboot.com
- Выбрать соответствующий загрузчик boot.wim и Выбрать требуемую операционную систему
- Создать логические диски C: и D:
- Произвести установку операционной системы на диск C:
- Произвести конфигурацию сервера под требуемые задачи при помощи puppet
Наши сервера находятся на колокейшене, который физически далеко, поэтому буду использовать WDS и IP KVM. Доступ к KVM осуществляется через веб интерфейс, сам удаленный «экран» реализован при помощи java-based приложения. По большому счету IP KVM уже не обязателен, т.к. все мои развертывания происходят практически автоматически, но старая привычка наблюдать за происходящим на экране осталась, да и заводские настройки железа не всегда совпадают с требуемыми.
Пока что на сервере ничего нет:
Заходим в BIOS (F2) и настраиваем параметры производительности. Разница между Performance и Performance Per Watt в том, что при использовании Perormance Per Watt сервер автоматически снижает энергопотребление компонентов при простое. Нам такое поведение не нужно, потому что от пониженного энергопотребления мы ничего не выигрываем, а вот от задержки производительности как раз наоборот проигрываем (в тот момент, когда сервер понимает что пора работать на полную мощность но еще не отключил пониженное энергопотребление).
При заказе серверов на сайте Dell также можно заказать сервер с требуемой конфигурацией RAID. Этот конкретный сервер пришел с RAID5, поэтому придется менять конфигурацию. Заходим в утилиту настройки RAID нажатием Ctrl+R на этапе загрузки и создаем массив RAID10 из 4х дисков по 1ТБ, что в итоге дает 2 ТБ «места» для данных. Write-Back и Adaptive Read Ahead — то что нам нужно, оставляем по умолчанию:
Также можно процесс создания верного RAID автоматизировать на этапе установки ОС, используя кастомный загрузчик (будь то WinPE или установщик Linux). Если кто это делал на DELL системах буду рад если поделитесь опытом — самому на это, к сожалению, просто нет времени.
Далее на DHCP задается ip адрес будущему серверу, дается имя. MAC Адрес мне известен, т.к. при приемке оборудования мы фиксируем эту информацию. Как вариант, MAC Адрес можно подсмотреть при загрузке сервера, либо попросить персонал NOC в ДЦ посмотреть его на самом сервере.
Далее в «Address Leases» разешаем доступ к серверу DHCP:
Перезагружаем сервер, входим в режим загрузки PXE, после чего нужно подтвердить сервер в WDS, назначить ему имя, а также можно указать загрузчик (pxeboot.com в данном случае). Это действие позволит применить правильную конфигурацию, а также внести сервер в домен, при правильной настройке unattend.xml.
Не забудьте указать в unattend.xml имя и пароль пользователя, который имеет права добавления компьютеров в домен. У меня эти права делегированы специально-созданному для этого сервисному пользователю. Раньше я вручную редактировал unattend.xml, пока не появился Windows AIK (в его предыдущих инкарнациях) — сейчас его можно скачать с официального сайта Microsoft.
После разрешения доступа сервер загружается в соотвествующий загрузчик, где происходит выбр boot образа, а затем и образа самой системы. Я выбираю обновленный образ Server 2012 Standard, который я создал здесь. Boot образ также можно выбрать на этапе подтверждения сервера (там же, где Вы выбираете файл unattend.xml). Необходимо отметить, что boot образ должен содержать соответствующие драйвера контроллера диска и сетевой карты чтобы работать корректно (для Dell — все драйвера находятся на диске OpenManage, их нужно распаковать с помощью специальной утилиты, которая находится там же). Если кому-то интересно как я это делал — дайте знать, буду рад поделиться.
Интересно заметить, у меня есть пара конфигураций с полностью unattended установкой, но я почему-то их не использую, думаю масштаб компании еще не тот, чтобы так сильно типизировать конфигурации Windows серверов — постоянно что-то отличается. (К слову, также есть kickstart конфигурации для Linux, которые использую гораздо чаще, т.к. в основном это кластерные типовые конфигурации).
Итак, настало время выбрать конфигурацию жесткого диска, я ставлю 250G на диск C а остальные 1600G на DATA раздел. Все, процесс пошел. «Можно откинуться на спинку кресла, пока Windows будет устанавливаться на Ваш компьютер» (помню как в полной темноте моя комната была освещена синим цветом света установщика Windows 98...)
Пока ставилась винда я вспомнил что в образе у меня есть сервер VNC, который запускается сразу же после инициализации сети в Windows PE. Жалко так и не смог найти нормальный syslog клиент для урезанной WindowsPE — хочу знать когда VNC стартует, может кто знает?
На этом этапе также выполняются стадии unattend.xml, в том числе регистрация агента puppet.
<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>
Итак, винда загрузилась — проверяем доступность (вручную или автоматически), не забываем перезагрузить зоны и очистить dns cache. Eсли откликается по доменному имени — то сервер добавился в домен (если нет — идем на сервер и проверяем что ему не хватет). Ну все, можно приступать к волшебству puppet, так как puppet agent уже должен быть установлен на стадии Microsoft-Windows-Deployment / RunSynchronous.
Подтверждаем сертификат на сервере puppet master, после чего видим такую картину в TheForeman:
Это означает, что наш новый сервер готов к «посвящению» и мы можем применять необходимые нам классы (packages::opsview, packages::octopus-tentacle, packages::logstash::client и любые другие). Заходим в настройки сервера в панели управления TheForeman и выбираем что необходимо:
Вся прелесть puppet в том, что это система управления конфигурации и оркестрации, то есть не важно в каком состоянии находится система сейчас, он должен сделать все, чтобы привести ее к тому состоянию, которое Вы указали. Поэтому, например, для packages::octopus-tentacle он установит необходимые фреймворки, установит пакет, а также в моем случае произведет регистрацию «агента-шупальца» (tentacle) на сервере octopus, и останется только назначить соответствующие группы/проекты на этот сервер (что будем деплоить) — все это конфигурируется Вами, но об этом в другой раз.
Если позволяет время — я люблю запускать puppet agent первый раз вручную прямо на сервере чтобы не ждать очередного puppet run:
puppet agent --test --debug
После завершения puppet run:
- Установится агент Opsview (основан на NSClient)
- Произведется настройка сервера мониторинга Opsview (пост на хабре)
- Установится и сконфигурируется агент Logstash (ждите пост на хабре, а пока ссылка на демо)
- Установится агент Octopus Deploy и призойдет регистрация агента
Все!
Заключение
Когда я вспоминаю как проходил процесс развертывания сервера вручную — меня берет дрожь. Это CD/DVD диски, это 2 дня (если неспешно, в фоновом режиме) или 1 день (если сфокусироваться и ничего больше не делать) — вот сколько уходило времени! Каждый раз приходилось обновлять систему до актуального состояния. Ведь это работает как «установил, перезагрузил, установил, перезагрузил»… А если это 10 или 20 или 100 серверов? Про мелкие настройки и твики вообще молчу.
Я знаю что это делается проще и удобнее с MS SCCM, установка софта — через group policy, и может я бы так и сделал, если бы не смешанность среды, где Windows мирно живет с Linux под присмотром одного единственного IT отдела. Puppet — это, на мой взгляд, универсальное средство. Puppet спасает мне жизнь, а также я приучаю к его использованию наших разработчиков (а они — C# ребята). К числу преимуществ относится то, что конфигурационный манифест puppet — это программный код, который можно хранить в системе контроля версий (git, например), а также легко распространять! (дискуссии по поводу IaaC приветствуются). Я не знаю альтернатив, которые могли бы объединить всевозможные породы ОСей из гетерогенной среды в одно единое описание инфраструктуры, а Вы? Также я не знаю удобной системы от Microsoft которую можно было бы хранить под Source Control и удобно распространять. Если кто что знает — буду рад услышать в комментах.
За сим откланиваюсь, пора делать другие дела!
Автор: kireevco