6.5. 使用设备生命周期 hook
Red Hat Edge Manager 代理可以使用设备生命周期 hook 在设备生命周期的特定点运行用户定义的命令。例如,您可以在操作系统镜像中添加 shell 脚本,以备份应用程序数据。然后,您可以指定该脚本必须成功运行并成功完成,然后才能代理开始更新操作系统。
另外,当磁盘上的文件发生变化时,某些应用程序或系统服务不会自动重新载入其配置文件。您可以将命令指定为另一个 hook (在代理完成更新过程后调用)来手动重新载入配置文件。
支持以下设备生命周期 hook:
| 生命周期 Hook | 描述 |
|---|---|
|
| 在代理准备更新并在实际更改系统之前,会调用此 hook。如果此 hook 中的操作返回失败,代理会取消更新。 |
|
| 代理将更新写入到磁盘后,会调用此 hook。如果此 hook 中的操作返回失败,代理会取消并回滚更新。 |
|
| 在系统重启前会调用此 hook。代理会阻止重启,直到运行操作完成或超时为止。如果此 hook 中的任何操作返回失败,代理会取消并回滚更新。 |
|
| 当代理重启后首先启动时,会调用此 hook。如果此 hook 中的任何操作返回失败,代理会报告这个信息,但将继续启动。 |
6.5.1. 规则文件 复制链接链接已复制到粘贴板!
您可以通过在设备文件系统中的以下位置之一中添加规则文件来定义设备生命周期 hook:
-
/usr/lib/flightctl/hooks.d/<lifecycle_hook_name>/ drop-in 目录中的规则是只读的。要向/usr目录添加规则,您必须在镜像构建过程中将它们添加到操作系统镜像中。 -
/etc/flightctl/hooks.d/<lifecycle_hook_name>/drop-in 目录中的规则是 read-writable。您可以使用多种方法在运行时更新规则。
在创建并放置文件时,您必须考虑以下实践:
- 规则的名称必须是所有小写。
- 如果您在两个位置定义了规则,则规则将合并。
- 如果您在生命周期 hook 目录中添加多个规则文件,则会按照文件名的字典顺序处理这些文件。
-
如果您在两个位置定义了具有相同文件名的文件,
/etc文件夹中的文件优先于/usr文件夹中同名的文件。
规则文件以 YAML 格式编写,具有一个或多个操作的列表。操作可以是运行外部命令的指令。
当您为 hook 指定很多操作时,会按顺序执行操作,然后再开始下一个操作。
如果某个操作返回失败,则会跳过以下操作。
run 操作采用以下参数:
| 参数 | 描述 |
|
|
要运行的命令的绝对路径,后跟任何标志或参数,如 |
|
| 可选。键值对列表,以设置为命令的环境变量。 |
|
| 可选。命令从其中运行该命令的目录。 |
|
|
可选。允许操作完成的最长时间。将持续时间指定为单个正整数,后跟一个时间单位。支持 |
|
| 可选。运行该操作需要满足的条件列表。如果没有提供,则操作将无条件地运行。 |
默认情况下,系统会在每次触发 hook 时执行操作。但是,对于在更新 hook 后,您可以使用 If 参数添加执行某个操作必须满足 true 的条件。否则,会跳过该操作。
例如,只有在更新期间给定文件或目录更改时才会运行操作,您可以定义采用以下参数的路径条件:
| 参数 | 描述 |
|
| 到必须在更新期间更改的文件或目录的绝对路径,作为要执行的操作的条件。使用正斜杠(/)指定路径:
|
|
|
文件操作列表, |
如果您在 更新 hook 后 为操作指定路径条件,您可以在命令的参数中包含以下变量,并替换为更改文件的绝对路径:
| 变量 | 描述 |
|
| 路径条件中指定的文件或目录的绝对路径。 |
|
| 在更新过程中更改的文件的空格分隔列表,由路径条件涵盖。 |
|
| 在更新期间创建的文件的空格分隔列表,由路径条件涵盖。 |
|
| 在更新过程中更新的文件的绝对路径以空格分隔,由路径条件涵盖。 |
|
| 在更新过程中删除的文件的空格分隔列表,由路径条件涵盖。 |
Red Hat Edge Manager 代理包含 /usr/lib/flightctl/hooks.d/afterupdating/00-default.yaml 中定义的一组内置规则。如果更改了某些文件,则执行以下命令:
| File | 命令 | 描述 |
|
|
|
通过向 |
|
|
|
对 |
|
|
|
对 |
其他资源