Kickstart CentOS 7 с предварительно определенным статическим IP-адресом и именем хоста (% pre) и возможно использование в KS?

, я не знаю, возможно ли это, но собираюсь в любом случае спросите.

Я пытаюсь запустить кикстарт более новых наших серверов с CentOS 7. Пока у меня больше всего работает, однако по какой-то причине, если я использую переменные в разделе% pre моего скрипта Kickstart, он не анализируется перешли к конфигурации вообще. Поэтому я начинаю думать, что это даже невозможно?

Это то, что у меня есть в разделе% pre моего Kickstart:

%pre --log /tmp/pre-install.log

hostname=serverA120
ip=100.110.120.130
IFS=. read ip1 ip2 ip3 ip4 <<< "$ip"

Чем во время Kickstart он должен использовать указанную выше информацию:

network  --bootproto=static --device=eth0 --gateway=100.110.$ip3.1 --ip=$ip --nameserver=1.1.1.1 --netmask=255.255.255.0
network  --hostname=$hostname.example.com

И в разделе% post я также пытаюсь использовать переменные из% pre:

sed -i'' -e '/HOSTNAME=/d' /etc/sysconfig/network
echo HOSTNAME=$hostname.example.com >> /etc/sysconfig/network
echo GATEWAY=100.110.$ip3.1 >> /etc/sysconfig/network

echo BOOTPROTO=static >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo IPADDR=$ip >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo NETMASK=255.255.255.0 >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo BROADCAST=100.110.$ip3.255 >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo NETWORK=100.110.$ip3.0 >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo GATEWAY=100.110.$ip3.1  >> /etc/sysconfig/network-scripts/ifcfg-eth0

echo $hostname.example.com >> /etc/hostname
sudo hostnamectl set-hostname $hostname.example.com

Я проверил ifcfg-eth0 физически после того, как больше не смог связаться с сервером, и он показал следующее:

IPADDR=
BROADCAST=100.110..255
NETWORK=100.110..0
GATEWAY=100.110..1

Я также проверил / etc / hostname:

$hostname.example.com

Итак, переменные не анализируются в Kickstart. Я что-то делаю не так или это просто невозможно? И есть ли для этого альтернативное решение?

Конечно, я могу вручную настроить все строки до и после, но я хотел сделать это как можно проще, не редактируя все вручную. Другими словами, я просто хочу заполнить 2 строки, а остальные настраиваются так, как я хочу. Это упростило бы задачу кикстарта нескольких серверов в долгосрочной перспективе.

Я понятия не имею, что я делаю неправильно, но, проверяя ifcfg-eth0 и имя хоста, ясно показывает, что предварительно введенные переменные не используются? Но, как я сказал выше, возможно, это просто невозможно, или я использую его неправильно.

И нет, я не хочу использовать DHCP или аналогичный. Потому что мне все равно придется потом менять его вручную. Я просто хочу заполнить первые две строчки в% pre (hostname и ip), чтобы они использовались автоматически во время полной установки (и в% post).

1
задан 17 July 2019 в 14:10
3 ответа

Вы не можете использовать переменные из одного блока в другом, так как это отдельные сценарии, выполняемые в разные моменты времени; Эти разделы кода будут разделены и помещены в отдельные отдельные файлы, а затем выполнены (даже не) в том порядке, в котором вы их записываете, а это означает, что если у вас есть 3% предварительных разделов, они не обязательно будут выполняться по порядку, поэтому сохраните это в учетную запись. Кроме того, вы не можете использовать эти переменные ни в каком другом разделе кикстарта.

Одна из идей - использовать вспомогательные файлы для хранения ваших данных (например, вы пишете / tmp / file в своем ]% pre , а затем верните его в своем % сообщении ... , что вы можете сделать)

Я пошел другим путем, я буквально создал полный приманка-и-переключатель для анаконды, которая позволяет мне разместить на диске фальшивый кикстарт, а затем запустить сценарий для замены переменных вроде %% IP %% или %% HOSTNAME %% с помощью sed.

В любом случае вам не нужно ничего делать, вы можете просто поместить настройку ip1 ip2 ip3 ip4 вверху вашего % post блок, таким образом у вас будут установлены переменные.

тогда вы можете просто записать свои файлы, как вы делали раньше, в свой блок post.

Пропустите строки «сеть» в кикстарте и просто используйте network --activate [--device = DEVICENAME] (Добавьте --device, если у вас их несколько и вы хотите использовать только 1)

Это ниже просто к сведению:

при использовании% pre% post у вас нет доступа к BASH, это просто оболочка Bourne.

кикстарт позволяет вам использовать "--interpreter = / bin / bash" в ваша строка% pre /% post, но после обширного тестирования в прошлом я обнаружил, что она нестабильна и не работает все время, поэтому обычно я добавляю shebang прямо в первую строку блока.

    %post --log=/root/post.log
    #!/bin/bash
    ##
    [... code ...]
    %end

это должно позволить используйте BASH вместо оболочки Bourne.

1
ответ дан 3 December 2019 в 20:06

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

%pre
echo "network  --bootproto=dhcp --device=eth0 --ipv6=auto --activate --hostname renameme.ipa.smith122.com" > /tmp/network.ks
for x in $( cat /proc/cmdline );
do
   case $x in
      SERVERNAME*)
         eval $x
         echo "network  --bootproto=dhcp --device=eth0 --ipv6=auto --activate --hostname ${SERVERNAME}.ipa.example.com" > /tmp/network.ks
         ;;
      NOTIFYEMAIL*)
         eval $x
         echo "${NOTIFYEMAIL}" > /mnt/sysroot/root/notifyemail.txt
         ;;
   esac
done

А за пределами% pre и% post, как правило, в файле вам понадобится:

%include /tmp/network.ks

Для вас, вероятно, вы захотите строка, напоминающая:

network --bootproto=static --ip=10.0.2.15 --netmask=255.255.255.0 --gateway=10.0.2.254 --nameserver=10.0.2.1

Ссылки

  1. https://sysadmin.compxtreme.ro/automatically-set-the-hostname-during-kickstart-installation/
  2. Моя собственная запись в блоге: https: / /bgstack15.wordpress.com/2019/07/25/use-virt-install-to-fully-automate-the-install-for-centos-fedora-with-kickstart/
  3. https://access.redhat. com / documentation / en-us / red_hat_enterprise_linux / 6 / html / installation_guide / s1-kickstart2-options , найденный в Интернете по запросу kickstart network
1
ответ дан 3 December 2019 в 20:06

Хотя принятый ответ в целом верен и является хорошим объяснением того, что происходит, я хотел бы добавить недостающую ясность, а затем показать фактический рабочий вариант реализации, который я использую, который демонстрирует некоторые из них.

Во-первых, давайте вернемся к пункту «переменные». Блоки %pre и %post — это просто оболочки вокруг произвольного кода, который не имеет значения для установщика. Он видит все в этих блоках как простой текст, который передается интерпретатору --. Фактически, вы могли бы использовать %pre --interpreter=/bin/sh и %post --interpreter=/usr/bin/python, и в этом случае переменные в двух блоках даже синтаксически несовместимы. Таким образом, переменная «scope» сначала является локальной для блока %pre/%post, по крайней мере, затем будет дополнительно ограничена в соответствии с правилами «scope» языка, указанными - -интерпретатор.

Теперь, важный момент, который не попал в принятый ответ, заключается в том, что блок %pre выполняется в среде установки. Среда установки похожа на live-cd

  • . На ней работает резидентная файловая система RAM.
  • У вас есть доступ только к тем командам и утилитам, которые включены в файловую систему установщика.
  • Устройства и их имена в среде «установки» могут отличаться от «установленной» среды.

Например, этот %pre --log /tmp/pre-install.log может не соответствовать вашим ожиданиям.Если по какой-то причине установка не удалась до того, как установщик загрузится в новую установку, вы можете использовать оболочку установщика для cat этого файла. Но как только произойдет перезагрузка, все, что было записано во временную файловую систему установщика, будет потеряно.

Кроме того, это технически неверно:

Одним из вариантов может быть использование спутниковых файлов для хранения ваших данных (например, вы пишете /tmp/file в своем %pre, а затем возвращаете его в свой %post... что вы можете сделать)

Вы можете сделать это, но только если вы запишете это в файловую систему, которая будет сохраняться после перезагрузки, например USB, iSCSI, NFS, CIFS, д., крепление.

Имея это в виду, следуйте принципу KISS (Keep It Simple...), когда дело доходит до выбора %pre. У вас может не быть доступа к более продвинутым командам/инструментам/языкам; это будет зависеть от того, что есть, а что нет в пакете установщика, и различные дистрибутивы и версии могут со временем изменить это.

Наоборот, у вас в значительной степени есть карта-бланш в блоке %post, поскольку к тому времени у вас будет доступ ко всему, что вы указали в блоке %packages.

Хотя вы хотите, чтобы блок %pre был простым с точки зрения используемых инструментов и языков, чем больше вы делаете для настройки системы с помощью команд установщика, тем меньше вам придется " patch" конфигурацию в блоке %post.


Рабочий пример — вариант

При предоставлении новых хостов я начинаю со сбора и/или создания трех вещей (для целей этого примера); MAC-адрес, IP-адрес, имя хоста.Если у меня есть большой блок из них, они обычно помещаются в электронную таблицу конфигурации. Следующим шагом является создание резервирования в DHCP, который подключает аппаратный или виртуальный MAC-адрес к назначенному ему IP-адресу. Затем IP-адрес и имя хоста попадают в зоны прямого и обратного просмотра DNS. Вы можете использовать формулы в электронной таблице для создания записей DHCP и DNS, чтобы это стало урезанным и прошлым упражнением. После того, как DHCP и DNS настроены, вы просто загружаете коробку по сети, и происходит правильная конфигурация. Я считаю резервирование DHCP небольшой платой за согласованность и эффективность развертывания и даже повторного развертывания экземпляров сервера.

Это файл кикстарта, который был сокращен до немногим большего, чем соответствующие записи

#version=RHEL8

text

%include /tmp/network.ks

eula --agreed
reboot
skipx

%pre
#!/bin/bash

DEVICE=$(ip r|grep default|grep  -oP '(?<=dev )\S*')
declare -A value
while IFS= read -r line; do
  kvp=${line##DHCP4.OPTION\[*\]:*[ ][ ]}
  value+=([${kvp% = *}]=${kvp#* = })
done <<< $(nmcli -f dhcp4 device show $DEVICE)

echo "network --device link --bootproto static --ip ${value[ip_address]} --netmask ${value[subnet_mask]} --gateway ${value[routers]} --hostname ${value[host_name]}.${value[domain_name]} --nameserver ${value[domain_name_servers]} --onboot yes --noipv6" > /tmp/network.ks

%end

%post --log=/root/install-post.log

cat << EOF >> /etc/hosts
$(hostname -i)        $(hostname -s) $(hostname -f)
EOF

%end

Поскольку я уже создал резервирование DHCP для «статической» конфигурации, которую я хочу использовать, в % Блок pre Я использую nmcli, чтобы получить соответствующие параметры DHCP и использовать их для динамической генерации команды network... для использования установщиком. Затем этот динамически сгенерированный файл включается в тело сценария кикстарта.

Здесь может показаться немного запутанным использование $DEVICE для запроса параметров dhcp4, однако я использую ссылку network --device . .. . Причина в различиях между устройствами установщиков, которые мне нужно запрашивать, и именем сетевого устройства (ов) в установленной системе, которое я не навязываю, указав «первую активную ссылку» и разрешив установщик называет устройства по своему усмотрению.В прошлом у меня были проблемы, предполагая, что активное имя в среде установщиков будет таким же в установленной среде... и тогда все пошло не так.

В блоке %post я делаю кое-что, что мне нужно, чего не делает команда network... : добавляю IP-адрес и имя хоста в файл hosts. Если все предыдущие шаги правильно настроили систему к моменту выполнения блока %post, вы можете получить все, что вам нужно, прямо из работающей конфигурации... вам не нужно сохранять какие-либо %pre переменных, так как система будет работать на них в этот момент.

1
ответ дан 27 December 2020 в 18:11

Теги

Похожие вопросы