Bash

用預定義的靜態 IP 和主機名 (%pre) 啟動 CentOS 7 並在 KS 中使用,可能嗎?

  • December 27, 2020

我不知道這是否可能,但無論如何都會問。

我正在嘗試使用 CentOS 7 啟動我們更新的伺服器。到目前為止,我的大部分工作都在工作,但是由於某種原因,如果我在我的 Kickstart 腳本的 %pre 部分中使用變數,那麼它根本不會被解析到配置中. 因此,我開始認為這甚至不可能?

這是我在 Kickstart 的 %pre 部分中的內容:

%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(主機名和 ip)中填寫前兩行,並在完整安裝期間自動使用它(以及在 %post 中)。

您不能將一個塊中的變數與另一個塊一起使用,因為它們是在不同時間點執行的單獨腳本;這些程式碼部分將被拆分並放入單個單獨的文件中,然後按照您編寫它們的順序執行(甚至不是),這意味著如果您有 3 %pre 部分,它們不一定會按順序執行,所以請保持考慮到。此外,您不能將這些變數用於 kickstart 的任何其他部分。

一個想法是使用衛星文件來保存你的數據(就像你/tmp/file在你的文件中寫一個%pre然後把它放回你的%post……你可以做的那樣)

我走了一條不同的路,我真的為 anaconda 創建了一個完整的誘餌和開關,它允許我在磁碟上放置一個假的 kickstart,然後執行一個腳本來替換變數,比如 sed%%IP%%%%HOSTNAME%%使用 sed。

無論如何,你不需要做任何這些,你可以把設置ip1 ip2 ip3 ip4放在你的塊的頂部%post,這樣你就可以設置變數了。

然後您可以像之前在您的文章塊中所做的那樣簡單地編寫您的文件。

跳過 kickstart 中的“network”行並直接使用network --activate [--device=DEVICENAME](如果您有多個並且只想使用 1,則添加 –device)

以下僅供參考:

使用 %pre %post 時,您無法訪問 BASH,它只是 Bourne shell。

kickstart 允許您在 %pre/%post 行中使用“–interpreter=/bin/bash”,但在過去的大量測試之後,我發現它很不穩定並且不能一直工作,所以通常我會添加shebang就在街區的第一行。

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

這應該允許您使用 BASH 而不是 Bourne shell。

引用自:https://serverfault.com/questions/975573