星期四, 九月 05, 2013

OCF 开发者指南 第七章

7 便利的函数

7.1 日志: ocf_log

资源代理应该使用ocf_log函数来进行日志。调用方法如下:

支持如下几种日志级别:
  • debug ---- debugging 消息。多数的日志配置缺省不使用这个级别。
  • info ---- 是关于资源代理行为和状态的信息
  • warn ---- 警告。一些不期望的行为,但是不是不可恢复的错误
  • err ---- 错误。 这些日志在出现资源代理以一定错误码exit之前
  • crit ---- 临界错误。 以为有err级别。crit级别就非常少用,出发资源代理也以一定的错误码退出
7.2 检查二进制:have_binary 和 check_binary

资源代理可能需要测试特定可执行文件的可用性。可以使用have_binary函数:

if ! have_binary frobnicate; then
   ocf_log warn "Missing frobnicate binary, frobnication disabled!"
fi

如果二进制文件缺失是一个致命的错误,就应该提前调用check_binary函数:

check_binary frobnicate

使用check_binary是检查文件存在(并且可执行)的一个很便捷的方法,如果没找到或不可执行的话,以$OCF_ERR_INSTALLED退出。

注意:have_binary和check_binary 会在$PATH 定义的目录下去找指定的二进制文件。建议最好是做全路径检查,分布式环境里面,用户策略的变化都会使得文件路径反生变化。

7.3 执行命令并收集输出:ocf_run

任何时候需要执行一个命令并获得其输出都可以使用ocf_run函数,像下面的例子这样:

ocf_run "frobnicate --spam=eggs" || exit $OCF_ERR_GENERIC

通过上面的命令,资源代理会调用 frobnicate --spam=eggs 并捕捉其输出和退出码。如果退出码非零(代表一种错误),ocf_run 以 err级别将输出记录的日志,资源代理随后退出。如果退出码是0(表示成功),则输出将以info级别记录到日志。

如果资源代理希望忽略成功执行的输出,可以使用 -q 参数。 在下面的例子中,ocf_run 只会将退出码非零的执行输出结果导入日志。

ocf_run -q "frobnicate --spam=eggs" || exit $OCF_ERR_GENERIC

最后,如果资源代理想以不同的日志级别( 非 err )记录那些返回码非零的执行结果,可以通过使用 -info 或者 -warn参数:

ocf_run -warn "frobnicate --spam=eggs"

7.4 锁:ocf_take_lock 和 ocf_release_lock_on_exit

偶然也会出现这种情况,按集群配置,相同类型的不同资源不能同时并行运行。资源代理需要保证在相同机器上不会并行:
LOCKFILE=${HA_RSCTMP}/foobar
ocf_release_lock_on_exit $LOCKFILE

foobar_start() {
    ...
    ocf_take_lock $LOCKFILE
    ...
}

ocf_take_lock 试图获得指定的$LOCKFILE。 不可得时,它sleep 0到1秒间一个随机的时间,再重试。ocf_release_lock_on_exit 会在资源代理退出的时候释放锁文件。

7.5 数值检测

对于参数检测,这个函数可以用来检测一个值是否是一个数。例子如下:

LOCKFILE=${HA_RSCTMP}/foobar
ocf_release_lock_on_exit $LOCKFILE

foobar_validate_all() {
    if ! ocf_is_decimal $OCF_RESKEY_eggs; then
        ocf_log err "eggs is not numeric!"
        exit $OCF_ERR_CONFIGURED
    fi
    ...
}


7.6 boolean值检测

当资源代理定义一个boolean类型的参数,用户会将这个参数指定为0/1, true/false, 或者 on/off。 在资源代理里面,去检测这些值是很麻烦的,所以应该用ocf_is_true函数比较方便:
if ocf_is_true $OCF_RESKEY_superfrobnicate; then
    ocf_run "frobnicate --super"
fi

注意:ocf_is_true 不可以对空的或者不存在的变量使用。它总是返回退出码 1, 相当于 false。

7.7 伪资源:ha_pseudo_resource

伪资源是那种不像实际可运行进程一样可以真实启动和停止的资源代理,它们仅仅执行单个的行为,并以某种方式跟踪这个行为执行了还是没有。portblock资源代理是这样的一个例子。

伪资源的资源代理可以使用 ha_pseudo_resource,  它石永红tracking file(跟踪文件)开保存资源状态的标签。如果foobar是为资源的资源代理,其start的行为应该像下面这个样子:
foobar_start() {
    # exit immediately if configuration is not valid
    foobar_validate_all || exit $?

    # if resource is already running, bail out early
    if foobar_monitor; then
        ocf_log info "Resource is already running"
        return $OCF_SUCCESS
    fi

    # start the pseudo resource
    ha_pseudo_resource ${OCF_RESOURCE_INSTANCE} start

    # After the resource has been started, check whether it started up
    # correctly. If the resource starts asynchronously, the agent may
    # spin on the monitor function here -- if the resource does not
    # start up within the defined timeout, the cluster manager will
    # consider the start action failed
    while ! foobar_monitor; do
        ocf_log debug "Resource has not started yet, waiting"
        sleep 1
    done

    # only return $OCF_SUCCESS if _everything_ succeeded as expected
    return $OCF_SUCCESS
}


没有评论: