Назад | Перейти на главную страницу

Я не умею писать сценарии ... Как лучше всего обновить IP-адрес на сервере debian, работающем в режиме реального времени из PXE (резервирование DHCP не вариант)

На данный момент это больше мозговая свалка, чем что-либо еще, но я застрял, и помощь будет признательна!

У меня действительно сложный набор ограничений на 3 из моих серверов, которые требовали запуска ОС с RAM-диска. Короче говоря, у меня есть группа блейд-серверов с 4 жесткими дисками в каждом. Мне нужно запустить серверное приложение под названием MinIO в распределенном режиме. Для распределенного режима MinIO требуется 3 узла с 4 чистыми жесткими дисками на каждом. Это означает, что в лезвиях недостаточно жестких дисков. Есть варианты обхода этой ситуации, но по причинам, которые мы не будем здесь вдаваться, мы не можем этого сделать. Мне было поручено загрузить эти серверы с RAM-диска ... В конце концов, я заставил его работать с использованием FOG (в основном, просто загрузка PXE и ​​загрузка файла squashfs с корневой файловой системой по сети).

На данный момент самое сложное сделано. серверы загружаются, и я просматриваю файл squashfs, который они используют для настройки MinIO. Однако я столкнулся с загвоздкой с некоторыми постоянными настройками. По сути, мне нужен способ для трех серверов установить свои статические IP-адреса на основе MAC-адресов их сетевых контроллеров.

Теперь я знаю, что могу просто установить резервирование DHCP, и для трех рассматриваемых сетевых адаптеров у меня есть! но 3 ника живут в публичной сети без DHCP-сервер ... эти ники иметь для динамической установки статического IP ... да ... Я просто не могу придумать хороший способ сделать это.

Я собираюсь продолжить исследования и сам попытаюсь разобрать этот, но по ходу буду публиковать здесь свой прогресс. если у кого-то есть идеи, я очень открыт для предложений!

Далее следует свалка моего мозга, когда я переживаю то, что уже сделал. обратите внимание, все это, за исключением части DHCP, было сделано на самом сервере PXE. теоретически, если я все сделаю правильно, на целевых серверах ничего делать не нужно, кроме загрузки.

ЧАСТЬ 1: через ТУМАН

Установлены Стандарт Debian взял большинство параметров по умолчанию, выбрал ssh-сервер и основные компоненты только в tasksel

Некоторые исправления после установки и установки пакетов:

$ su
# nano /etc/apt/sources.list # <--remove the line for the DVD
# apt-get update && apt-get install sudo neofetch apache2 bc build-essential cpp curl g++ gawk gcc genisoimage git gzip htmldoc isolinux lftp libapache2-mod-php7.3 libc6 libcurl4 liblzma-dev m4 mariadb-client mariadb-server net-tools nfs-kernel-server openssh-server php7.3 php7.3-bcmath php7.3-cli php7.3-curl php7.3-fpm php7.3-gd php7.3-json php7.3-ldap php7.3-mbstring php7.3-mysql php7.3-mysqlnd php-gettext sysv-rc-conf tar tftpd-hpa tftp-hpa unzip vsftpd wget xinetd zlib1g
# /usr/sbin/usermod -a -G sudo [username]
# exit
$ exec newgrp sudo
$ export PATH=$PATH:/usr/sbin
$ sudo export PATH=$PATH:/usr/sbin

установить конфигурацию сети и перезагрузиться.

Установите FOG:

$ wget https://github.com/FOGProject/fogproject/archive/1.5.8.tar.gz
$ mv 1.5.8.tar.gz fogproject-1.5.8.tar.gz
$ sudo cp fogproject-1.5.8.tar.gz /tmp/
$ cd /tmp/
$ sudo tar -zxvf fogproject-1.5.8.tar.gz
$ cd fogproject-1.5.8/bin/
$ sudo ./installfog.sh

Принял дефолтную при установке FOG ...

ГОЧА №1: ОБРАТИТЕ ВНИМАНИЕ УСТАНОВЩИКУ !!! Если в тумане есть какие-либо ошибки или он отменяется после начала настройки MySQL, вы можете начать все сначала. Устранение проблем с входом в MySQL (по крайней мере, в моей среде) занимает больше времени, чем переустановка ОС. В какой-то момент ближе к концу установки FOG проинструктировал меня войти на веб-сайт управления, чтобы завершить настройку ... это просто; просто откройте браузер, перейдите к URL-адресу, который предоставляет туман, нажмите «установить», и все готово.

Отказ от ответственности: Я не использовал ssl для веб-страницы и не настраивал брандмауэр. PXE-сервер не находится в общедоступной сети. Кроме того, сеть, в которой мы находимся, получила доступ в Интернет для только эта установка. Как только все было запущено и запущено, сервер PXE был буквально отключен от Интернета (полностью отключен кабель). Любой, кто использует это в качестве руководства для загрузки PXE в реальном времени, должен подумать о настройке ssl, особенно при наличии подключения к Интернету! По крайней мере, вам следует настроить брандмауэр и создать самоподписанный сертификат!

ЧАСТЬ 2: Выполните приказы 66 ... и 67

Опции DHCP 66 и 67 определяют расположение сервера TFTP и загружаемого файла, который будет обслуживаться. У меня есть тестовая среда и производственная среда. Один использует edgerouter, а другой просто использует server2012 r2, обслуживающий DHCP и DNS. Я построил всю эту настройку в обоих, чтобы мы могли быстро развернуть, как только я все это настрою и запустю в тестировании.

На edgerouter я выполнил следующие команды:

set service dhcp-server shared-network-name VL1_dhcp subnet 10.10.10.0/24 tftp-server-name 10.10.10.100
set service dhcp-server shared-network-name VL1_dhcp subnet 10.10.10.0/24 bootfile-name ipxe.kpx
set service dhcp-server shared-network-name VL1_dhcp subnet 10.10.10.0/24 bootfile-server 10.10.10.100

На сервере Windows я сделал это:

В этот момент сервер тумана работал. Любые компьютеры частной сети с возможностью сетевой загрузки могут загружаться в меню FOG. Мы даже смогли заставить виртуальные машины в HyperV загружаться на него, при условии, что мы сначала настроим устаревший адаптер в настройках тестовой виртуальной машины.

Сюрреалистично видеть «загрузку filesystem.squashfs» с фактическим прогрессом загрузки в dmesg, перед увидев "ожидание сети". Тем более, если посмотреть на lsblk! после этого я ТАК собираюсь создать образ восстановления (на ум приходит knoppix) для общего использования. Больше никаких флеш-накопителей или записи DVD, просто загрузитесь в сеть и выберите вариант восстановления!

ЧАСТЬ 3: Работаем над горячей клавиатурой

Эта часть довольно проста. я использовал это руководство по Джордж1421 чтобы все это произошло ... не зашел бы так далеко, если бы не его помощь!

скачать стандарт Debian live:

$ sudo mkdir /ISO
$ cd /ISO
$ sudo wget https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-10.5.0-amd64-standard.iso

Подготовьте зону загрузки

$ sudo mkdir -p /images/os/debian/10.5L
$ sudo mkdir -p /tftpboot/debian/10.5L
$ sudo mkdir -p /var/www/html/os/debian/10.5L
$ sudo mount -o loop -t iso9660 /ISO/debian-live-10.5.0-amd64-standard.iso /mnt/loop
$ sudo cp -R /mnt/loop/* /images/os/debian/10.5L
$ sudo umount /mnt/loop

Скопируйте только те файлы, которые нам действительно интересны ...

$ sudo cp /images/os/debian/10.5L/live/vmlinuz-4.19.0-10-amd64 /tftpboot/debian/10.5L/vmlinuz
$ sudo cp /images/os/debian/10.5L/live/initrd.img-4.19.0-10-amd64 /tftpboot/debian/10.5L/initrd
$ sudo cp /images/os/debian/10.5L/live/filesystem.squashfs /var/www/html/os/debian/10.5L

ПЕРЕЙДИТЕ В туман веб-управления (в моем случае http://10.10.10.100/fog/management) Конфигурация FOG-> iPXE New Menu Entry Пункт меню: os.Debian10.5SL Описание: Debian 10.5 Standard Live Параметры:

kernel tftp://${fog-ip}/debian/10.5L/vmlinuz-4.19.0-10-amd64
initrd tftp://${fog-ip}/debian/10.5L/initrd.img-4.19.0-10-amd64
imgargs vmlinuz boot=live vga=773 components fetch=http://${fog-ip}/os/debian/10.5L/filesystem.squashfs
boot || goto MENU

Показать меню с: Все хосты

сохраните запись, и мы отправляемся в игры с мячом.

ЧАСТЬ 4: Хороший сервер у вас там ... будет жаль, если он перезагрузится

Чтобы создать собственный образ, я установил squashfs-tools на PXE-сервере, распаковал live-файл squashfs и подключился к нему, чтобы внести свои изменения.

$ cd /var/www/html/os/debian/10.5L
$ sudo mkdir squashfs-temp
$ cd squashfs-temp
$ sudo unsquashfs /var/www/html/os/debian/10.5L/filesystem.squashfs
$ sudo chroot /var/www/html/os/debian/10.5L/squashfs-temp/squashfs-root/

Я воспроизвел изменения, указанные выше, и установил некоторые вещи в chroot:

# nano /etc/apt/sources.list # <--had to create a fresh sources.list

deb http://ftp.us.debian.org/debian/ buster main
deb-src http://ftp.us.debian.org/debian/ buster main

Чтобы DNS работал внутри chroot, вам необходимо отредактировать файл resolv.conf. Это изменение будет перезаписано другими приложениями, но это не имеет значения. это только для chroot.

# nano /etc/resolv.conf # 

nameserver 8.8.8.8

двигаться дальше ...

# apt-get update && apt-get install sudo neofetch ufw wget curl openssh-server # <- this is a good place to install any additional packages you might need on the client.
# adduser [username]
# /usr/sbin/usermod -a -G sudo [username]
# passwd
# su [username]
$ exec newgrp sudo
$ export PATH=$PATH:/usr/sbin
$ exit
# export PATH=$PATH:/usr/sbin

Примечание: Установка пароля root нарушает образ. Как только система загрузится, вы увидите мигающий курсор смерти. Нам нужно отключить автоматический вход.

# echo "live-config.noautologin" >> /etc/live/config.conf

Затем я устанавливаю правила брандмауэра в chroot (в то время как у PXE-сервера нет интернета, у PXE-клиентов есть)

# ufw allow in on enp0s10f0 to any port 22 # <--allow ssh over the private nic only
# ufw allow 80 <--allow port 80 over any network
# ufw allow 443 <--allow port 443 over any network

ГОЧА №2 НЕ включайте брандмауэр в chroot, если у вас нет физического доступа к серверу (или IPMI), брандмауэр фактически блокирует трафик в ОС HOST! Пока не знаю, как обойти это ... нам нужно, чтобы брандмауэр был включен на клиенте при загрузке. Моя лучшая идея - включить его в chroot и сразу выйти из chroot и перезагрузить сервер PXE до того, как среагирует брандмауэр хоста. Я уверен, что есть более элегантное решение, но в данный момент оно ускользает от меня.

Чтобы внести незначительные изменения в клиент, не обновляя файл squashfs снова, добавьте сценарий для выполнения изменений.

# nano /etc/network/if-up.d/00-onboot

рассматриваемый сценарий:

#!/bin/sh

FLAGFILE=/var/lock/launch-script-complete

case "$IFACE" in
    lo)
        # The loopback interface does not count.
        # only run when the any other interface comes up
        # in theory, the first interface to actually come up will be the private interface...
        exit 0
        ;;
    *)
        ;;
esac

if [ -e $FLAGFILE ]; then
    exit 0
else
    touch $FLAGFILE
fi

wget http://10.10.10.100/os/debian/10.5L/launch.sh -O /var/run/launch.sh
sh /var/run/launch.sh

Сделайте его исполняемым

# chmod 755 /etc/network/if-up.d/00-onboot

Вы заметите, что сценарий запускается из ifup и не делает ничего, кроме загрузки другого сценария с сервера PXE? Да. вот где должно произойти волшебство!

Наконец, некоторые изменения качества жизни (у нас есть очень конкретная причина использования, когда они имеют смысл. YMMV, действуйте с осторожностью)

# rm /lib/live/config/1160-openssh-server

ЧАСТЬ 5: Ах да ... теперь все складывается.

Выйдите из chroot, сожмите временную папку обратно в файл squashfs и замените оригинал:

# history -c # <--you dont need THIS history to persist over reboots.
# exit
$ cd /var/www/html/os/debian/10.5L/squashfs-temp
$ sudo mksquashfs squashfs-root/ filesystem.squashfs -noappend -always-use-fragments
$ cd ..
$ sudo mv filesystem.squashfs filesystem.squashfs.old # <-- OR: $ sudo rm filesystem.squashfs
$ sudo mv /var/www/html/os/debian/10.5L/squashfs-temp/filesystem.squashfs /var/www/html/os/debian/10.5L/filesystem.squashfs

Это оно! Живое изображение готово к загрузке ... но есть сценарий запуска ...

ЧАСТЬ 6: Снова залить зубную пасту в тюбик

Отредактируйте сценарий запуска:

$ sudo nano /var/www/html/os/debian/10.5L/launch.sh

И здесь я застрял (возможно) ... Проблема в том, что у меня есть 3 сервера с 3 разными общедоступными IP-адресами и 12 дисков с разными uuid! как мне сказать скрипту, который использовать?

Я полагаю, что первое, что нужно сделать сценарию, - это посмотреть на сетевые контроллеры на клиентском сервере. Аппаратные адреса, найденные с помощью cat / sys / class / net / * / address, являются буквальным отпечатком сервера, поэтому неплохо было бы поискать там. Я мог бы создать список ожидаемых аппаратных адресов и сказать скрипту, чтобы он проверял, что существует, и действовал соответственно. Но, честно говоря, я не уверен, как это реализовать. Мои знания сценариев очень слабы. черт возьми, сценарий, который я поместил выше, был буквально скопирован из этого поста, но я думаю, что его можно приспособить для этого ... верно?

В данный момент я изучаю сценарий и, похоже, у меня есть решение!

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: следующий сценарий еще не был протестирован ... но выглядит фантастически простым и понятным.

#!/bin/sh

# Commands placed here will be run on ALL clients regardless of actual purpose or identity.
echo "# file deleted on reboot" > /etc/network/interfaces
echo "# The loopback network interface" >> /etc/network/interfaces
echo "auto lo" >> /etc/network/interfaces
echo "iface lo inet loopback" >> /etc/network/interfaces
echo "# The private network interface" >> /etc/network/interfaces
echo "auto eth0" >> /etc/network/interfaces
echo "iface eth0 inet dhcp" >> /etc/network/interfaces
echo "" >> /etc/network/interfaces

# from here on, the script will check the mac ID of the first network card in the server for hardware identification, and run the appropriate section below.

MAC=`ifconfig eth1 | awk '$1 == "ether" {print $2}'`
case "$MAC" in
  #mac address of private network card of the first server
  "##:##:##:##:##:##" )
     echo "# The public network interface" >> /etc/network/interfaces
     echo "auto eth1" >> /etc/network/interfaces
     echo "iface eth1 inet static" >> /etc/network/interfaces
     echo "address 20.0.0.21" >> /etc/network/interfaces
     echo "netmask 255.255.255.240" >> /etc/network/interfaces
     echo "gateway 20.0.0.1" >> /etc/network/interfaces
     echo "" >> /etc/network/interfaces

     # additional commands to perform here

     ;;
  #mac address of private network card of the second server
  "##:##:##:##:##:##" )
     echo "# The public network interface" >> /etc/network/interfaces
     echo "auto eth1" >> /etc/network/interfaces
     echo "iface eth1 inet static" >> /etc/network/interfaces
     echo "address 20.0.0.22" >> /etc/network/interfaces
     echo "netmask 255.255.255.240" >> /etc/network/interfaces
     echo "gateway 20.0.0.1" >> /etc/network/interfaces
     echo "" >> /etc/network/interfaces

     # additional commands to perform here

     ;; 
  #mac address of private network card of the third server
  "##:##:##:##:##:##" )
     echo "# The public network interface" >> /etc/network/interfaces
     echo "auto eth1" >> /etc/network/interfaces
     echo "iface eth1 inet static" >> /etc/network/interfaces
     echo "address 20.0.0.23" >> /etc/network/interfaces
     echo "netmask 255.255.255.240" >> /etc/network/interfaces
     echo "gateway 20.0.0.1" >> /etc/network/interfaces
     echo "" >> /etc/network/interfaces

     # additional commands to perform here

     ;; 
esac

Спасибо @Brandon Xavier за отличное предложение. Я оставил значительную вмятину на лбу над этой. честно говоря, это была часть ifconfig, я пытался получить ту же информацию, используя ip a... если сработает, отмечу ваш ответ как решение.

Рассмотрим что-то вроде этого:

echo "# file deleted on reboot" > /etc/network/interfaces
echo "# The loopback network interface" >> /etc/network/interfaces
echo "auto lo" >> /etc/network/interfaces
echo "iface lo inet loopback" >> /etc/network/interfaces
echo "# The private network interface" >> /etc/network/interfaces
echo "auto eth0" >> /etc/network/interfaces
echo "iface eth0 inet dhcp" >> /etc/network/interfaces
echo "" >> /etc/network/interfaces
echo "# The public network interface" >> /etc/network/interfaces
echo "auto eth1" >> /etc/network/interfaces

# MAC=`ifconfig eth1 | awk '$1 == "ether" {print $2}'`
# ip equivalent of above
MAC=`ip link show eth1 | awk '$1 == "link/ether" {print $2}'`
case "$MAC" in
  "00:11:22:33:44:55" )
     echo "iface eth1 inet static" >> /etc/network/interfaces
     echo "address 20.0.0.20" >> /etc/network/interfaces
     echo "netmask 255.255.255.240" >> /etc/network/interfaces
     echo "gateway 20.0.0.1" >> /etc/network/interfaces
     echo "" >> /etc/network/interfaces

     # add your mount commands or anything else server specific here

     ;; 
  "66:77:88:99:AA:BB" )
     echo "iface eth1 inet static" >> /etc/network/interfaces
     echo "address <some.other.ip>" >> /etc/network/interfaces
     echo "netmask 255.255.255.240" >> /etc/network/interfaces
     echo "gateway 20.0.0.1" >> /etc/network/interfaces
     echo "" >> /etc/network/interfaces

     # add your mount commands or anything else server specific here

     ;; 
esac

Конечно, замените MAC-адреса и IP-адреса на фактические значения. И создайте столько шаблонов, сколько нужно.

РЕДАКТИРОВАТЬ: Да, это очень быстро, грязно и некрасиво, но надежно и довольно легко для понимания новичком.

EDIT2: добавлена ​​эквивалентная команда ip