ルールとクラスを使用することで、様々な方法でマシンのインストールをカスタマイズすることができます:
ルールを使用することで、システムの属性に応じた設定を行うことができます。
クラスはインストール先のシステムの設定グループを構成するものです。クラスはシステムに対して割り当てることができます。
autoyast
起動オプションのみの使用についてルールとクラスを使用する場合、起動パラメータでは autoyast=URL
のみを指定してください。
これは、 autoyast2=URL
を使用してしまうと、単一の AutoYaST 制御ファイルのみをダウンロードしてしまうことから、ルールとクラスに対応できなくなってしまうためです。
ルールを使用することで、インストール時に複数の制御ファイルを組み合わせて、システムの属性に応じた設定を行うことができます。ルールベースのインストールは、ルールファイルを元に制御を行います。
ルールベースのインストールはたとえば、 2 つの部署に対するシステムのインストールをまとめて行いたいような場合に有用です。たとえば部署 A ではオフィスデスクトップをインストールする要件があり、部署 B では開発者向けのワークステーションを構築する必要がある場合、 2 つの異なるルールファイルを作成することになります。それぞれのルールではそれぞれ異なるシステムパラメータを設定しますし、そこからそれぞれの部署に対応するためのプロファイルへのリンクも作成することになります。
ルールファイルは XML 形式のファイルで、自動インストールを行うシステム内の各グループに対するルールを記述します。ここには 1 つもしくは複数のルールが書き込まれ、システムの属性を元にシステムのグループを判断します。全てのルールの処理が終わると、システム内のグループは特定の制御ファイルに辿り着きます。ルールファイルと制御ファイルは、いずれもあらかじめ指定されたアクセス可能な場所に配置します。
ルールファイルは autoyast
キーワードで制御ファイルを直接指定しない場合にのみ取得します。たとえば下記のような指定を行ってしまうと、ルールファイルが評価されなくなってしまいます:
autoyast=http://10.10.0.1/profile/myprofile.xml autoyast=http://10.10.0.1/profile/rules/rules.xml
その代わりに、下記のように指定してください:
autoyast=http://10.10.0.1/profile/
これにより、 http://10.10.0.1/profile/rules/rules.xml
ファイルを読み込むようになります (ディレクトリ名の末尾のスラッシュが重要です) 。
複数のルールを適用する場合、各グループの最後でスクリプトを介して制御ファイルが合成され生成されます。この合成処理はルールの順序をもとにして動作するもので、後ろのほうにあるルールが前のほうにあるルールを上書きします。なお、合成された XML ファイルの冒頭セクションの名前は、合成が成功するようアルファベット順である必要があります。
ルールのファイルの使用は任意です。ルールファイルが何も見つからない場合、システムのインストールは指定された制御ファイルを元にした標準的な方法で行われるか、システムの MAC アドレスや IP アドレスを元にして制御ファイルを検索して実施されます。
下記のシンプルな例は、既知のハードウエアでクライアントが設定を取得する際、どのようなルールファイルを設定することができるのかを示すための例です。
<?xml version="1.0"?> <!DOCTYPE autoinstall> <autoinstall xmlns="http://www.suse.com/1.0/yast2ns" xmlns:config="http://www.suse.com/1.0/configns"> <rules config:type="list"> <rule> <disksize> <match>/dev/sdc 1000</match> <match_type>greater</match_type> </disksize> <result> <profile>department_a.xml</profile> <continue config:type="boolean">false</continue> </result> </rule> <rule> <disksize> <match>/dev/sda 1000</match> <match_type>greater</match_type> </disksize> <result> <profile>department_b.xml</profile> <continue config:type="boolean">false</continue> </result> </rule> </rules> </autoinstall>
上記の例では 2 つのルールが設定され、それぞれに対して別々の制御ファイルが設定されています。この場合、ルールの判断基準になっているのは disksize
(ディスクサイズ) です。ルールファイルを処理したあと、 YaST は rules.xml
ファイル内に書かれたルールを利用して、システムの判断を行います。インストール先のシステムが、ルール内に書かれた全ての属性条件に合致すると、対応するリソースが制御ファイルのスタックに追加され、最終的な制御ファイルを作成するために使用されるようになります。なお continue
プロパティは、 AutoYaST に対してルールに合致した際、それ以外のルールも参照するかどうかを制御するものです。
なお、最初のルールに合致しなかった場合、合致するルールが見つかるまで次のルールへの移動を繰り返します。
disksize
属性を使用することで、ハードディスクのサイズに応じて設定を変更することができるようになります。上記の例では、最初のルールは /dev/sdc
に対するルールで、これが 1 GB よりも大きい (match
プロパティ) かどうかを判断しています。
ルールには少なくとも 1 つ以上の属性を指定しなければなりません。複数の属性 (たとえばメモリやアーキテクチャなど) を指定する場合は、 rule
リソース内に複数の属性を指定することになります (次の例をご覧ください) 。
下記のシンプルな例は、既知のハードウエアでクライアントが設定を取得する際、どのようなルールファイルを設定することができるのかを示すための例です。
<?xml version="1.0"?> <!DOCTYPE autoinstall> <autoinstall xmlns="http://www.suse.com/1.0/yast2ns" xmlns:config="http://www.suse.com/1.0/configns"> <rules config:type="list"> <rule> <disksize> <match>/dev/sdc 1000</match> <match_type>greater</match_type> </disksize> <memsize> <match>1000</match> <match_type>greater</match_type> </memsize> <result> <profile>department_a.xml</profile> <continue config:type="boolean">false</continue> </result> </rule> <rule> <disksize> <match>/dev/sda 1000</match> <match_type>greater</match_type> </disksize> <memsize> <match>256</match> <match_type>greater</match_type> </memsize> <result> <profile>department_b.xml</profile> <continue config:type="boolean">false</continue> </result> </rule> </rules> </autoinstall>
ルールディレクトリは、起動時に autoyast
キーワードで指定したものと同じディレクトリ内に配置しなければなりません。たとえばクライアントを autoyast=http://10.10.0.1/profiles/
で起動する場合、 AutoYaST はルールファイルを検索する際、 http://10.10.0.1/profiles/rules/rules.xml を使用します。
AutoYaST が提供する属性では目的を達成できないような場合、独自のルールを作成することもできます。独自のルールはシェルスクリプトで記述し、スクリプトの出力 (STDOUT のみ、 STDERR は無視されます) を判断結果として使用します。
下記に独自のルールの設定例を示します:
<rule> <custom1> <script> if grep -i intel /proc/cpuinfo > /dev/null; then echo -n "intel" else echo -n "non_intel" fi; </script> <match>*</match> <match_type>exact</match_type> </custom1> <result> <profile>@custom1@.xml</profile> <continue config:type="boolean">true</continue> </result> </rule>
このルール内のスクリプトは STDOUT に intel
もしくは non_intel
を出力します (grep コマンドの出力は /dev/null に送られています) 。このルールスクリプトの出力は 2 つの '@' 文字で挟まれた箇所に当てはめられ、取得すべき制御ファイルの名前が intel.xml
もしくは non_intel.xml
になるように設定されています。これらのファイルには、ソフトウエアの選択を行うための AutoYaST のプロファイルの一部を含めることができます。この場合、 Intel ハードウエアかどうかによって、インストールするソフトウエアを変える動作になります。
独自のルールは最大で 5 つまでに制限されています。そのため、 custom1
から custom5
までを設定することができます。
match_type には 5 種類の比較のうちの 1 つを選択することができます:
exact
(既定値; 厳密一致)
greater
(より大きい)
lower
(より小さい)
range
(範囲指定)
regex
(正規表現; bash の =~
演算子のようなシンプルな仕組みです)
exact
を指定した場合、文字列として厳密に一致した場合にのみ合致したとみなされます。 regex
は単純な部分文字列としても使用することができますので、たとえば ntel
のように指定すると、 Intel, intel, intelligent のいずれにも合致することになります。 greater
と lower
は memsize
や totaldisk
など、数値同士を比較する際に使用します。ただし、整数値のみを扱うことができます。 range
も整数値の範囲を指定する場合にのみ使用することができるもので、たとえば 512-1024
のように、 最小-最大
のような形式で値を指定します。
論理演算子を使用することで、複数の属性を組み合わせて使用することもできます。たとえば disksize
(ディスクサイズ) が 1GB 以上であるか、もしくは memsize
(メモリサイズ) が 512MB ちょうどである場合にのみ合致するルールを作成することができます。
論理演算子を指定するには、ルール内に operator
要素を指定します。この要素には and
(いずれのルールにも合致した場合に全体で合致したものとみなす) もしくは or
(いずれかのルールに合致した場合に全体で合致したものとみなす) を指定することができます。既定値は and
です。下記に例を示します:
<rule> <disksize> <match>/dev/sda 1000</match> <match_type>greater</match_type> </disksize> <memsize> <match>256</match> <match_type>greater</match_type> </memsize> <result> <profile>machine2.xml</profile> <continue config:type="boolean">false</continue> </result> <operator>or</operator> </rule>
rules.xml
は下記の条件全てに合致する必要があります:
少なくとも 1 つ以上のルールが存在すること。
rules.xml
というファイル名になっていること。
プロファイルのリポジトリ内の rules
ディレクトリ内に配置されていること。
ルール内の合致について、少なくとも 1 つ以上の属性が存在すること。
下記の表には、ルールファイル内で合致に使用することのできる、定義済みのシステム属性の一覧を示しています。
お使いのシステムでどのような値になるのかを知りたい場合は、 /sbin/yast2 ayast_probe ncurses
を実行してください。スクロール可能なテキストボックスが表示され、その中に検出された値が表示されます。ただし、このコマンドは排他ロックを取得する必要があるため、他の YaST プロセスが動作している (例: インストーラ) 場合には動作しません。そのため、インストール時に実行することはできません。
属性 |
値 |
説明 |
---|---|---|
|
ホストの IP アドレス |
この属性には |
|
ホスト名 |
この属性には |
|
ホストのドメイン名 |
この属性には |
|
インストールする製品の名前 |
この属性には |
|
インストールする製品のバージョン |
この属性には |
|
ホストのネットワークアドレス |
この属性には |
|
ホストの MAC アドレス |
この属性には |
|
システムに設定されている Linux パーティションの数 |
この属性は 0 以上の値になります。 |
|
システムに設定されている Linux 以外のパーティションの数 |
この属性は 0 以上の値になります。 |
|
グラフィックアダプタが必要な X サーバ |
この属性には |
|
メガバイト単位でのホスト内のシステムメモリ量 |
全ての種類の比較を使用することができます。 |
|
メガバイト単位でのホスト内のディスク容量合計 |
全ての種類の比較を使用することができます。 |
|
IP アドレスの 16 進数表記 |
|
|
ホストのアーキテクチャ |
|
|
ホストのカーネルアーキテクチャ (SMP カーネルや Xen カーネルなど) |
|
|
ドライブデバイスとサイズ (単位: メガバイト) |
全ての種類の比較を使用することができます。 |
|
SMBIOS 内で設定されているハードウエアの製品名 |
|
|
SMBIOS 内で設定されているハードウエアの製造元名 |
|
|
SMBIOS 内で設定されているシステムボードの名前 |
|
|
SMBIOS 内で設定されているシステムボードの製造元名 |
|
|
シェルスクリプトを利用した独自ルール |
全ての種類の比較を使用することができます。 |
チェックボックス付きのポップアップを表示して、合致させたいルールを選択することもできます。
下記に示す要素は rules.xml
ファイル内の XML 構造内に配置すべきものです:
<rules config:type="list"> <rule> <dialog> ... </dialog> </rule> </rules>
dialog_nr
同じ dialog_nr
の値が設定されたルールは、同一のダイアログ内に表示されるようになります。そのため、 dialog_nr
は複数のルール内に設定することができます。
<dialog_nr config:type="integer">3</dialog_nr>
この要素は任意指定で、値を指定しない場合の既定値は 0
です。全てのルールで 1 つのポップアップだけを表示する場合は、 dialog_nr
を指定しなくてもかまいません。
element
重複しない ID を指定します。複数のダイアログを設定している場合は、同じ ID のものが現れてはなりません。ただしダイアログ 1 と 2 で同じ 1
を指定してもかまいません (この動作は ask
とは逆で、ダイアログが異なる場合であれば同じ ID でもかまいません) 。
<element config:type="integer">3</element>
任意指定です。何も指定しない場合、 AutoYaST 側で ID を自動設定します。矛盾したルールは設定できません (下記をお読みください) 。
title
ポップアップダイアログのタイトルを指定します。
<title>Desktop Selection</title>
任意指定
question
チェックボックスの隣に表示する文章を指定します。
<question>GNOME Desktop</question>
任意指定です。何もテキストを指定しない場合、このルールを起動した XML ファイルの名前が表示されます。
timeout
ダイアログの制限時間を秒単位で指定します。制限時間を超過すると、 「押された」 として扱われます。ルール内の問い合わせで止まったままにしたくない場合に使用します。
ボタンが自動的に<timeout config:type="integer">30</timeout>
任意指定です。制限時間を指定しない場合、ユーザ側で操作を行ってダイアログを終了しない限り、インストールが停止したままになります。
conflicts
このルールと競合する要素 ID (ルール) のリストを指定します。このルールに合致した場合、もしくはこのルールをユーザ側で選択した場合、競合関係にあるルールの選択は外され、ポップアップ内で無効化されます。デッドロックを発生させることがないように注意してお使いください。
<conflicts config:type="list"> <element config:type="integer">1</element> <element config:type="integer">5</element> ... </conflicts>
任意指定
下記はルール内でダイアログを使用する場合の例です:
<rules config:type="list"> <rule> <custom1> <script> echo -n 100 </script> <match>100</match> <match_type>exact</match_type> </custom1> <result> <profile>rules/gnome.xml</profile> <continue config:type="boolean">true</continue> </result> <dialog> <element config:type="integer">0</element> <question>GNOME Desktop</question> <title>Desktop Selection</title> <conflicts config:type="list"> <element config:type="integer">1</element> </conflicts> <dialog_nr config:type="integer">0</dialog_nr> </dialog> </rule> <rule> <custom1> <script> echo -n 100 </script> <match>101</match> <match_type>exact</match_type> </custom1> <result> <profile>rules/gnome.xml</profile> <continue config:type="boolean">true</continue> </result> <dialog> <element config:type="integer">1</element> <dialog_nr config:type="integer">0</dialog_nr> <question>Gnome Desktop</question> <conflicts config:type="list"> <element config:type="integer">0</element> </conflicts> </dialog> </rule> <rule> <custom1> <script> echo -n 100 </script> <match>100</match> <match_type>exact</match_type> </custom1> <result> <profile>rules/all_the_rest.xml</profile> <continue config:type="boolean">false</continue> </result> </rule> </rules>
クラスはインストール先のシステムのグループに対する設定を表します。ルールとは異なり、クラスは制御ファイル内に設定する必要があります。クラスを設定した後、目的のシステムに割り当てを行います。
下記にクラス定義の例を示します:
<classes config:type="list"> <class> <class_name>TrainingRoom</class_name> <configuration>Software.xml</configuration> </class> </classes>
上記の例では、 Software.xml
は classes/TrainingRoom/
サブディレクトリ内に配置しなければなりません。 AutoYaST の制御ファイルやルールと同じ場所から取得が行われます。
複数の制御ファイルが存在していて、それらの内容のうち共通する部分がある場合は、共通する部分をクラスとして設定すると良いでしょう。 このほか、 XIncludes を使用することもできます。
設定管理システムを使用することで、クラスのセットを作成することもできます。クラスの定義では下記のような変数を使用することができます:
Name: クラス名
Description:
Order: クラスの順序 (優先順位)
クラスは必要な数だけ作成することができますが、設定をできるかぎり簡潔にするため、できるだけ少ないクラス数にしておくことをお勧めします。たとえば下記のようなクラスのセットを使用することができます:
site: 物理的な配置をもとにしたクラス
machine: マシンの種類をもとにしたクラス
role: マシンの機能をもとにしたクラス
group: 部署や場所をもとにしたクラス
class ディレクトリ内に保存したファイルは通常の制御ファイルと同じ書式ですが、設定の一部分のみを表すように記述します。たとえば特定のネットワークインターフェイスを持つコンピュータに対して新しい制御ファイルを作成する場合、ネットワークの設定のみを設定した制御ファイルリソースを作成します。複数の種類のネットワークがある場合は、他のクラスファイルを利用してそれらの種類に対応させ、それらを組み合わせて新しい制御ファイルを作り上げる形になります。
自動インストールのセッションでは、ルールとクラスを混在させることができます。たとえばクラス定義を含むルールを利用してシステムを識別したりすることができます。流れは 図A.1「ルールの取得処理」 で示しています。
ルールを取得してそれらを合成したら、生成された制御ファイルが処理され、クラスの定義が存在していないかどうかを確認します。クラスが定義されている場合、元のリポジトリからクラスファイルを取得し、さらに合成処理を行います。
クラスとルールの両方を使用することで、複数の XML ファイルから 1 つの XML ファイルを合成することになります。この合成処理は、通常期待される処理とは異なる動作になっていることから、しばしば混乱の原因となります。まず注意しておくべきことは、合成処理を成功させるには、合成対象の XML ファイル内のトップセクションは、アルファベット順に並んでいなければならない、という点です。
たとえば下記のような 2 種類の合成すべき XML ファイルがあるものとします:
<partitioning config:type="list"> <drive> <partitions config:type="list"> <partition> <filesystem config:type="symbol">swap</filesystem> <format config:type="boolean">true</format> <mount>swap</mount> <partition_id config:type="integer">130</partition_id> <size>2000mb</size> </partition> <partition> <filesystem config:type="symbol">xfs</filesystem> <partition_type>primary</partition_type> <size>4Gb</size> <mount>/data</mount> </partition> </partitions> </drive> </partitioning>
<partitioning config:type="list"> <drive> <initialize config:type="boolean">false</initialize> <partitions config:type="list"> <partition> <format config:type="boolean">true</format> <filesystem config:type="symbol">xfs</filesystem> <mount>/</mount> <partition_id config:type="integer">131</partition_id> <partition_type>primary</partition_type> <size>max</size> </partition> </partitions> <use>all</use> </drive> </partitioning>
これらを合成することによって、通常は 3 種類のパーティション設定になるかと思われますが、残念ながらそうではありません。これらを合成すると 2 種類のパーティション設定となり、最初のパーティションはスワップとルートパーティションを混在させたものになります。また、 mount
や size
など、両方のパーティション設定内に存在するものは、いずれも 2 つ目のファイルのものを使用することになります。いずれか片方にしか存在しない設定については、設定されているほうの値が適用されます。
また上記の例では、 2 つ目の drive
については不要となり、両方を 1 つにまとめる必要があります。このような場合、 3 つの個別のパーティション設定を行う必要があります。また、 dont_merge
メソッドを使用することで、合成時の問題を解決することができます:
<classes config:type="list"> <class> <class_name>swap</class_name> <configuration>largeswap.xml</configuration> <dont_merge config:type="list"> <element>partition</element> </dont_merge> </class> </classes>
<rule> <board_vendor> <match>ntel</match> <match_type>regex</match_type> </board_vendor> <result> <profile>classes/largeswap.xml</profile> <continue config:type="boolean">true</continue> <dont_merge config:type="list"> <element>partition</element> </dont_merge> </result> <board_vendor> <match>PowerEdge [12]850</match> <match_type>regex</match_type> </board_vendor> <result> <profile>classes/smallswap.xml</profile> <continue config:type="boolean">true</continue> <dont_merge config:type="list"> <element>partition</element> </dont_merge> </result> </rule>