跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.6

6 规则和类 编辑源文件

规则和类允许以不同的方式定制机器集的安装

  • 规则允许根据系统的属性配置系统。

  • 类表示目标系统组的配置。可以将类分配给系统。

Note
注意:仅使用 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(目录名称末尾的斜杠很重要)。

Rules
图 6.1: 规则

如果适用多个规则,则最终控制文件将通过合并脚本动态生成。合并过程基于规则的顺序,后面的规则会覆盖早期规则中的配置数据。请注意,为了使合并成功,合并的 XML 文件中顶级部分的名称必须按字母顺序排列。

使用规则文件是可选的。如果未找到规则文件,系统安装将以标准方式进行,即使用提供的控制文件或根据系统的 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/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 属性,您可以为具有不同大小硬盘的系统提供不同的配置。第一个规则检查设备 /dev/sdc 是否可用,以及是否大于 1 GB,使用 match 属性。

规则至少需要一个属性才能匹配。如果您需要检查更多属性,例如内存或架构,则可以将更多属性添加到规则资源中,如下一个示例所示。

示例 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/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 为规则提供的属性不足以满足您的需求,请使用自定义规则。自定义规则包含一个 shell 脚本。脚本的输出(忽略 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>

此规则中的脚本可以回显 intelnon_intel 到 STDOUT(在这种情况下,grep 命令的输出必须重定向到 /dev/null)。规则脚本的输出将在两个 '@' 字符之间填充,以确定要获取的控制文件的文件名。AutoYaST 将读取输出并获取名为 intel.xmlnon_intel.xml 的文件。此文件可以包含软件选择的 AutoYaST 配置部分;例如,如果您希望在 Intel 硬件上与其它硬件不同的软件选择。

自定义规则的数量限制为五个。因此,您可以使用 custom1custom5

6.1.3 规则的匹配类型 编辑源文件

您可以使用五种不同的 match_type

  • exact(默认值)

  • greater

  • lower

  • range

  • regex(类似于 Bash 中的一个简单的 `=~` 运算符)

如果使用 exact,则字符串必须完全匹配指定的字符串。 regex 可用于匹配子字符串,例如 ntel 将匹配 Intel、intel 和 intelligent。 greaterlower 可用于 memsizetotaldisk 例如。它们只能与返回整数值的规则匹配。范围也仅适用于整数值,形式为 value1-value2,例如 512-1024

6.1.4 组合属性 编辑源文件

可以通过逻辑运算符组合多个属性。如果 disksize 大于 1GB 或 memsize 恰好为 512MB,则可以允许规则匹配。

您可以使用 rules.xml 文件中的 operator 元素来执行此操作。 andor 是可能的运算符,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 进程(例如安装程序)正在运行时,此命令将无法工作。因此,您无法在安装过程中运行它。

表 6.1: 系统属性

属性

描述

hostaddress

主机的 IP 地址

此属性必须始终完全匹配。

主机名

主机的名称

此属性必须始终完全匹配。

domain

主机域名

此属性必须始终完全匹配。

installed_product

要安装的产品的名称。

此属性必须始终完全匹配。

installed_product_version

要安装的产品的版本。

此属性必须始终完全匹配。

network

主机的网络地址

此属性必须始终完全匹配。

mac

主机的 MAC 地址

此属性必须始终完全匹配(MAC 地址应为 0080c8f6484c 形式)。

linux

系统上安装的 Linux 分区数

此属性可以是 0 或更多。

others

系统上安装的非 Linux 分区数

此属性可以是 0 或更多。

xserver

图形适配器所需的 X 服务器

此属性必须始终完全匹配。

memsize

主机上可用的内存,以兆字节为单位

所有匹配类型都可用。

totaldisk

主机上可用的总磁盘空间,以兆字节为单位

所有匹配类型都可用。

hostid

IP 地址的十六进制表示

需要精确匹配

arch

主机的架构

需要精确匹配

karch

主机的内核架构(例如 SMP 内核、Xen 内核)

需要精确匹配

disksize

驱动器设备和大小,以兆字节为单位

所有匹配类型都可用。

product

硬件产品名称,如 SMBIOS 中指定

需要精确匹配

product_vendor

硬件供应商,如 SMBIOS 中指定

需要精确匹配

board

系统板名称,如 SMBIOS 中指定

需要精确匹配

board_vendor

系统板供应商,如 SMBIOS 中指定

需要精确匹配

custom1-5

使用 shell 脚本的自定义规则

所有匹配类型都可用。

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。在对话框 1 上使用 id 1,在对话框 2 上使用 id 1 不受支持。(此行为与 ask 对话框相反,您可以在多个对话框中使用相同的 ID。)

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

可选。如果省略,AutoYaST 会在其内部添加自己的 ID。然后,您无法指定冲突的规则(请参阅下文)。

title

弹出对话框的标题

<title>Desktop Selection</title>

可选

question

在复选框后面的对话框中显示的提示。

<question>GNOME Desktop</question>

可选。如果您未在此处配置文本,AutoYaST 将显示触发此规则的 XML 文件的名称。

timeout

对话框自动“按下”确定按钮之前的秒数。在与规则对话框结合使用时,对于非阻止安装很有用。

<timeout config:type="integer">30</timeout>

可选。如果缺少超时设置,安装过程将停止,直到用户确认对话框。

冲突

一个元素 ID(规则)列表,这些 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。

使用配置管理系统,您可以定义一组类。类定义由以下变量组成

  • 名称:类名

  • 描述

  • 顺序:类在迁移堆栈中的顺序(或优先级)

Defining classes
图 6.2: 定义类

您可以创建尽可能多的类,但是建议保持类的数量尽可能少,以使配置系统简洁。例如,可以使用以下类集

  • 站点:描述物理位置或站点的类,

  • 机器:描述机器类型的类,

  • 角色:描述机器功能的类,

  • 组:描述站点或位置内的部门或组的类。

保存在类目录中的文件可以具有与常规控制文件相同的语法和格式,但代表配置的子集。例如,要为具有特定网络接口的计算机创建新的控制文件,您只需要控制网络配置的资源控制文件。如果您有多种网络类型,可以将专为特定硬件类型设计的网络类型与其他类文件合并,并创建一个适合正在安装的系统的新的控制文件。

6.3 混合使用规则和类 编辑源文件

在自动安装会话期间,可以混合使用规则和类。例如,您可以使用包含类定义的规则来标识系统。该过程如图 图 A.1,“规则检索过程” 中所示。

检索并合并规则后,将解析生成的控制文件并检查是否存在类定义。如果定义了类,则将从原始存储库检索类文件,并启动新的合并过程。

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>

您可能期望控制文件包含三个分区。事实并非如此。您最终将获得两个分区,并且第一个分区是交换分区和根分区的混合。在两个文件中配置的设置,例如 mountsize,将使用第二个文件中的设置。仅存在于第一个或第二个分区中的设置,也将复制到合并的分区中。

在此示例中,您不希望有第二个 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>
打印此页面