Автоматизированная установка Centos с использованием PXE и kickstart

Статья в процессе доработки.

Имеется несколько серверов, которые будут выполнять одинаковые функции для работы с оборудованием. На всех должна стоять одинаково настроенная ОС - Centos. Можно настраивать по отдельности каждый сервер, но это однообразно и утомительно, поэтому есть смысл использовать автоматизированную установку с использованием PXE.
Мануал об установке системы с помощью PXE для RHEL - https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6...
Спецификация PXE - http://www.pix.net/software/pxeboot/archive/pxespec.pdf
Порядок загрузки с использованием PXE хорошо описан тут - https://docs.oracle.com/cd/E24628_01/em.121/e27046/appdx_pxeboot.htm#EML...
подробно тут - http://www.syslinux.org/wiki/index.php?title=PXELINUX#Configuration_file...
Вкратце:
1. Компьютер( клиент) загружается с указанием в качестве способа загрузки PXE
2. Сетевой адаптер клиента отправляет DHCP запрос.
3. DHCP сервер получает запрос и отправляет ответ со стандартной информацией о IP адресе, маске сети, шлюзе, DNS... Дополнительно он предоставляет информацию о расположении TFTP сервера и загрузочного образа (pxelinux.0).
4. После получения информации клиент соединяется с TFTP сервером для получения загрузочного образа.
5. TFTP сервер отправляет загрузочный образ (pxelinux.0), который затем выполняется на клиенте.
6. По умолчанию, загрузочный образ ищет каталог pxelinux.cfg на TFTP сервере для получения загрузочного конфигурационного файла в следующем порядке:
Сначала ищется загрузочный конфиг файл с именем, соответствующим MAC адресу собственно загружаемой машины, записанному в нижнем регистре с разделителями "-", например, для машины с МАС "88:99:AA:BB:CC:DD" имя файла дожно быть 01-88-99-aa-bb-cc-dd ( обратите внимание на 01 в начале имени файла )
Затем - процитирую :
Then, it searches for the configuration file using the IP address (of the machine that is being booted) in upper case hexadecimal digits. For example, for the IP Address "192.0.2.91", it searches for the file "C000025B".
If that file is not found, it removes one hexadecimal digit from the end and tries again. However, if the search is still not successful, it finally looks for a file named "default" (in lower case).
Т.е. если ничего не найдено, то ищется файл с именем default.
7. Клиент загружает необходимые файлы с TFTP сервера: ядро и корневую файловую систему ( vmlinuz, initrd.img ) и выполняет их. Дополнительно в загрузочном конфиг файле может быть указано расположение файла автоматической установки kickstart ( касаемо Centos ).
Файл kickstart содержит описание всех опций установки, которые считываются с него для проведения установки в автоматическом режиме и должен быть создан заранее.
Таким образом, для моего случая с полутора десятками серверов необходимо поднять отдельный сервер (хотя бы виртуальный ) с dhcp, tftp и, например, http. В настройках dhcpd указать ip адрес tftp сервера и имя файла загрузочного образа pxelinux.0. Поместить на tftp сервер сам загрузочный образ, конфигурационный файл, ядро и корневую файловую систему ( берем из файлов установочного образа ОС). В каталог веб-сервера поместить все файлы из установочного образа ОС.
Для автоматизации установки на множестве серверов создать для каждого из них файл kickstart - ks_xx.cfg, путь к которому указать в конфигурационном файле для pxelinux.0 для каждого сервера. Имя конфигурационного файла для каждого сервера сделать в соответсвии с его МАС адресом, см. выше.
Настроил все на виртуальной машине ip=192.168.0.81, чтобы с нее производить загрузку при установке ОС на серверах. Получилось так:
Мой конфиг dhcpd под Centos 6:

# dhcpd.conf
# Sample configuration file for ISC dhcpd
#
allow booting;
allow bootp;
option domain-name "pxe.local";
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;
subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.177 192.168.0.200;
  option routers 192.168.0.1;
#####взято отсюда- https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3...
class "pxeclients" {
   match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
   next-server 192.168.0.81;
         filename "pxelinux.0";
         }
}

Не забыть проверить наличие других dhcp серверов в сети и открыть в iptables 67 udp порт на котором работает dhcpd, вставив в нужное место правило, в моем случае это 5-е правило
iptables -I INPUT 5 -p udp -m udp --dport 67 -j ACCEPT

tftp сервер поставил такой- tftp-server
Его конфиг /etc/xinetd.d/tftp , в котором нужно изменить строку

 disable    yes
на
disable    no

после чего запустить xinetd и не забыть открыть в iptables 69 udp порт на которм работает tftp сервер аналогично тому как указано выше.
httpd ставим как обычно, указываем servername, открываем порт 80 tcp в iptables.
Для всех демонов не забываем указать chkconfig - on для автоматического запуска при загрузке системы.
Отключаем selinux. В /etc/sysconfig/selinux изменяем SELINUX на disabled
Далее содержимое tftp сервера:
ls -lR /var/lib/tftpboot
.:
total 43936
-r--r--r--. 1 root root 40688737 May 22 09:06 initrd.img
-rw-r--r--. 1 root root    26759 Oct 15  2014 pxelinux.0
drwxr-xr-x. 2 root root     4096 Oct  7 17:06 pxelinux.cfg
-r-xr-xr-x. 1 root root  4264528 May 22 09:06 vmlinuz

./pxelinux.cfg:
total 4
-rw-r--r--. 1 root root 202 Oct  7 17:06 default

Здесь
pxelinux.0 - взято из /usr/share/syslinux, если его нет, то yum install syslinux
initrd.img и vmlinuz взяты из установочного дистрибутивного образа , в моем случае это ОС Centos6.8 и образ CentOS-6.8-x86_64-minimal.iso
Монтируем его и копируем нужные файлы
 mount -t iso9660 -o loop CentOS-6.8-x86_64-minimal.iso /mnt
cp /mnt/images/pxeboot/initrd.img /var/lib/tftpboot/
cp /mnt/images/pxeboot/vmlinuz /var/lib/tftpboot/

пример простого конфига для загрузки одной машины
cat /var/lib/tftpboot/pxelinux.cfg/default
default install
prompt 1
timeout 60
label install
  menu label ^Install or upgrade an existing system
  menu default
  kernel vmlinuz
  append initrd=initrd.img ks=http://192.168.0.81/centos6.8/ks.cfg

здесь параметр ks задает адрес с файлом kickstart - ks.cfg

Далее нужно скопировать содержимое дистрибутивного образа на http сервер(можно использовать ftp, nfs )

cp -R /mnt/* /var/www/html/centos6.8/
cp -R /mnt/.[^.]* /var/www/html/centos6.8/

И создать файлы ksxx.cfg для всех серверов
пример простого файла для одного сервера

cat /var/www/html/centos6.8/ks.cfg
install
url --url=http://192.168.0.81/centos6.8/
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto static --ip 192.168.0.201 --netmask 255.255.255.0 --gateway 192.168.0.1 --noipv6 --nameserver 8.8.8.8
rootpw  --iscrypted $6$y...................ZApPuOCX5oAtLXajGmA3KDsu6R8qYdhG5DLUSH1vl65JnvYTECW5U9ZHtNyzxyIwMLjLQhmtHVJgTrWVlJ1
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone Europe/Moscow
bootloader --location=mbr --driveorder=sda,sdb --append="crashkernel=auto rhgb quiet"

clearpart --all
part raid.swap_sda --size=500 --ondisk=sda
part raid.sda_boot --size=500 --ondisk=sda
part raid.sda --grow --size=199 --ondisk=sda

part raid.swap_sdb --size=500 --ondisk=sdb
part raid.sdb_boot --size=500 --ondisk=sdb
part raid.sdb --grow --size=199 --ondisk=sdb

raid swap --fstype=swap --level=1 --device=md0 raid.swap_sda raid.swap_sdb
raid /boot --fstype=ext4 --level=1 --device=md1 raid.sda_boot raid.sdb_boot
raid pv.pv1 --fstype=ext4 --level=1 --device=md2 raid.sda raid.sdb

volgroup vg1 pv.pv1
logvol / --vgname=vg1 --size=500 --grow --name=root

repo --name="CentOS"  --baseurl=http://192.168.0.81/centos6.8/ --cost=100

%packages --nobase
@core
%end

Полезные ссылки:

Генерация хеша пароля, например
https://docs.fedoraproject.org/en-US/Fedora//html/Installation_Guide/sec...

Настройка dhcp
http://www.rhd.ru/docs/manuals/enterprise/RHEL-4-Manual/sysadmin-guide/s...
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6...

Опции kickstart
https://www.centos.org/docs/5/html/5.2/Installation_Guide/s1-kickstart2-...
Пример по разметке дисков
https://www.centos.org/docs/5/html/5.2/Installation_Guide/s2-kickstart2-...

Если нужно выполнить какие-либо команды после установки, например, скрипт с командами,
см https://www.centos.org/docs/5/html/Installation_Guide-en-US/s1-kickstart...
http://stackoverflow.com/questions/31023115/how-to-execute-script-after-...