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

7 ERB 模板 编辑源文件

ERB 模板用于在 AutoYaST 配置中嵌入 Ruby 代码,以便在安装过程中修改配置。通过这种方法,您可以检查系统并调整配置,例如设置值、添加或跳过部分等。

要激活 ERB 处理,配置文件必须具有 .erb 扩展名(例如,autoyast.xml.erb)。因此,无法将规则/类和 ERB 模板结合使用。

7.1 什么是 ERB? 编辑源文件

ERB 代表 嵌入式 Ruby。ERB 使用 Ruby 编程语言的功能来生成不同类型的内容。使用 ERB,您可以将一些 Ruby 代码包含在您的配置中,以便根据安装系统在运行时调整它们。

在使用 ERB 时,Ruby 代码位于 <%%> 符号之间。使用等号 = 将命令输出包含在生成的配置文件中。

示例 7.1:使用 ERB 包含文件
<bootloader>
  <% require "open-uri" %>
  <%= URI.open("http://192.168.1.1/profiles/bootloader-common.xml").read %>
</bootloader> <!-- this line gets replaced with the content of bootloader-common.xml -->

您可以使用 Ruby 功能来运行任意命令。如果想要获取命令的输出,请将其放在反引号之间。如果想要知道命令是否成功,请使用 system 函数运行该命令。

示例 7.2:使用 Ruby 运行命令
<% files = `ls` %> <!-- files contains the output of the command (for instance "file1\nfile2\nfile3") -->
<% success = system("dmidecode | grep some-model") %> <!-- success contains true or false -->

此外,您可以使用更高级的 Ruby 代码结构,例如条件和循环。

示例 7.3:使用 Ruby 结构
<% ip_forward = File.read("/proc/sys/net/ipv4/ip_forward").strip %>
<% if ip_forward == "1" %>
  <!-- something -->
<% end %>

<% files = `ls /tmp/config/*.xml` %>
<% files.split.each do |file| %>
  <%= file.read %>
<% end %>

AutoYaST 提供了一小套 辅助函数,用于从底层系统检索信息,例如 disksnetwork_cards。您可以在 第 7.2 节,“模板辅助程序” 中查看辅助程序及其值的列表。

7.2 模板辅助程序 编辑源文件

模板辅助程序是一组 Ruby 方法,可以在配置文件中使用以检索有关安装系统的信息。

7.2.1 boot_efi? 编辑源文件

boot_efi? 是一个布尔辅助程序,用于返回系统是否使用 EFI 启动。在下面的示例中,配置文件根据当前的启动模式配置引导加载程序。

示例 7.4:配置引导加载程序
<% if env.boot_efi? %>
  <loader_type>grub2-efi</loader_type>
<% else %>
  <loader_type>grub2</loader_type>
<% end %>

7.2.2 disks 编辑源文件

disks 辅助程序返回检测到的磁盘列表。列表中的每个元素包含一些基本信息,例如设备名称或大小。

类型

:device

String

设备内核名称(例如,sda)。

:model

String

磁盘型号

:serial

String

序列号

:size

Integer

磁盘大小(是磁盘扇区的计数)

:udev_names

Array<String>

磁盘 udev 名称列表。您可以使用其中任何一个来引用该设备。

:vendor

String

磁盘供应商名称

下面的配置文件将系统安装到最大的磁盘上。它按大小对现有磁盘列表进行排序,并获取最后一个磁盘。然后,它将 :device 键的值用作 device 元素的值。

示例 7.5:使用最大的磁盘
<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>

7.2.3 network_cards 编辑源文件

network_cards 辅助程序返回网络卡列表,包括它们的名称、状态信息(例如,是否连接等)。

类型

:device

String

设备名称(例如,eth0enp3s0

:mac

String

MAC 地址

:active

布尔值

设备是否处于活动状态

:link

布尔值

设备是否已连接

:vendor

String

磁盘供应商名称

以下示例找到第一个连接到网络的网络卡,并配置它使用 DHCP。

示例 7.6:配置已连接的网络卡
<interfaces t="list">
  <% with_link = netword_cards.sort_by { |n| n[:name] }.find { |n| n[:link] } %>
  <% if with_link %>
    <interface>
      <device><%= with_link[:device] %></device>
      <startmode>auto</startmode>
      <bootproto>dhcp</bootproto>
      </interface>
  <% end >
</interfaces>

7.2.4 os_release 编辑源文件

os_release 辅助程序返回操作系统信息,该信息包含在 /etc/os-release 文件中。

类型

:id

String

发行版 ID(例如,slesopensuse-tumbleweed

:name

String

发行版名称(例如,SLESopenSUSE Tumbleweed

:version

String

发行版版本(例如,15.2

您可以使用此信息来决定安装哪个产品,使用几乎相同的配置来安装所有产品(SLE 或 openSUSE 发行版)。

示例 7.7:为不同的发行版重用相同的配置
<products t="list">
  <% if os_release[:id] == 'sle' %>
  <product>SLES</product>
  <% else %>
  <product>openSUSE</product>
  <% end %>
</products>

7.2.5 hardware 编辑源文件

hardware 辅助程序提供其他硬件信息。它返回 hwinfo 命令的所有信息。您可以使用此辅助程序作为后备,用于那些可用信息通过描述的辅助程序不足的情况。在下一个示例中,hardware 辅助程序用于筛选 USB 设备。请查看 第 7.3 节,“运行 ERB 辅助程序”,以了解如何检查 hardware 辅助程序提供的所有信息。

示例 7.8:筛选 USB 设备
<% usb_disks = hardware["disk"].select { |d| d["driver"] != "usb-storage" } %>

7.3 运行 ERB 辅助程序 编辑源文件

您可以使用 Ruby 控制台运行 AutoYaST ERB 辅助程序,并找出它们提供的内容。所有 ERB 辅助程序都通过 Y2Autoinstallation::Y2ERB::TemplateEnvironment 类的实例访问。通过运行以下命令启动 Ruby 交互式解释器,以 root 用户身份运行:irb -ryast -rautoinstall/y2erb

示例 7.9:运行辅助程序
irb > env = Y2Autoinstallation::Y2ERB::TemplateEnvironment.new  # the env variable gives access to the helpers

irb > env.disks
=>
[{:vendor=>"WDC", :device=>"sda", ...},
 {:vendor=>"TOSHIBA", :device=>"sdb", ...},
...]

irb > env.hardware.keys
=>
["architecture",
 "bios",
 "bios_video",
 ...]

irb > env.hardware["architecture"]
=>
"x86_64"

7.4 渲染 ERB 配置文件 编辑源文件

AutoYaST 命令行提供了一个 check-profile 命令,可用于从 ERB 文件生成配置文件。此命令要求 AutoYaST 解析、运行 ERB 代码并生成生成的配置文件。您可以检查渲染的配置文件,以检查一切是否按预期工作。请参阅命令帮助以获取它支持的所有选项:autoyast check-profile --help。在下面的示例中,check-profile 要求 AutoYaST 下载和解析配置文件,解释 ERB 代码并运行预脚本。结果将转储到 result.xml 文件中。

示例 7.10:渲染配置文件
 > sudo yast2 autoyast check-profile filename=http://192.168.1.100/autoinst.erb output=result.xml run-scripts=true run-erb=true
Warning
警告:check-profile 权限

在大多数情况下,check-profile 需要 root 权限,因此在以 root 用户身份运行预安装脚本和 ERB 配置文件时请务必小心。仅使用您信任的配置文件。

7.5 调试 ERB 配置文件 编辑源文件

对于您想要停止 ERB 评估并检查正在发生的事情的情况,YaST 提供了与 byebug 调试器集成。安装 rubygem(byebug) 包并将 Y2DEBUGGER 环境变量设置为 1。

示例 7.11:准备调试环境
> sudo zypper --non-interactive in "rubygem(byebug)"
> sudo Y2DEBUGGER=1 yast2 autoyast check-profile ...

添加断点就像在您想要停止的地方添加 <% byebug %> 一样简单。有关 byebug 的更多信息,请参阅 https://github.com/deivid-rodriguez/byebug

示例 7.12:添加断点
<% byebug %>
<% if system("dmidecode | grep some-model") %>
  <!-- do something -->
%<% end %>

7.6 ERB 与规则和类的比较 编辑源文件

虽然 ERB 和规则/类都能够动态生成配置文件,但通常 ERB 配置文件更易于阅读和理解。一个重要的区别是,规则和类可以合并配置文件,而 ERB 不能。有关合并配置文件的更多信息,请参阅 第 6 章,规则和类。另一方面,ERB 带来了高级语言 Ruby 的所有功能。让我们看一个使用两者的示例。在下面的示例中,如果它存在,我们想要将 /home 目录放在 /dev/sdb 中。

示例 7.13:规则和类
<rule>
  <custom1>
    <script>
if blkid | grep /dev/sdb > /dev/null; then
echo -n "yes"
else
echo -n "no"
fi;
    </script>
    <match>yes</match>
    <match_type>exact</match_type>
  </custom1>
  <result>
    <profile>classes/sdb_home.xml</profile>
    <dont_merge config:type="list">
      <element>partition</element>
    </dont_merge>
  </result>
</rule>
示例 7.14:ERB
<% home_in_sdb = disks.map { |d| d[:device] }.include?("sdb") %>

<partitioning config:type="list">
  <drive>
    ...
  </drive>
  <% if home_in_sdb %>
  <drive>
    <device>/dev/sdb</device>
    <disklabel>none</disklabel>
    <partitions t="list">
      <partition>
        <format t="boolean">true</format>
        <filesystem t="symbol">xfs</filesystem>
        <mount>/home</mount>
      </partition>
    </partitions>
  </drive>
  <% end %>
</partitioning>
打印此页面