Введение
Рано или поздно каждой серьезной компании приходится задумываться о легализации своей IT инфраструктуры. Возьмем среднюю по масштабам компанию N. Центральный офис, 30 небольших филиалов. Везде стоят рабочие станции под Windows, в основном XP. На более свежих машинах, ноутбуках, встречаются windows 7 и 8, на серверах 2k3, 2k8, ubuntu-server.
Расширяется компания не слишком большими темпами, и немногочисленный отдел IT успевает новые машины накатывать из заранее созданных образов Acronis'ом. Но в целях уменьшения затрат/легализации инфраструктуры/очистки совести принимается решение перейти на opensource. Тут уже другой масштаб трагедии, переустанавливать руками множество рабочих станций — процесс долгий и неблагодарный. Под катом — один из вариантов решения данной проблемы.
1. Инструменты и установка требуемых пакетов.
Решено было устанавливать Ubuntu 12.04.3 LTS с помощью PXE. В качестве инструментов реализации были выбраны cobbler и puppet.
Сobbler — сервер сетевой установки для Linux, обеспечивающий быстрое построение необходимой среды развертывания и управления процессом инсталляции ОС на новые компьютеры или виртуальные машины (Xen, qemu, KVM или VMware Server), так и последующей переустановки систем.
Написан Сobbler на Python и является связкой для некоторых стандартных для таких случаев компонентов PXE, TFTP, DHCP и других.
Установим нужные нам пакеты:
sudo apt-get install cobbler cobbler-common cobbler-web dhcp3-server xinetd tftpd tftp debmirrorПо умолчанию получим cobbler версии 2.2.3, что не совсем хорошо. Почему — узнаем дальше.
Затем проверим, все ли устраивает наш cobbler:
sudo cobbler checkНа что в ответ должны увидеть:
No configuration problems found. All systems go.Синхронизируем конфигурацию:
sudo cobbler syncТеперь cobbler готов к дальнейшей настройке.
2. Настройка Cobbler
Изменим конфигурацию cobbler, указав сетевые настройки сервера, на котором он установлен:
sudo dpkg-reconfigure cobblerУкажем адрес сервера в сети, пароль для web-интерфейса cobbler’а.
Настроим cobbler на использование DHCP:
sudo nano /etc/cobbler/settingsизменим
manage_dhcp: 0наmanage_dhcp: 1Перезагрузим и синхронизируем конфигурацию cobbler:
sudo service cobbler restart
sudo cobbler syncИзменим шаблон DHCP, который cobbler будет передавать isc-dhcp-server:
sudo nano /etc/cobbler/dhcp.templateПриводим к виду:
subnet 192.168.1.0 netmask 255.255.255.0 { #подсеть
option routers 192.168.1.254; #адрес шлюза
option domain-name-servers 192.168.1.254; #адрес DNS сервера
option subnet-mask 255.255.255.0; #маска
range dynamic-bootp 192.168.1.10 192.168.1.20; #диапазон раздаваемых IPИ снова перезагружаем cobbler:
sudo service cobbler restart
sudo cobbler syncТеперь cobbler готов к импорту Вашего ISO файла, но тут, как и обещал, объясню ситуацию с некоторыми нюансами cobbler 2.2.3.
Собственно, нюансы.
Первыми граблями, на которые въехал мой велосипед, стал факт, что я не мог импортировать образ desktop версии. После импорта в cobbler его не было видно в списке возможных для установки дистрибутивов. После гугления форумов наших заокеанских друзей – оказалось, что нужно использовать alternate, server, mini версии дистрибов Ubuntu, desktop cobbler попросту не видит(хотя есть какие-то workaround, но мне было проще скачать alternate). Так же, особенностью версии 2.2.3 является то, что он не создает локального дистрибутива с вашего образа, при установке подгружает только ядро, все остальные пакеты качает с репозиториев в интернете. Как минимум так было с образом lubuntu-12.04-alternate-i386. В версии 2.4 создается локальный дистриб, и пакеты ставятся непосредственно с вашего ISO-образа.
Продолжим
Смонитруем наш образ и импортируем его в список дистрибутивов cobbler:
sudo mount -o loop lubuntu1203.iso /mnt
sudo cobbler import --name=lubuntu-12-4 --path=/mnt --breed=ubuntuПакет cobbler-web мы ставили не зря. Можем обратиться к его web-интерфейсу по адресу: 192.168.1.2/cobbler_web
Тут можно настроить много полезных вещей, добавить свои дистрибутивы, пакеты, репозитории, профили и прочее. Наша задача – настроить импортированный нами профиль. Переходим в Profiles, где видим lubuntu-12-4, жмем Edit. Тут наша задача – добавить kickstart

Уже на последнем этапе, при установке Ubuntu на клиентской машине, наткнулся на ошибку “Bad Archive Mirror An error has been detected while trying to use the specified archive mirror”.
Решается ко��ированием и переименованием kickstart файла
/var/lib/cobbler/kickstarts/ubuntu-server.preseedв/etc/cobbler/precise.ubuntu.alternate.lan.preseedВ нашем профиле путь к kickstart пропишем в соответствующем месте:

3. Puppet
На puppet была возложена функция тонкой настройки машин. В рассмотренном мной примере будет проверяться наличие некоторых пакетов на клиентской машине, и их установка, в случае отсутствия.
Установим puppet на сервере:
sudo apt-get install puppetmasterИ на клиенте:
sudo apt-get install puppetДля удобства, кстати, в /etc/cobbler/settings есть параметр puppet_auto_setup, который ставит puppet автоматически, но требует иметь локальную копию EPEL на своем сервере. Либо я не до конца понял, либо затея действительно глупая, но все можно реализовать через post-install script в самом cobbler куда проще.
Подразумевается, что машины получают свои имена от DNS, в ином случае, придется настроить файлы hosts на клиенте и сервере puppet соответственно.
192.168.0.1 puppetmaster.example.com puppetmaster puppet
192.168.0.10 puppetclient.example puppetclientСоздадим манифест /etc/puppet/manifests/site.pp следующего содержания(пакеты выбраны для примера, для детальной настройки puppet следует обратиться к его документации):
$base_packages = [
“gnome”,
“mc”,
“openssh-server”,
“vim”
]
package { $base_packages:
ensure => installed
}Финальным шагом для этого простого Puppet сервера является перезапуск сервиса:
sudo /etc/init.d/puppetmaster restartТеперь можем запросить сертификат с клиента:
puppet agent --server puppetmaster --waitforcert 60 --test
info: Creating a new SSL certificate request for puppetclientПросмотрим запрос на подпись сертификата на сервере:
puppet cert --listТеперь мы должны увидеть запрос от клиента, подпишем:
puppet cert --sign puppetclientПри первой попытке соединения с сервером puppet выдал ошибку, что имя сервера в сертификате не соответствует имени, к которому был запрос, нужно отредактировать
/etc/puppet/puppet.conf[master]
certname=puppetmasterВот и все, клиентская машина будет ставить указанные в манифесте пакеты.
Заключение
Данный процесс может незначительно отличаться на разных дистрибутивах. Может понадобиться создать недостающую папку, о чем будет явно прописано в консоли. Так же не удалось побороть зависание в начале установки, минут на 15, может показаться, что машина просто зависла. Насколько мне удалось узнать, выполняется deduplicate. Тоже часто встречающийся баг, описанный в баг-трекерах. Почему, отчего – возможно кто-то подскажет именно здесь. Критика, советы, исправления – приветствуются.
