web-dev-qa-db-ja.com

PXEコマンドラインからキックスタート%pre、%postスクリプトに引数を渡すにはどうすればよいですか?

基本的に、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はありませんでした。私は個人的にかみそりに満足していませんでした、そして私達はまだ多かれ少なかれ上記の方法を使用しています。

7
EnabrenTane

単純なブールオプションを使用して、/proc/cmdlinegrepを実行しました。これは非常に簡単です。 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により適切に処理されます。

3
amcnabb

次のコマンドを使用して、すべてのキーと値のペアを変数に解析して機能させることができました。

# 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
2
Dave Johansen

それは

if [[ ! ($p_split[0] =~ ".") ]]; then
      ^^^

そして、あなたはそれを次のように囲むことを望むかもしれません:

#raw
...
#end raw

したがって、cobbler/cheetahテンプレートの補間に問題はありません。

0
Randy Zagar