基本的に、PXEコマンドラインでARGVのような使用法が必要ですが、これを行うためのドキュメントが表示されません。
基本的に私は次のようなものを渡したいです
science-linux-6ホスト名VLAN
次に、%preでいくつかのAPIをヒットしてネットワーク情報を取得し、KS configに追加する必要があります。パラメーターがある場合、この部分は簡単です。
最後に%postで、chef runとchef serverへのブートストラップを開始したいと思います。これはホスト名/ドメイン名も知っている必要があります(基本的にはホスト名-fが爆発しないようにします)が、これが上記を完了することができれば、悪くないはずです。悲しいことに、これは私の最初の目標でしたが、ホスト名がまだ設定されていないことに気付いたときに失敗しました。
これが私がこれまでに学んだことです。
$ cat linux-install/msgs/param.msg
09Kernel Parameter Help07
Some kernel parameters can be specified on the command line and will be
passed to the running kernel. This does not include options to modules
such as ethernet cards or devices such as CD-ROM drives.
To pass an option to the kernel, use the following format:
0flinux <options>07
If a different installation mode is desired, enter it after the option(s).
For example, to install on a system with 128MB of RAM using expert mode,
type the following:
0flinux mem=128M expert07
To pass options to modules, you will need to use the expert mode to disable
PCI autoprobing. When the installation asks for your device type that needs
an option or parameter passed to it, there will be a place to type those
in at that time.
甘い!?つまり、PXEでは次のようになります...
scientific-linux-6 linux ARGV_APPEND
正しい?
それから私が見つけた%preと%postに物事を入れる このプレゼンテーションと他のいくつかの言及
Stick this at the top of the %pre section, and it will take anything of the form var=value
from /proc/cmdline and turn it into a variable you can use directly
set -- `cat /proc/cmdline`
for I in $*; do case "$I" in *=*) eval $I;; esac; done
つまり、私は言うことができます
scientific-linux-6 linux HOSTNAME=foo.example.com, VLAN=ddd
正しい?
それから%preでそれは私ができることを意味します
API、ヒット、IP、マスク、ゲートウェイを取得して、ネットワークを次のようなものに変更します
network --bootproto=static --ip=10.0.2.15 --netmask=255.255.255.0
--gateway=10.0.2.254 --nameserver=10.0.2.1
説明されているように ここ
その後、%postでシェフクライアントの実行を設定します。
私の質問です。これはうまくいくように聞こえますか?もっと良い方法はありますか?確かに他の誰かが以前にこれを行ったことがありますか?
PXEコマンドラインで、オプションを渡してしまいました
$ hotbox linux prefix_varname="foo" prefix_another_var="bar"
(linux
以降はすべて/ proc/cmdlineに置かれます。hotbox
はPXEラベルでした。)次に%post
/proc/cmdline(Rubyで)を解析して、/ prefix _ * /と一致するすべての変数を探し、ハッシュに変換しました。これにより、ウェブリクエストの結果に基づいて、さらに設定するためにシェフに渡すことができます。
注:私がこれをすべて行ったとき、Razorはありませんでした。私は個人的にかみそりに満足していませんでした、そして私達はまだ多かれ少なかれ上記の方法を使用しています。
単純なブールオプションを使用して、/proc/cmdline
でgrep
を実行しました。これは非常に簡単です。 Key-Valueオプションの場合、私は試していませんが、set
トリックは便利なようです。あなたの質問に対する具体的な回答:
1)はい、これでうまくいくようです。私はキックスタートと/proc/cmdline
で非常によく似たことをしました。
2)いいえ、もっと良い方法があるとは思いません。カーネルはそのコマンドラインオプションを/proc/cmdline
で公開し、キックスタートはカーネルコマンドラインオプションを処理するための高レベルのメカニズムを提供しません。
3)はい、これは以前に行われました。試してみて、うまくいかない場合は戻ってきてください。
いくつかの追加の考え:
1)コマンドラインオプションの間にカンマを入れないでください(スペースで区切るだけです)。
2)pxelinuxでは、append
行を使用すると便利です。例えば:
append initrd=f16-x86_64/initrd.img ks=nfs:server.example.com:/path/to/f16.ks mycustomflag mykey=myval
3)ネットワーク設定(指定したホスト名の例のように)は、多くの場合、DHCPにより適切に処理されます。
次のコマンドを使用して、すべてのキーと値のペアを変数に解析して機能させることができました。
# Get the kernel parameters
params=`cat /proc/cmdline`
# Split them on spaces
params_split=(${params// / })
# Go through each of them
for p in "${params_split[@]}"; do
# And if it's a key value pair
if [[ $p =~ "=" ]]; then
# And if the key doesn't have a period in it
p_split=(${p//=/ })
if [[ !($p_split[0] =~ ".") ]]; then
# Then set the key to the value
eval $p;
fi;
fi
done
それは
if [[ ! ($p_split[0] =~ ".") ]]; then
^^^
そして、あなたはそれを次のように囲むことを望むかもしれません:
#raw
...
#end raw
したがって、cobbler/cheetahテンプレートの補間に問題はありません。