6 规则和类 #
使用规则和类可通过不同的方式自定义计算机集的安装:
- 使用规则可以根据系统的属性配置系统。 
- 类代表目标系统组的配置。类可指派到系统。 
autoyast 引导选项
   只有引导参数 autoyast=URL 支持规则和类。
  
   不支持 autoyast2=URL,因为此选项只下载单个 AutoYaST 控制文件。
  
6.1 基于规则的自动安装 #
使用规则可以根据系统属性,通过在安装期间合并多个控制文件来配置系统。基于规则的安装由规则文件控制。
例如,使用这种方法可以一次性在两个部门安装系统。假设存在这样的场景:部门 A 的计算机需安装为办公桌面,而部门 B 的计算机需安装为开发人员工作站。您需要创建包含两种不同规则的规则文件。对于每个规则,可以使用不同的系统参数将两项安装区分开来。每个规则还包含每个部门的相应配置文件的链接。
规则文件是一个 XML 文件,包含您想要自动安装的每组系统(或单个系统)的规则。一组规则可以根据一个或多个系统属性来区分系统组。通过所有规则后,每组系统将链接到一个控制文件。规则文件和控制文件都必须位于预定义且可访问的位置。
   仅当未使用 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 地址搜索控制文件的标准方式来继续系统安装。
6.1.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/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>
    最后一个示例定义两个规则,并为每个规则提供了不同的控制文件。本例中使用的规则是 disksize。分析规则文件后,YaST 会尝试将目标系统与 rules.xml 文件中的规则进行匹配。如果目标系统与规则中定义的所有系统属性相匹配,即表示规则匹配。如果系统与规则匹配,则相应的资源将被添加到由 AutoYaST 用来创建最终控制文件的控制文件堆栈。continue 属性会告知 AutoYaST 在找到匹配项后其是否应继续处理其他规则。
   
如果第一个规则不匹配,将检查列表中的下一个规则,直到发现匹配为止。
    使用 disksize 属性可为使用大小不同硬盘的系统提供不同的配置。第一个规则使用 match 属性检查设备 /dev/sdc 是否可用,以及其大小是否超过 1 GB。
   
一个规则必须至少包含一个要匹配的属性。如果您需要检查多个属性(例如内存或体系结构),可按下一个示例所示在规则资源中添加更多属性。
以下示例说明如何使用规则文件检索使用已知硬件的客户端的配置。
<?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 位置搜索规则文件。
   
6.1.2 自定义规则 #
如果 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)。将在两个“@”字符之间填充规则脚本的输出,以确定要提取的控制文件的文件名。AutoYaST 将读取该输出,并提取名为 intel.xml 或 non_intel.xml 的文件。此文件可以包含用于选择软件的 AutoYaST 配置文件部分;例如,如果您想在 Intel 硬件上(而不是其他硬件上)选择不同的软件。
   
    自定义规则的数量限于 5 个。因此您可以使用 custom1 到 custom5。
   
6.1.3 规则的匹配类型 #
可以使用五种不同的匹配类型:
- exact(默认)
- greater
- lower
- range
- regex(类似于 Bash 中的简单- =~运算符)
    如果使用 exact,则字符串必须与指定的值完全匹配。regex 可用于匹配子字符串,例如,ntel 将匹配 Intel、intel 和 intelligent。例如,可以使用 greater 和 lower 来匹配 memsize 或 totaldisk。它们只能匹配返回整数值的规则。范围也仅适用于整数值且格式为 value1-value2,例如 512-1024。
   
6.1.4 合并属性 #
    可以通过逻辑运算符合并多个属性。如果 disksize 大于 1GB 或 memsize 正好为 512MB,则可让规则匹配。
   
    为此,可以在 rules.xml 文件中使用 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>6.1.5 规则文件结构 #
rules.xml 文件需要:
   
- 至少包含一个规则; 
- 名为 - rules.xml;
- 位于配置文件储存库的 - rules目录中;
- 至少包含一个要在规则中匹配的属性。 
6.1.6 预定义的系统属性 #
下表列出了您可以在规则文件中匹配的预定义系统属性。
    如果您不确定系统上的某个值,请运行 /sbin/yast2 ayast_probe ncurses。可以在显示检测到的值的文本框中滚动浏览。请注意,当另一个需要锁定的 YaST 进程(例如安装程序)正在运行时,此命令将无效。因此,在安装期间无法运行此命令。
   
| 属性 | 值 | 说明 | 
|---|---|---|
| 
 | 主机的 IP 地址 | 此属性必须始终完全匹配。 | 
| 
 | 主机的名称 | 此属性必须始终完全匹配。 | 
| 
 | 主机的域名 | 此属性必须始终完全匹配。 | 
| 
 | 要安装的产品的名称。 | 此属性必须始终完全匹配。 | 
| 
 | 要安装的产品的版本。 | 此属性必须始终完全匹配。 | 
| 
 | 主机的网络地址 | 此属性必须始终完全匹配。 | 
| 
 | 主机的 MAC 地址 | 
         此属性必须始终完全匹配(MAC 地址应采用  | 
| 
 | 在系统上安装的 Linux 分区数 | 此属性可为 0 或更大。 | 
| 
 | 在系统上安装的非 Linux 分区数 | 此属性可为 0 或更大。 | 
| 
 | 图形适配器所需的 X 服务器 | 此属性必须始终完全匹配。 | 
| 
 | 主机上可用的内存,以 MB 为单位 | 可以使用所有匹配类型。 | 
| 
 | 主机上可用的总磁盘空间,以 MB 为单位 | 可以使用所有匹配类型。 | 
| 
 | IP 地址的十六进制表示形式 | 必须完全匹配 | 
| 
 | 主机的体系结构 | 必须完全匹配 | 
| 
 | 主机的内核体系结构(例如 SMP 内核、Xen 内核) | 必须完全匹配 | 
| 
 | 驱动器设备和大小(以 MB 为单位) | 可以使用所有匹配类型。 | 
| 
 | SMBIOS 中指定的硬件产品名称 | 必须完全匹配 | 
| 
 | SMBIOS 中指定的硬件供应商 | 必须完全匹配 | 
| 
 | SMBIOS 中指定的系统主板名称 | 必须完全匹配 | 
| 
 | SMBIOS 中指定的系统主板供应商 | 必须完全匹配 | 
| 
 | 使用外壳脚本的自定义规则 | 可以使用所有匹配类型。 | 
6.1.7 使用对话框选择规则 #
您可以使用包含复选框的弹出对话框来选择您要匹配的规则。
    下面列出的元素必须放在 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> - 此元素是可选的,缺少的 dialog_nr 的默认值始终为 - 0。要为所有规则使用一个弹出对话框,无需指定- dialog_nr。
- element
- 指定唯一 ID。即使您有多个对话框,也不能两次使用同一 ID。不支持对对话框 和对话框 2 都使用 ID - 1- 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>6.2 类 #
类代表目标系统组的配置。与规则不同,类需要在控制文件中进行配置。然后,可将类指派到目标系统。
下面是一个类定义示例:
<classes config:type="list">
  <class>
    <class_name>TrainingRoom</class_name>
    <configuration>Software.xml</configuration>
  </class>
</classes>
   在上面的示例中,Software.xml 文件必须放在 classes/TrainingRoom/ 子目录中。系统会从 AutoYaST 控制文件和规则所在的相同位置提取该文件。
  
如果您有多个控制文件,并且这些控制文件共享某些部分,则最好是对公用部分使用类。 您也可以使用 XIncludes。
使用配置管理系统可以定义一组类。类定义包括以下变量:
- 名称:类名 
- 说明: 
- 顺序:该类在迁移堆栈中的顺序(或优先级) 
您可以根据需要创建多个类别,但建议尽量保持小规模的类别组从而确保配置系统的简洁。例如,可使用以下一组类:
- site:描述实际位置或站点的类; 
- machine:描述计算机类型的类; 
- role:描述计算机功能的类; 
- group:描述某个站点或位置中某个部门或组的类。 
在类目录中保存的文件可以采用与常规控制文件相同的语法和格式,只是表示为配置的子集。例如,要为具有特定网络接口的计算机创建新的控制文件,只需使用用于控制网络配置的控制文件资源。如果具有多个网络类型,可将特殊硬件类型所需的网络类型与其他类文件合并,然后创建适合所要安装的系统的新控制文件。
6.3 混合规则和类 #
可以在自动安装期间混合规则和类别。例如您可以用包含类定义的规则来确定系统。图 A1 “规则检索过程”中描述了该过程。
检索并合并规则后,将在生成的控制文件中分析并检查类定义。如果定义了类别,那么将从原始储存库中检索类文件并启动新的合并进程。
6.4 合并规则和类 #
通过类和规则,多个 XML 文件将合并成一个最终的 XML 文件。此合并过程常常让人感到迷惑,因为它的行为与期望大相径庭。首先请务必注意,合并的 XML 文件中前几个部分的名称必须遵循字母顺序,这样才能成功合并。
例如,应该合并以下两个 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>
   您可能预期控制文件将包含三个分区。事实并非如此。您最终会得到两个分区,第一个分区是由交换分区和根分区混合构成的。系统将从第二个文件使用这两个分区中配置的设置(例如 mount 或 size)。仅存在于第一或第二个分区中的设置也将复制到合并后的分区。
   
  
   在此示例中,您不想要第二个 drive。两个驱动器应合并成一个。对于分区,应定义三个独立的分区。使用 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>
