四月份,我们宣布了 AutoYaST 现代化改造计划。 我们的想法不是重写 AutoYaST,而是引入一些新功能,移除一些限制并提高代码质量。

虽然这些目标并非一成不变,但我们对想要引入的更改有一些想法。 然而,当我们开始工作时,很快就意识到我们需要调整我们的路线图。 因此,如果您将我们最初的公告与最终结果进行比较,您会发现许多差异。

本文描述了最相关的更改。 如果您想尝试任何这些功能,它们已经可以在 openSUSE Tumbleweed 中使用。

减小配置文件的尺寸

当 AutoYaST 从现有系统生成配置文件时,它会包含大量信息以重现安装过程。 因此,这些配置文件相当长,这使得使用它们变得非常烦人。

然而,何时可以安全地从配置文件中省略一些信息而不影响最终结果并不总是很清楚。 为了解决这个问题,我们决定引入“目标”的概念。 因此,在生成配置文件时,您可以要求 AutoYaST 生成更紧凑的配置文件。

# yast2 clone_system modules target=compact filename=autoinst-compact.xml

在我的当前机器上,配置文件的尺寸从 2201 行减少到仅 834 行。 但是,省略了哪些信息? 让我们列举一些项目

  • 系统用户和组。
  • 未修改的防火墙区域。
  • 预设未更改的系统服务。
  • 如果禁用了 cups 服务,则打印机设置。

请注意,并非所有 YaST 模块都支持此标志。 实际上,在某些情况下,这毫无意义。

更容易编写动态配置文件

在处理多个系统的安装时,使用单个配置文件并在运行时适应正在安装的系统可能很有用。 AutoYaST 已经提供了两种机制来实现此行为:规则和类预安装脚本

然而,我们认为如果您可以在配置文件中嵌入 Ruby (ERB) 代码,可能会更容易。 想法是提供一组辅助函数,您可以使用它们来检查系统并调整配置文件,例如设置值、添加或跳过部分等。 这听起来很棒,对吧? 让我们看一个简单的例子。

下面的代码通过对磁盘大小进行排序来查找最大的磁盘,并设置 device 元素的值。

<partitioning t="list">
  <drive>
    <% disk = disks.sort_by { |d| d[:size] }.last %> <!-- find the largest disk -->
    <device><%= disk[:device] %></device> <!-- print the disk device name -->
    <initialize t="boolean">true</initialize>
    <use>all</use>
  </drive>
</partitioning>

当然,除了辅助函数集(disksnetwork_cardsos_releasehardware)之外,您还可以使用 Ruby 的强大功能。 例如,从远程位置检索整个部分怎么样? 在某种程度上,它可以取代类和规则功能。

<bootloader>
  <% require "open-uri" %>
  <%= URI.open("http://192.168.1.1/profiles/bootloader-common.xml").read %>
</bootloader>

不幸的是,此功能的文档仍在 进行中。 但是,我们预计在未来几周内可以完成它。

改进脚本支持

除了介绍对 ERB 的支持,如前一节所述,我们还改进了脚本处理。 迄今为止,Shell、Perl 和 Python 是唯一支持的脚本语言。 我们删除了此限制,现在您可以使用安装时可用的任何解释器。 此外,可以向解释器传递自定义选项。

<intepreter>/usr/bin/bash -x</interpreter>

此外,我们修复了一些问题并扩展了错误处理,以便在脚本未成功运行时通知用户。

验证配置文件

构建和调整配置文件可能是一项耗时的任务。 AutoYaST 提供 基于 XML 的验证,但您可以检测到的错误类型相当有限。

为了让您的生活更轻松,我们引入了以下新功能来利用配置文件验证

  • 运行时自动配置文件验证。
  • 一个新的 check-profile 命令,用于在不运行安装程序的情况下检测错误。

当 AutoYaST 获取配置文件时,它会自动执行基于 XML 的验证,并报告找到的任何错误。 即使您正在使用诸如“规则和类”或“动态配置文件”之类的功能,它也有效。 但是,可以通过在启动安装程序时将 YAST_SKIP_XML_VALIDATION 参数设置为 1 来轻松禁用它。

关于 check-profile,它基本上使用了 AutoYaST 初始化期间运行的部分代码。 它包括

  • 配置文件获取(甚至从远程位置)。
  • 基于 XML 的验证。
  • 对动态配置文件的支持:规则和类、ERB 和预安装脚本(可选)。
  • 可选地,检测配置文件导入期间出现的问题。

不必说,您应该谨慎运行此命令。 请记住,ERB 和预安装脚本可以运行任何任意代码。 事实上,我们正在与我们的安全专家合作,使此命令更安全。 有关更多详细信息,请参阅 bsc#1177123

减少第二阶段

与正常安装不同,AutoYaST 仍然使用两个阶段,这些阶段被称为“阶段”。 第一阶段负责大部分安装任务:分区、注册、软件安装、网络配置等。 根据配置文件的内容,第二阶段将在第一次重新启动后发挥作用。 它负责其他配置过程,例如设置防火墙规则、启用/禁用服务等。

为了减少对“第二阶段”的需求,我们将多个部分的处理移动到“第一阶段”。 目前,这些部分在此阶段处理:bootloaderconfiguration_managementfilesfirewallhostkdumpkeyboardlanguagenetworkingpartitioningrunlevelscripts(不包括“第二阶段”处理的 post-scriptsinit-scripts)、securityservices-managersoftwaressh_importsuse_registertimezoneusers。 因此,如果您的配置文件不包含任何其他部分,您可以放心地禁用“第二阶段”。

<general>
  <mode>
    <second_stage t="boolean">false</second_stage>
  </mode>
 </general>

更好的 UI 来定义分区部分

AutoYaST 提供的用户界面来定义分区部分令人困惑、有缺陷且功能有限。 因此,我们抓住机会,基本上重写了整个部分。

AutoYaST UI for the partitioning section

它仍在进行中,但它已经比旧版本好得多。 例如,除了磁盘和 LVM 之外,它还支持定义 RAID、bcache 和多设备 Btrfs 文件系统的部分。

值得注意的是,这些更改已经可以在 openSUSE 15.2 和 SUSE Linux Enterprise 15 SP2 中使用,因此您无需等到 15.3 或 SP3 即可享受它们。

结论

新功能和错误修复是最明显的变化。 然而,作为这个过程的一部分,我们重构了大量的代码,提高了代码覆盖率,扩展了文档等。 总的来说,我们认为我们以一种合理的方式提高了 AutoYaST 的质量。 我们希望您将来也有同样的印象。