第6章 ルールとクラス

目次

6.1. ルールベースの自動インストール
6.2. クラス
6.3. ルールとクラスの組み合わせ
6.4. ルールとクラスの合成

6.1. ルールベースの自動インストール

AutoYaST におけるルールとは、インストールの際にシステムの属性に応じて 複数の制御ファイルを合成し、設定する仕組みのことを指します。ルール ベースのインストールは、ルールファイルで制御します。

ルールファイルは 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 から読み込むようになります (ディレクトリ名の後ろにあるスラッシュは、必ず指定します) 。

図6.1 ルール

ルール

なお、複数のルールに該当する場合、最終的に適用されるプロファイルは、合成 スクリプトを利用してその場で生成されます。合成処理はルール内に書かれた 順序通りに解釈され、前に解釈したものは後から解釈したもので上書きされます。

ルールファイルの使用は任意です。ルールファイルが見つからない場合、システムの インストールは指定されたプロファイルを利用した従来の方法で動作するか、 もしくはシステムの MAC アドレスまたは IP アドレスをベースにして、プロファイルを検索する 方法で動作します。

6.1.1. ルールファイルの例

例6.1 シンプルなルールファイル

下記のシンプルな例では、既知のハードウエアを持つクライアントに対して、 ルールファイルをどのように利用して設定を取得するのかを示しています。

<?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/hdc 1000</match>
            <match_type>greater</match_type>
       </disksize>
       <result>
            <profile>machine1.xml</profile>
            <continue config:type="boolean">false</continue>
        </result>
    </rule>
    <rule>
       <disksize>
            <match>/dev/hda 1000</match>
            <match_type>greater</match_type>
       </disksize>
       <result>
            <profile>machine2.xml</profile>
            <continue config:type="boolean">false</continue>
        </result>
    </rule>
  </rules>
</autoinstall>

上記の例は、 2 つのルールに対してそれぞれ別々のプロファイルを適用する 場合の例です。ここで使用しているルールは disksize (ディスクのサイズ) です。ルールファイルを解釈した後、 YaST はインストール先のシステムが rules.xml 内に書かれたルールそれぞれに該当して いるかどうかを確認します。 1 つのルール内に書かれたすべての条件に合致した 場合、ルールに該当していると判断します。ルールに該当している場合は、その中に 書かれた情報をさらに読み込み、 AutoYaST が最終的に使用するプロファイルとの 間で合成処理が動作します。なお、 continue 属性は、 ルールに合致した場合に AutoYaST がその後のルールを処理するかどうかを 指定します。

最初のルールに該当しなかった場合は、一覧内の次のリストに移動し、処理を 繰り返します。

disksize 属性を利用すると、さまざまなサイズの ハードディスクが搭載されたシステムに対して、異なる設定を行なうことが できるようになります。上記のルールの 1 つめの match 属性では、まず /dev/hdc が存在するかどうかを判断し、 そのディスクが 1GB 以上のサイズであるかどうかを判断しています。

それぞれのルールには、少なくとも 1 つ以上の属性を設定する必要があります。 アーキテクチャやメモリなど、複数のルールを設定するには、下記のようにして rule リソース内に複数の属性を設定します。

例6.2 より複雑なルールファイル

下記の例では、より複雑なルールを設定しています。

<?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/hdc 1000</match>
            <match_type>greater</match_type>
       </disksize>
       <memsize>	    
            <match>1000</match>
            <match_type>greater</match_type>
       </memsize>
       <result>
            <profile>machine1.xml</profile>
            <continue config:type="boolean">false</continue>
        </result>
    </rule>
    <rule>
       <disksize>
            <match>/dev/hda 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>
    </rule>
  </rules>
</autoinstall>

ルールのディレクトリは、システムの起動時に autoyast キーワードで指定するのと同じディレクトリ内に存在していなければなりません。 たとえばクライアントに autoyast=http://10.10.0.1/profiles/ というパラメータを指定して起動した場合、 AutoYaST はルールファイルが http://10.10.0.1/profiles/rules/rules.xml に存在するものとみなします。

6.1.2. 独自のルール

AutoYaST のルール機能では十分な目的を果たせない場合、独自のルールを作成する こともできます。独自のルールを必要とする場合、シェルスクリプトで作成 しなければなりません。 シェルスクリプトが標準出力 (STDOUT) に出力する内容が、 AutoYaST の使用するプロファイルとなります。標準エラー出力 (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 に転送 されます) 。スクリプトの出力結果は、ルールファイル内にある '@' で 囲まれた文字列の箇所に埋め込まれます。上記の例では、利用する プロファイルのファイル名に設定されています。このことから、 AutoYaST は スクリプトの出力結果によって "intel.xml" または "non_intel.xml" に アクセスすることになります。このファイルには、たとえば AutoYaST に 対してソフトウエア選択などの情報を含めることができます。これにより、 CPU が Intel 製かどうかによって、異なるソフトウエアをインストール する仕組みになっています。

独自のルールとして設定できるのは、最大で 5 つまでです。 そのため、 custom1 から custom5 までの名前を使用できます。

6.1.3. ルールに対する適合種類 (マッチタイプ) 設定

match_type で設定可能な適合種類 (マッチタイプ) には、 下記の 5 つがあります:

  • exact (既定値; 指定した値と正確に一致するかどうか)

  • greater (指定した値より大きいかどうか)

  • lower (指定した値より小さいかどうか)

  • range (指定した値が範囲内かどうか)

  • regex (SUSE Linux 10.1 および SLES10 、またはそれ以降のバージョンのみ; bash における "=~" 演算子と同じで、指定した正規表現に該当するかどうか)

"greater" と "lower" は、メモリやディスクのサイズなどに適用することができます。 これらの比較は、いずれも整数値しか扱うことができないためです。 "range" も 同様に整数値しか使用できません。たとえば "512-1024" のように、 "(値_1)-(値_2)" の形式で指定します。 "regex" は部分一致で使用できるもので、 たとえば "ntel" は "Intel" にも "intel" にも、 "intelligent" にも該当する ことになります。

6.1.4. 属性の組み合わせ

論理演算子を使用することで、複数の属性を組み合わせて設定することもできます。 たとえばディスクサイズが 1GB より小さいか、もしくはメモリサイズが 512MB ちょうどである条件などを作成することができます。

このような組み合わせ条件を設定するには、 rules.xml ファイル内で "operator" 要素を指定します。下記に例を示します:

<rule>
   <disksize>
        <match>/dev/hda 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>

"and" (すべてに該当しなければならない条件として設定) または "or" (いずれか 1 つに該当しなければならない条件として設定) の いずれかを指定できます。何も指定しない場合、既定値は "and" です。

6.1.5. ルールファイルの構造

rules.xml は下記の要件をすべて満たさなければなりません:

  • 少なくとも 1 つ以上のルールが存在すること。

  • ファイル名が rules.xml であること

  • プロファイルリポジトリ内の rules サブディレクトリ内に存在していること。

  • 少なくとも 1 つ以上の条件が設定されていること。

6.1.6. 定義済みのシステム属性

下記の表には、ルールファイル内で条件として設定できるシステム属性の一覧を 示しています。

お使いのシステムでシステム属性がどのような値になっているのか、よくわからない 場合は、 "confirm" の値を "true" に設定して自動インストールを実行してみてください。 その後、提案画面が表示されたタイミングで CTRL+ALT+F2 を押し、 /usr/lib/YaST2/bin/y2base ayast_probe ncurses と入力すると、検出された値を表示することができます (テキストボックスが表示されます) 。

表6.1 システム属性

属性

説明

hostaddress

マシンの IP アドレス。

この属性に対しては、適合種類が "exact" でなければなりません。

hostname

マシンのホスト名。

この属性に対しては、適合種類が "exact" でなければなりません。

domain

マシンのドメイン名。

この属性に対しては、適合種類が "exact" でなければなりません。

installed_product

インストールを行なう製品の名前。

この属性に対しては、適合種類が "exact" でなければなりません。

installed_product_version

インストールを行なう製品のバージョン。

この属性に対しては、適合種類が "exact" でなければなりません。

network

マシンのネットワークアドレス。

この属性に対しては、適合種類が "exact" でなければなりません。

mac

マシンの MAC アドレス。

この属性に対しては、適合種類が "exact" でなければなりません。 また、 MAC アドレスは 0080c8f6484c のような 形式になります。

linux

システム内にインストールされている Linux パーティションの数。

必ず 0 以上の値になります。

others

システム内にインストールされている Linux 以外のパーティション数。

必ず 0 以上の値になります。

xserver

グラフィックアダプタ向けに用意する必要がある X サーバの種類。

この属性に対しては、適合種類が "exact" でなければなりません。

memsize

マシンで利用可能なメモリ量 (メガバイト単位)

すべての適合種類を利用できます。

totaldisk

マシンで利用可能な全ディスク領域の合計サイズ (メガバイト単位) 。

すべての適合種類を利用できます。

haspcmica

システムに PCMCIA が存在するかどうか (ラップトップなど)

この属性に対しては、適合種類が "exact" でなければなりません。 1 であれば PCMCIA が存在し、 0 であれば存在しない意味になります。

hostid

IP アドレスの 16 進数表記。

この属性に対しては、適合種類が "exact" でなければなりません。

arch

マシンのアーキテクチャ。

この属性に対しては、適合種類が "exact" でなければなりません。

karch

マシンに対するカーネルアーキテクチャの種類 (SMP カーネルや Athon カーネルなど)

この属性に対しては、適合種類が "exact" でなければなりません。

disksize

ドライブデバイスとサイズ

すべての適合種類を利用できます。

product

SMBIOS 内に設定されたハードウエアの製品名。

この属性に対しては、適合種類が "exact" でなければなりません。

product_vendor

SMBIOS 内に設定されたハードウエアの製造元名称。

この属性に対しては、適合種類が "exact" でなければなりません。

board

SMBIOS 内に設定されたシステムボード名。

この属性に対しては、適合種類が "exact" でなければなりません。

board_vendor

SMBIOS 内に設定されたシステムボードの製造元名称。

この属性に対しては、適合種類が "exact" でなければなりません。

custom1-5

シェルスクリプトを使用する独自のルールの出力結果。

すべての適合種類を利用できます。


6.1.7. ダイアログを使用するルール

openSUSE 11.3 またはそれ以降のバージョン (ただし SLES11 SP1 では対応していません) では、 チェックボックス付きのダイアログを表示して、ルールを選択することもできます。

下記の要素は、 rules.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 つのダイアログを表示させたい場合は、指定を行なう必要はありません。

element

それぞれの要素には、それらが別々のダイアログに表示される場合であっても、 唯一の ID を割り当てる必要があります。たとえば 1 つめのダイアログ element=1を指定した場合、 1 つめのダイアログにも 2 つめのダイアログにも、 element=1が再び現れてはなりません。これは <ask> での設定 (こちらは ダイアログが異なれば同じ <element> を設定できます) とは異なる 動作です。

<element config:type="integer">3</element>

任意指定です。何も指定しない場合、 AutoYaST が自動的に番号を設定します。 そのため、ルールに矛盾が発生しないようになっています (下記をお読みください) 。

title

ポップアップのタイトルに表示されるテキストを指定します。

<title>Desktop Selection</title>

任意指定です。

question

チェックボックスの前に表示する文章を指定します。

<question>KDE Desktop</question>

任意指定です。何も指定しないと、このルールを動作させる元と なった XML ファイルの名前が表示されます。

timeout

ダイアログ内の "Ok" ボタンが自動的に押されるまでの制限時間を、 秒単位で指定します。ルールダイアログで自動的にインストールを 進めたいような場合に便利です。

<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/kde.xml</profile>
            <continue config:type="boolean">true</continue>
        </result>
        <dialog>
            <element config:type="integer">0</element>
            <question>KDE 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>

6.2. クラス

クラスとは、目的となるシステムをグループ化して設定したものを指します。 ルールとは異なり、クラスは制御ファイル内で設定し、利用します。

たとえば下記のようにクラスを設定します:

<classes config:type="list">
    <class>
        <class_name>TrainingRoom</class_name>
        <configuration>Software.xml</configuration>
    </class>
</classes>

ここで Software.xml は、 "classes/TrainingRoom/" ディレクトリ内に存在して いなければなりません。また、 AutoYaST のプロファイルやルールと同じ場所に 配置します。

複数のプロファイルが存在していて、これらのプロファイルに共通となる部分が あるような場合、クラス内に共通部を配置するのが適切です。 同じようなことは XIncludes でも実施することができます。

設定管理システム (CMS) を使用する場合は、複数のクラスを作成することができます。 クラスの定義には、下記のような変数があります:

  • Name: クラス名

  • Descriptions: クラスの説明

  • Order: クラスの順序 (優先順位)

図6.2 クラスの定義

クラスの定義

クラスは必要な数だけ自由に作成することができますが、設定の構造を 簡素化させる目的で、できる限り少数にとどめておくことをお勧めします。 たとえば下記のようなクラスを作成します:

  • サイト: 物理的な場所でまとめるためのクラス。

  • マシン: マシンの種類でまとめるためのクラス。

  • 役割: マシンの役割でまとめるためのクラス。

  • グループ: 特定の場所内での部署やグループでまとめるためのクラス。

クラスのディレクトリに保存するファイルは、通常の制御ファイルと同じ書式 ですが、設定の一部分のみを保持します。たとえば特定のコンピュータに対して 特別な設定を行なう、新しい制御ファイルを作成する場合、制御ファイル内には ネットワークの設定を制御する部分のみを記述します。それ以外の共通部分は クラスファイル内に記述することで、それらを合成して使用することができる ようになります。

6.3. ルールとクラスの組み合わせ

自動インストールの際、ルールとクラスを組み合わせて使用することもできます。 たとえばルールを使用してクラス定義を行ない、システムを区別するようなこと ができます。具体的な処理の流れについては、 図A.1「ルールの取得処理」 をお読みください。

ルールの処理とその合成が行なわれると、生成された制御ファイルが処理され、 クラス定義の存在を確認します。クラスが定義されている場合、クラスファイルを 元のリポジトリから取得し、さらに合成処理が行なわれます。

6.4. ルールとクラスの合成

クラスとルールを使用することで、複数の XML ファイルを 1 つの 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 つのパーティションと なり、最初のパーティションは swap とルートパーティションを混ぜたものと なります。また、両方のパーティションに対する mountsize の設定は、いずれも 2 つめのファイルのものを 使用するようになります。 1 つめや 2 つめのパーティションに存在する設定は、 合成されたパーティションにもコピーされます。

この例では、 2 つめの drive が不要と思われます。 2 つの drive は 1 つにまとめられてしまうため、パーティションについては 3 つを指定する必要があります。

[Note]SLES 9/SL 10.0 およびそれ以前のバージョンに対する回避策

SLES9 および SL 10.0 、もしくはそれ以前のバージョンの場合、下記のような 回避策で回避することができます。

下記の方法は、 AutoYaST で公式にサポートしている方法ではありません。 1 つのファイル内にある各パーティションに対して、下記の属性を追加します:

<partition dontmerge="1">
...
</partitions>

新しい属性を設定すると、合成を行なうスクリプトは同じ要素のパーティションを 検出しなくなります。複数のファイルが存在する場合、 dontmerge="2" のようにさらなる属性を設定する必要が あります。

[Note]SLES 10/SL 10.1 およびそれ以降のバージョンに対する解決策

SLES10 および SUSE Linux 10.1 、もしくはそれ以降のバージョンの場合、 下記のような回避策で回避することができます。

ルールまたはクラスファイル内に、 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>

openSUSE AutoYaST 13.1