Не знаю, возможно ли это, но все равно спрошу.
Я пытаюсь запустить Kickstart на наших новых серверах с CentOS 7. До сих пор я больше всего работал, однако по какой-то причине, если я использую переменные в разделе% pre моего скрипта Kickstart, он вообще не анализируется в конфигурации . Поэтому я начинаю думать, что это даже невозможно?
Вот что у меня есть в разделе% pre моего кикстарта:
%pre --log /tmp/pre-install.log
hostname=serverA120
ip=100.110.120.130
IFS=. read ip1 ip2 ip3 ip4 <<< "$ip"
Затем во время кикстарта он должен использовать указанную выше информацию:
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).
Я использую что-то подобное для получения настроек 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
kickstart network
Вы не можете использовать переменные из одного блока с другим, так как это отдельные сценарии, выполняемые в разные моменты времени; Эти разделы кода будут разделены и помещены в отдельные отдельные файлы, а затем выполнены (даже не) в том порядке, в котором вы их пишете, что означает, что если у вас есть 3% предварительных разделов, они не обязательно будут выполняться по порядку, поэтому сохраните это в учетную запись. Кроме того, вы не можете использовать эти переменные с другими разделами кикстарта.
Одна из идей - использовать спутниковые файлы для хранения ваших данных (например, вы пишете /tmp/file
в твоем %pre
а затем верните его в свой %post
... который ты можешь сделать)
Я пошел другим путем, я буквально создал полную наживку и переключатель для анаконды, которая позволяет мне разместить на диске фальшивый кикстарт, а затем запустить сценарий для замены переменных, подобных %%IP%%
или %%HOSTNAME%%
с помощью sed.
В любом случае вам не нужно ничего этого делать, вы можете просто установить настройку ip1 ip2 ip3 ip4
в верхней части вашего %post
block, таким образом у вас будут установлены переменные.
тогда вы можете просто записать свои файлы, как и раньше, в свой блок сообщений.
Пропустите строчки "сеть" в кикстарте и просто используйте network --activate [--device=DEVICENAME]
(Добавьте --device, если у вас их несколько, и вы хотите использовать только 1)
при использовании% pre% post у вас нет доступа к BASH, это просто оболочка Bourne.
кикстарт позволяет вам использовать "--interpreter = / bin / bash" в строке сообщения% pre /%, но после обширного тестирования в прошлом я обнаружил, что он неустойчивый и не работает все время, поэтому обычно я добавляю шебанг прямо в первой строке квартала.
%post --log=/root/post.log
#!/bin/bash
##
[... code ...]
%end
это должно позволить вам использовать BASH вместо оболочки Bourne.