Red Hat Training

A Red Hat training course is available for RHEL 8

27.7. 编写集群警报代理

Pacemaker 群集警报有三种类型:节点警报、隔离警报和资源警报。传递给警报代理的环境变量可能会根据警报类型而有所不同。下表描述了传递给警报代理的环境变量,并指定环境变量何时与特定警报类型关联。

表 27.2. 传递给警报代理的环境变量

环境变量描述

CRM_alert_kind

警报类型(节点、保护或资源)

CRM_alert_version

Pacemaker 发送警报的版本

CRM_alert_recipient

配置的接收者

CRM_alert_node_sequence

每当在本地节点上发出警报时,序列数量会增加,它可以用来引用 Pacemaker 发出警报的顺序。稍后发生事件警告的序列号比之前的事件的警报要高。请注意,这个数字没有集群范围的含义。

CRM_alert_timestamp

执行代理前创建的时间戳,采用由 timestamp-format meta 选项指定的格式。这可以确保在事件发生时代理有一个可靠、高度准确的时间,无论代理本身何时被调用(这可能会因为系统负载或其他情况而延迟)。

CRM_alert_node

受影响节点的名称

CRM_alert_desc

有关事件的详情。对于节点警报,这是节点的当前状态(成员或丢失)。对于隔离警报,这是请求的隔离操作的总结,其中包括原始数据、目标以及隔离操作错误代码(若有)。对于资源警报,这是等同于 CRM_alert_status 的可读字符串。

CRM_alert_nodeid

状态更改的节点 ID(仅由节点警报提供)

CRM_alert_task

请求的隔离或资源操作(仅由隔离和资源警报提供)

CRM_alert_rc

保护或资源操作的数字返回代码(仅由隔离和资源警告提供)

CRM_alert_rsc

受影响资源的名称(仅限资源警报)

CRM_alert_interval

资源操作的时间间隔(仅限资源警报)

CRM_alert_target_rc

操作的预期数字返回代码(仅用于资源警报)

CRM_alert_status

Pacemaker 用来表示操作结果的数字代码(仅用于资源警报)

在编写警报代理时,您必须考虑以下问题。

  • 警告代理可以在没有接收者的情况下被调用(如果没有配置任何接收者),因此代理必须能够处理这种情况,即使它只在那种情况下才会退出。用户可以修改配置阶段,并在以后添加一个接收者。
  • 如果为警报配置了多个接收者,则会为每个接收者调用一个警报代理。如果代理无法同时运行,则应该只使用单个的接收者进行配置。不过,代理可以自由地将接收者解析为一个列表。
  • 当发生集群事件时,所有警报都会与独立进程同时触发。根据配置了警报和接收方的数量以及警报代理中的操作,可能会发生大量负载。可以编写代理来考虑这一点,例如将资源密集型操作排队到其他实例中,而不是直接执行。
  • 警报代理以 hacluster 用户身份运行,该用户具有最小权限集。如果代理需要额外的特权,建议配置 sudo 以允许代理以具有适当特权的另一用户身份运行必要的命令。
  • 请小心地验证和清理用户配置的参数,如 CRM_alert_timestamp (由用户配置的 timestamp-format)、CRM_alert_recipient 和所有警报选项指定的内容。这是防止配置错误所必需的。此外,如果某些用户可以在没有 hacluster-level 访问集群节点的情况下修改 CIB,则也是潜在的安全问题,您应该避免注入代码的可能性。
  • 如果群集包含将 on-fail 参数设置为 隔离 的操作的资源,则失败时会有多个隔离通知,每个资源都有一个用于设置此参数的资源,再加上一个附加通知。pacemaker-fencedpacemaker-controld 都将发送通知。pacemaker 在这种情况下只能执行一个实际隔离操作,无论发送了多少条通知。
注意

警报接口设计为与 ocf:pacemaker:ClusterMon 资源使用 的外部脚本界面向后兼容。为了保持这种兼容性,传递给警报代理的环境变量会预先带有 CRM_notify_CRM_alert_。兼容性问题之一是 ClusterMon 资源以 root 用户身份运行外部脚本,而警报代理则以 hacluster 用户身份运行