Skip to main content

Подготовка и установка CentOS

Понадобилось мне на работе реализовать автоматическую установку серверов, чистых, без дополнительного ПО, на базе ОС Ubuntu, CentOS и Debian, однако инфы по этому довольно мало. Еще одна статья не помешает.

Подготовка

Настраивать PXE сервер будем на базе Ubuntu 20.04.

Для установки потребуются следующие пакеты:

  • DHCP сервер (isc-dhcp-server), чтобы сказать биосу, что грузить по сети и выдать адрес
  • TFTP (tftp-hpa) сервер, чтобы подать биосу файлы загрузчика
  • PXELinux (pxelinux) - PXE загрузчик ОС (файлы по пути /usr/lib/PXELINUX)
  • Nginx (или Apache), чтобы подавать файлы ядра, системы, репозитории и т.д.

В случае с CentOS/Ubuntu необходимо также примонтировать ISO образ в папку (пусть будет /srv/tftp/iso), откуда будет грузиться ОСЬ. В случае с дебианом надо распаковать netboot установщик в папку.

У нас к серверу подключается 2 линка - один с выходом в интернет и без DHCP, а второй для загрузки по PXE и установке ОС. Впринципе можно адаптировать и под другую конфигурацию.

Конфигурируем DHCP

Указываем путь до файла загрузчика, указываем подсеть, из которой надо выдавать IP адреса:

$ cat /etc/dhcp/dhcpd.conf 
allow bootp;
allow booting;
max-lease-time 1200;
default-lease-time 900;
log-facility local7;

option ip-forwarding    false;
option mask-supplier    false;

   subnet 10.0.1.0 netmask 255.255.255.0 {

       option routers 10.0.1.30;
       option domain-name-servers 127.0.0.1;
       range 10.0.1.20 10.0.1.26;
       next-server 10.0.1.1;
       filename "pxelinux.0";
   }

Конфигурируем TFTP

Указываем путь до папки TFTP:

$ cat /etc/default/tftpd-hpa 
# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"

Конфигурируем Nginx

Надо, чтобы он отдавал файлики по IP адресу PXE сервера, создаем конфиг:

$ cat /etc/nginx/sites-enabled/default 
server {
	listen 80 default_server;
	listen [::]:80 default_server;

	root /srv/tftp;

	index index.html;

	server_name _;

	location / {
                autoindex on;
                try_files $uri $uri/ =404;
	}

}

Настраиваем загрузчик

Копируем файл загрузчика по пути /usr/lib/PXELINUX/pxelinux.0 в /srv/tftp. Создаем конфиг для загрузчика по пути /srv/tftp/pxelinux.cfg/default. Можно также создавать файлы для конкретного MAC адреса (/srv/tftp/pxelinux.cfg/01-88-99-aa-bb-cc-dd). Конфиг:

$ cat pxelinux.cfg/default 
timeout=1
default 1

LABEL 1
    kernel http://10.0.1.1/CentOS-7/images/pxeboot/vmlinuz
    initrd http://10.0.1.1/CentOS-7/images/pxeboot/initrd.img
    append ip=::::server::dhcp inst.ks=http://10.0.1.1/centos.cfg inst.repo=http://10.0.1.1/iso ---

Где inst.ks - путь до Kickstart конфига, а inst.repo - путь до репозитория (примонтированного образа).

Готовим CentOS 7/8

На деле самая простая и дружелюбная в автодеплое ОСь. Необходимо примонтировать в /srv/tftp/iso полный DVD образ установщика и создать Kickstart файл /srv/tftp/centos.cfg. Kickstart:

$ cat centos.cfg 
#version=Centos7
auth --enableshadow --passalgo=sha512
install
reboot --eject
eula --agreed
url --url="http://10.0.1.1/iso"

# Use graphical install
#graphical
# Use text mode install
text

keyboard --vckeymap=us --xlayouts='ru','us' --switch='grp:alt_shift_toggle'
lang en_US.UTF-8 --addsupport=ru_RU.UTF-8
timezone Europe/Moscow  --isUtc --ntpservers=ntp2.stratum2.ru,ntp5.stratum2.ru
firstboot --disable

# Внешний мир
network  --bootproto=static --device=00:11:22:33:44:55 --gateway=192.168.100.1 --ip=192.168.100.252 --nameserver=8.8.8.8 --netmask=255.255.255.0 --activate
# Интерфейс PXE
network  --bootproto=dhcp --device=55:66:77:88:99:00 --ipv6=auto --activate
network  --hostname=coolserver

# Users
#dedic
rootpw --iscrypted PASSWORD
sshkey --username=root "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3b......"


### Partitioning
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda

ignoredisk --only-use=sda,sdb
clearpart --all
part raid.sda1 --size 512 --asprimary    --ondrive=sda
part raid.sdb1 --size 512 --asprimary    --ondrive=sdb

part raid.sda2 --size 10240 --grow    --ondrive=sda
part raid.sdb2 --size 10240 --grow    --ondrive=sdb

raid /boot     --fstype ext4  --device md0  --level=RAID1 raid.sda1 raid.sdb1
raid /     --fstype ext4  --device md1  --level=RAID1 raid.sda2 raid.sdb2

### Packages

%packages
@^minimal
@core
%end

%addon com_redhat_kdump --disable --reserve-mb='auto'
%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

Обратить внимание следует на настройку сети и реквизиты. Будет создано 2 раздела: /boot на 512 Мб и / на все оставшееся место. Также можно добавить в конце дополнительные команды в раздел %post, например:

%post
/usr/bin/sed -i "s%#Port 22%Port 43389%g" "/etc/ssh/sshd_config"
/usr/bin/sed -i "s%#PermitRootLogin yes%PermitRootLogin no%g" "/etc/ssh/sshd_config"
%end

Пароль можно сгерерировать таким образом: python -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'

Готово!

ACHTUNG! ACHTUNG! При загрузке установщик не будет спрашивать дополнительное подтверждение, диски сразу же затрутся.

pxeboot

SRC

  • http://www.bog.pp.ru/work/kickstart.html
  • https://www.golinuxhub.com/2018/05/sample-kickstart-partition-example-raid/
  • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-howto
  • https://docs.centos.org/en-US/centos/install-guide/Kickstart2/