ERB 模板用于在 AutoYaST 配置中嵌入 Ruby 代码,以便在安装过程中修改配置。通过这种方法,您可以检查系统并调整配置,例如设置值、添加或跳过部分等。
要激活 ERB 处理,配置文件必须具有 .erb 扩展名(例如,autoyast.xml.erb)。因此,无法将规则/类和 ERB 模板结合使用。
ERB 代表 嵌入式 Ruby。ERB 使用 Ruby 编程语言的功能来生成不同类型的内容。使用 ERB,您可以将一些 Ruby 代码包含在您的配置中,以便根据安装系统在运行时调整它们。
在使用 ERB 时,Ruby 代码位于 <% 和 %> 符号之间。使用等号 = 将命令输出包含在生成的配置文件中。
<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 函数运行该命令。
<% 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 代码结构,例如条件和循环。
<% 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 提供了一小套 辅助函数,用于从底层系统检索信息,例如 disks 或 network_cards。您可以在 第 7.2 节,“模板辅助程序” 中查看辅助程序及其值的列表。
模板辅助程序是一组 Ruby 方法,可以在配置文件中使用以检索有关安装系统的信息。
boot_efi? 是一个布尔辅助程序,用于返回系统是否使用 EFI 启动。在下面的示例中,配置文件根据当前的启动模式配置引导加载程序。
<% if env.boot_efi? %> <loader_type>grub2-efi</loader_type> <% else %> <loader_type>grub2</loader_type> <% end %>
disks 辅助程序返回检测到的磁盘列表。列表中的每个元素包含一些基本信息,例如设备名称或大小。
|
键 |
类型 |
值 |
|---|---|---|
|
|
String |
设备内核名称(例如, |
|
|
String |
磁盘型号 |
|
|
String |
序列号 |
|
|
Integer |
磁盘大小(是磁盘扇区的计数) |
|
|
Array<String> |
磁盘 udev 名称列表。您可以使用其中任何一个来引用该设备。 |
|
|
String |
磁盘供应商名称 |
下面的配置文件将系统安装到最大的磁盘上。它按大小对现有磁盘列表进行排序,并获取最后一个磁盘。然后,它将 :device 键的值用作 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>network_cards 辅助程序返回网络卡列表,包括它们的名称、状态信息(例如,是否连接等)。
|
键 |
类型 |
值 |
|---|---|---|
|
|
String |
设备名称(例如, |
|
|
String |
MAC 地址 |
|
|
布尔值 |
设备是否处于活动状态 |
|
|
布尔值 |
设备是否已连接 |
|
|
String |
磁盘供应商名称 |
以下示例找到第一个连接到网络的网络卡,并配置它使用 DHCP。
<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>os_release 辅助程序返回操作系统信息,该信息包含在 /etc/os-release 文件中。
|
键 |
类型 |
值 |
|---|---|---|
|
|
String |
发行版 ID(例如, |
|
|
String |
发行版名称(例如, |
|
|
String |
发行版版本(例如, |
您可以使用此信息来决定安装哪个产品,使用几乎相同的配置来安装所有产品(SLE 或 openSUSE 发行版)。
<products t="list"> <% if os_release[:id] == 'sle' %> <product>SLES</product> <% else %> <product>openSUSE</product> <% end %> </products>
hardware 辅助程序提供其他硬件信息。它返回 hwinfo 命令的所有信息。您可以使用此辅助程序作为后备,用于那些可用信息通过描述的辅助程序不足的情况。在下一个示例中,hardware 辅助程序用于筛选 USB 设备。请查看 第 7.3 节,“运行 ERB 辅助程序”,以了解如何检查 hardware 辅助程序提供的所有信息。
<% usb_disks = hardware["disk"].select { |d| d["driver"] != "usb-storage" } %>您可以使用 Ruby 控制台运行 AutoYaST ERB 辅助程序,并找出它们提供的内容。所有 ERB 辅助程序都通过 Y2Autoinstallation::Y2ERB::TemplateEnvironment 类的实例访问。通过运行以下命令启动 Ruby 交互式解释器,以 root 用户身份运行:irb -ryast -rautoinstall/y2erb。
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"AutoYaST 命令行提供了一个 check-profile 命令,可用于从 ERB 文件生成配置文件。此命令要求 AutoYaST 解析、运行 ERB 代码并生成生成的配置文件。您可以检查渲染的配置文件,以检查一切是否按预期工作。请参阅命令帮助以获取它支持的所有选项:autoyast check-profile --help。在下面的示例中,check-profile 要求 AutoYaST 下载和解析配置文件,解释 ERB 代码并运行预脚本。结果将转储到 result.xml 文件中。
>sudoyast2 autoyast check-profile filename=http://192.168.1.100/autoinst.erb output=result.xml run-scripts=true run-erb=true
check-profile 权限在大多数情况下,check-profile 需要 root 权限,因此在以 root 用户身份运行预安装脚本和 ERB 配置文件时请务必小心。仅使用您信任的配置文件。
对于您想要停止 ERB 评估并检查正在发生的事情的情况,YaST 提供了与 byebug 调试器集成。安装 rubygem(byebug) 包并将 Y2DEBUGGER 环境变量设置为 1。
>sudozypper --non-interactive in "rubygem(byebug)">sudoY2DEBUGGER=1 yast2 autoyast check-profile ...
添加断点就像在您想要停止的地方添加 <% byebug %> 一样简单。有关 byebug 的更多信息,请参阅 https://github.com/deivid-rodriguez/byebug。
<% byebug %>
<% if system("dmidecode | grep some-model") %>
<!-- do something -->
%<% end %>虽然 ERB 和规则/类都能够动态生成配置文件,但通常 ERB 配置文件更易于阅读和理解。一个重要的区别是,规则和类可以合并配置文件,而 ERB 不能。有关合并配置文件的更多信息,请参阅 第 6 章,规则和类。另一方面,ERB 带来了高级语言 Ruby 的所有功能。让我们看一个使用两者的示例。在下面的示例中,如果它存在,我们想要将 /home 目录放在 /dev/sdb 中。
<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><% 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>