Вопрос или проблема
Недавно мы столкнулись с проблемой, когда ipconfig больше не может обнаружить сеть в процессе постустановки нашего файла kickstart Anaconda.
Это мешает нашим серверам устанавливать Puppet, и их приходится вручную настраивать при загрузке. Это огромная проблема и мешает нам быть полностью автоматизированными в нашей инфраструктуре. Мы небольшая компания и не можем позволить себе выполнять такие задачи вручную.
Я пробовал использовать как новый ip пакет
, так и nmcli
для получения информации о сети.
ip
на самом деле получает информацию в процессе постустановки, но в это время отсутствует IP-адрес. nmcli
вообще ничего не получает. Ниже приведен снимок экрана того, что выводится командой ip address
во время постустановки (как вы можете видеть, на этом этапе нет ip).
Ниже дан пошаговый план того, что я пытаюсь сделать.
- Настроить сеть для поиска DHCP-аренды (всегда бывает только одна возможная)
- Использовать какую-либо форму сетевого пакета для отображения IP-адреса, шлюза и т.д.
- Разобрать данные в bash, а затем переместить их в файл интерфейса eth0.
- Установить Puppet до завершения kickstart, чтобы он мог запускаться самостоятельно после перезагрузки.
Мой файл kickstart приведен ниже с различными методами, которые я пробовал (извините, он немного неаккуратный, но я действительно постоянно пытался сделать разные вещи работающими).
install
url --url http://repo1.example.com/centos/7/os/x86_64
lang en_US.UTF-8
keyboard us
timezone --utc America/Vancouver
network --noipv6 --onboot=yes --bootproto=dhcp --activate --device=eth0
authconfig --enableshadow --passalgo=sha512
rootpw --iscrypted ************************************
firewall --enabled --port 22:tcp
selinux --permissive
bootloader --location=mbr --driveorder=vda --append="crashkernel=auth rhgb"
# Разделение диска
zerombr
clearpart --all --drives=vda
part / --fstype=ext4 --grow --asprimary --size=200
part swap --size=4096
# КОНЕЦ Разделения диска
# Убедитесь, что мы перезагрузимся в новую систему, когда закончено
reboot
repo --name=base --baseurl=http://repo1.example.com/centos/7/os/x86_64/
# Выбор пакетов
%packages --nobase
@core
wget
NetworkManager
-rsyslog
%end
%pre
echo "------------------------- IP КОМАНДЫ ---------------------"
ip address
ip route
echo "------------------------- IP КОМАНДЫ ---------------------"
%end
%post --log=/root/install-post.log (
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# УСТАНОВИТЕ СВОИ ПОСЛЕСЛОВИЯ ЗДЕСЬ
echo "**************************************************"
echo "Преобразование диапазона DHCP в статический IP-адрес на eth0"
echo "**************************************************"
### NMCLI НЕ РАБОТАЕТ В KICKSTART
# IPADDR=`nmcli con show eth0 | grep IP4.ADDRESS | awk '{sub(/IP4.ADDRESS[1]:/,""); print $2}'`
# GATEWAY=`nmcli con show eth0 | grep IP4.GATEWAY | awk '{sub(/IP4.GATEWAY[1]:/,""); print $2}'`
# DNS1=`nmcli con show eth0 | grep "IP4.DNS\[1\]" | awk '{sub(/IP4.DNS[1]:/,""); print $2}'`
# DNS2=`nmcli con show eth0 | grep "IP4.DNS\[2\]" | awk '{sub(/IP4.DNS[2]:/,""); print $2}'`
## ДАВАЙТЕ ПОПРОБУЕМ IP, ТАК КАК IPCONFIG УСТАРЕЛ
IPADDR=`ip address | grep global | awk '{print $2}' | cut -d / -f1`
GATEWAY=`ip route | grep default | awk '{print $2}'`
echo "------------------------- IP КОМАНДЫ ---------------------"
ip address
ip route
echo "------------------------- IP КОМАНДЫ ---------------------"
echo "##### ТЕСТ NMCLI"
echo "IP АДРЕС: " $IPADDR
echo "ШЛЮЗ: " $GATEWAY
echo "DNS1: " $DNS1
echo "DNS2: " $DNS2
#nmcli con mod eth0 ipv4.dns $DNS1
#nmcli con mod eth0 +ipv4.dns $DNS2
#nmcli con mod eth0 ipv4.addresses $IPADDR
#nmcli con mod eth0 ipv4.dns-search example.com
#nmcli con mod eth0 ipv4.gateway $GATEWAY
#nmcli con mod eth0 ipv4.method manual
echo "************************************"
echo "Сетевой тест и очистка кэшей ARP"
echo "************************************"
ping -c 4 repo1.example.com
echo "************"
echo "Настройка Puppet"
echo "************"
/usr/bin/wget "https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm"
/usr/bin/rpm -Uvh "puppetlabs-release-7-12.noarch.rpm"
/usr/bin/sed -i "s/yum.puppetlabs.com/repo1.example.com\/puppetlabs/g" /etc/yum.repos.d/puppetlabs.repo
/usr/bin/yum -y --nogpgcheck install puppet
/usr/bin/sed -i 's/\[main\]/\[main\]\nenvironment=infrastructure/g' /etc/puppet/puppet.conf
/usr/bin/echo "server = puppet1.example.com" >> /etc/puppet/puppet.conf
/usr/bin/echo "configtimeout = 30m" >> /etc/puppet/puppet.conf
puppet agent --test # это не должно завершиться с ошибкой
puppet agent --test # это не должно завершиться с ошибкой
puppet agent --test # это не должно завершиться с ошибкой
service puppet start
/usr/sbin/chkconfig puppet on
echo "НАЧАТЬ СЕТЬ *********************************"
DEVICE=`route -n | grep '^0.0.0.0' | awk '{print $8}'`
IPADDR=`ifconfig $DEVICE | grep 'inet ' | awk '{print $2}'`
NETMASK=`ifconfig $DEVICE | grep 'inet ' | awk '{print $4}'`
# NETWORK=`ipcalc $IPADDR -n $NETMASK| cut -d = -f2`
GATEWAY=`route -n|grep '^0.0.0.0'| awk '{print $2}'`
HWADDR=`ifconfig $DEVICE|grep 'ether'| awk '{print $2}'`
# UUID=`uuidgen $DEVICE`
cat <<EOF >/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=$HOSTNAME
GATEWAY=$GATEWAY
EOF
cat <<EOF >/etc/sysconfig/network-scripts/ifcfg-$DEVICE
# NAME=$DEVICE
DEVICE=$DEVICE
BOOTPROTO=static
IPADDR=$IPADDR
NETMASK=$NETMASK
ONBOOT=yes
GATEWAY=$GATEWAY
HWADDR=$HWADDR
DNS1=10.1.1.23
DNS2=10.1.1.24
# UUID=$UUID
EOF
echo "КОНЕЦ СЕТИ *********************************"
)
%end
Я обнаружил, что конфигурацию сети можно сохранить, используя опцию --nochroot
. После использования nmcli
для внесения изменений скопируйте конфигурацию в монтирование sysimage
:
%post --nochroot --logfile=/mnt/sysimage/root/kickstart-post-nochroot.log
set -x
nmcli con mod # ...
cp /etc/NetworkManager/system-connections/* /mnt/sysimage/etc/NetworkManager/system-connections/
%end
Ответ или решение
Настройка сетевого подключения во время Kickstart
Введение в проблему
Недавние проблемы с конфигурацией сети в процессе установки через Anaconda Kickstart, не позволяющие использовать ipconfig для получения сетевой информации, становятся серьёзным препятствием в автоматизации вашего IT-процесса. Проблема с тем, что ваши серверы не могут автоматизированно устанавливать Puppet, требует эффективного решения для оптимизации развертывания.
Шаги, которые необходимо выполнить:
- Установка сетевого соединения для получения DHCP-аренды (всегда будет только один возможный адрес).
- Использование сетевой утилиты для отображения текущего IP-адреса и шлюза.
- Парсинг полученных данных с помощью Bash и сохранение в файл конфигурации интерфейса eth0.
- Установка Puppet до завершения Kickstart, чтобы он мог автоматически запускаться после перезагрузки.
Пример конфигурации Kickstart
Ваша Kickstart-конфигурация выглядит довольно обширной, и в ней использованы различные методы, которые, вероятно, могут вызвать путаницу. Оптимизируем его использование, применяя следующие рекомендации:
install
url --url http://repo1.example.com/centos/7/os/x86_64
lang en_US.UTF-8
keyboard us
timezone --utc America/Vancouver
network --noipv6 --onboot=yes --bootproto=dhcp --activate --device=eth0
authconfig --enableshadow --passalgo=sha512
rootpw --iscrypted ************************************
firewall --enabled --port 22:tcp
selinux --permissive
bootloader --location=mbr --driveorder=vda --append="crashkernel=auth rhgb"
# Разделение диска
zerombr
clearpart --all --drives=vda
part / --fstype=ext4 --grow --asprimary --size=200
part swap --size=4096
reboot
repo --name=base --baseurl=http://repo1.example.com/centos/7/os/x86_64/
# Выбор пакетов
%packages --nobase
@core
wget
NetworkManager
-rsyslog
%end
%post --log=/root/install-post.log (
# Установка пути
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# Проверка сетевой конфигурации
IPADDR=`ip address show dev eth0 | grep inet | awk '{print $2}' | cut -d/ -f1`
GATEWAY=`ip route | grep default | awk '{print $3}'`
# Настройка с помощью nmcli (если доступен)
nmcli con mod eth0 ipv4.method auto
nmcli con up eth0
# Проверка и вывод результатов
echo "IP адрес: $IPADDR"
echo "Шлюз: $GATEWAY"
# Установка Puppet
echo "Установка Puppet"
wget "https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm"
rpm -Uvh puppetlabs-release-7-12.noarch.rpm
yum -y install puppet
# Окончательная настройка
)
%end
Примечания и рекомендации:
-
Использование
nmcli
: С учетом текущих проблем с его функциональностью, обеспечьте, чтобы NetworkManager был активен во время инсталляции. Возможно, вам придется включить его в предварительном скрипте (%pre
), так как он не всегда доступен в пост-установочном скрипте. -
Проблемы с
ip
: Если командаip
не выдает ожидаемый IP-адрес, это может указывать на задержку в получении DHCP-аренды. Попробуйте добавить задержку (например, с помощью командыsleep
) перед попытками получения IP-данных. -
Настройка через
--nochroot
: Если у вас есть необходимость выполнить команды вне chroot окружения, это может быть реализовано с помощью--nochroot
. Это особенно полезно для поправки конфигурации сетевых соединений после того, как файловая система будет собрана. -
Проверка результата: Всегда проверяйте журналы после установки. Убедитесь, что не было ошибок при настройках сети и установки. Используйте
--log
для записи.
Заключение
Следуя этим рекомендациям, вы сможете устранить проблемы с сетевыми соединениями в процессе установки вашей системы через Kickstart. Это обеспечит надежное и полностью автоматизированное развертывание системы, что существенно улучшит любые последующие операции, связанные с управлением серверной инфраструктурой.