9.2. 使用 Foreman Hook


Foreman 的主机编排可以通过 hook 进行扩展,以便执行其他任务。Foreman hook 在发生编配事件时(任何可执行脚本)启用触发脚本(如创建主机或主机调配完成时)。此外,可以在任何 Foreman 对象的标准 Rails 回调中(所有带有脚本)进行 hook。
注意
Foreman hook 可以修改 Satellite 中的工作流,因此您可能会被要求删除所有 hook,以便从红帽获得支持。在升级前,还需要删除 Foreman hook,然后在确认 Satellite 按预期工作后再恢复。
Foreman hook 由 cmdline -rubygem-foreman_hooks 软件包提供,该软件包默认安装。如果需要,要确保软件包已安装,并以 root 用户身份输入 :
# yum install tfm-rubygem-foreman_hooks
Loaded plugins: product-id, search-disabled-repos, subscription-manager
Package tfm-rubygem-foreman_hooks-0.3.9-2.el7sat.noarch already installed and latest version
Nothing to do
Foreman hook 存储在 /usr/share/foreman/config/hooks/ 中。必须为每个 Foreman 对象创建一个子目录,并为每个事件名称创建额外的子目录。Foreman 对象可以是主机或网络接口。hook 的路径如下:
/usr/share/foreman/config/hooks/object/event/hook_script
例如,要在主机完成操作系统安装后为要激活的 hook 创建子目录,请输入命令,如下所示:
# mkdir -p /usr/share/foreman/config/hooks/host/managed/before_provision/
如果您下载了一个脚本,并且已经创建了正确的命名目录,请按以下方式使用 install 命令来确保 SELinux 上下文正确:
install hook_script /usr/share/foreman/config/hooks/object/event/hook_script
Alternately,如果您在事件子目录中直接创建了该脚本,然后通过输入 作为 root 来应用 SELinux 上下文:
# restorecon -RvF /usr/share/foreman/config/hooks
SELinux 上下文在 Red Hat Enterprise Linux 6 上是 bin_t,在 Red Hat Enterprise Linux 7 上是 foreman_hook_t。请记住,该脚本正在受限,因此 SELinux 可能会拒绝一些操作。运行 aureport -a 或查看 /var/log/audit/audit.log,以检查 SELinux 拒绝的操作。
有关调试 SELinux 问题并使用 audit2allow 工具的更多信息:

过程 9.1. 创建 Foreman Hook 以使用 logger 命令

每次 Foreman 置备新服务器时,此 hook 脚本都会创建额外的日志消息。
  1. 在 Satellite 服务器基本系统上创建目录结构:
    # mkdir -p /usr/share/foreman/config/hooks/host/managed/before_provision/
  2. 按如下所示创建脚本:
    # vi /usr/share/foreman/config/hooks/host/managed/before_provision/10_logger.sh
    #!/bin/bash/
    logger $1 $2
    文件名 _logger.sh 的数字前缀 10 决定同一子目录中脚本的执行顺序。更改此前缀以满足您的需要。
  3. 将脚本所有者更改为 foreman
    # chown foreman:foreman 10_logger.sh
  4. 将脚本权限更改为允许由用户执行:
    # chmod u+x 10_logger.sh
  5. 确保 SELinux 上下文在 /usr/share/foreman/config/hooks 目录中的所有文件正确:
    # restorecon -RvF /usr/share/foreman/config/hooks/
  6. 要启用 foreman 用户使用 logger 命令,请在 /etc/sudoers 文件中添加以下规则:
    # vi /etc/sudoers
    foreman ALL=(ALL) NOPASSWD:/usr/bin/logger
  7. 重启 Foreman 服务,以使 hook 进行注册:
    # touch ~foreman/tmp/restart.txt
每个 Foreman 或 Rail 对象都可以具有 hook。请参阅 /usr/share/app/models/ 目录或获取可用模型的完整列表,请输入以下命令:
# foreman-rake console
>	ActiveRecord::Base.descendants.collect(&:name).collect(&:underscore).sort
=> ["audited/adapters/active_record/audit", "compute_resource", "container",
output truncated
此命令输出还列出了一些不太可能用于 Foreman hook 的技术表,如 "active_record" 或 "habtm"。它们最常使用:
  • 主机
  • 报告

9.2.1. 编配事件

Foreman 支持在对象创建、更新和销毁时,支持主机和网络接口(称为对象)的编配任务。这些任务显示在 Web UI 中的用户。如果失败,它们会自动触发操作的回滚。可以赋予编配 hook 的优先级,因此可以在部署 DNS 记录前或之后排序它们。
要在事件中添加 hook,请使用以下事件名称:
  • create
  • update
  • destroy

9.2.2. Rails 事件

对于主机和 NIC (支持编配)部分的 hook,然后可以使用 standard Rails 事件。每个事件都有一个"before"和"after" hook,这些是最有趣的事件:
  • after_create
  • before_create
  • after_destroy
  • before_destroy
主机对象有两个额外的回调,您可以使用:
  • 当主机被放入构建模式时,host/managed/after_build 触发器。
  • 当主机完成操作系统安装时,host/managed/before_provision 触发器。
有关 Rails 事件的完整列表,请参阅 Ruby on Rails ActiveRecord::Callbacks底部的 Constants 部分[14] 文档.

9.2.3. 执行 hook

hook 在 Foreman 服务器的上下文中执行,因此通常在 foreman 用户下执行。第一个参数始终是事件名称,使脚本可以符号链接到多个事件目录中。第二个参数是 hooked 对象的字符串表示,如主机的主机名:
~foreman/config/hooks/host/managed/create/50_register_system.sh create foo.example.com
hook 对象的 JSON 表示将在标准输入中传递。此 JSON 由 v2 API 视图生成。大多数用户使用 jgrep 读取的实用程序在 examples/hook_functions.sh 和提供这个实用程序脚本中提供。否则,建议关闭标准输入,以防止管道缓冲区填满,这将阻止 Foreman 线程。
echo '{"host":{"name":"foo.example.com"}}' \
  | ~foreman/config/hooks/host/managed/create/50_register_system.sh \
       create foo.example.com
事件目录中的每个 hook 都会按字母顺序执行。对于编配 hook,hook 文件名中的整数前缀将用作优先级值,从而影响与 DNS、DHCP、虚拟机创建和其他任务相关的执行时。

9.2.4. hook 失败和回滚

如果 hook 失败,则使用非零返回代码退出,则记录事件。对于 Rails 事件,其他 hook 的执行将继续。对于编配事件,故障将停止操作和回滚。如果另一个编配操作失败,可能会再次调用 hook 来回滚其操作。在这种情况下,第一个参数会根据情况进行更改,因此该脚本必须模糊处理(例如,如果必须稍后回滚,则使用"销毁"调用"创建" hook)。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部