OCF便利的函数有哪些
这篇文章主要讲解了"OCF便利的函数有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"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函数:
1 2 3 | if ! have_binary frobnicate; then ocf_log warn "Missing frobnicate binary, frobnication disabled!" fi |
如果二进制文件缺失是一个致命的错误,就应该提前调用check_binary函数:
1 | check_binary frobnicate |
使用check_binary是检查文件存在(并且可执行)的一个很便捷的方法,如果没找到或不可执行的话,以$OCF_ERR_INSTALLED退出。
注意:have_binary和check_binary会在$PATH 定义的目录下去找指定的二进制文件。建议最好是做全路径检查,分布式环境里面,用户策略的变化都会使得文件路径发生变化。
7.3 执行命令并收集输出:ocf_run
任何时候需要执行一个命令并获得其输出都可以使用ocf_run函数,像下面的例子这样:
1 | ocf_run "frobnicate --spam=eggs" || exit $OCF_ERR_GENERIC |
通过上面的命令,资源代理会调用frobnicate --spam=eggs 并捕捉其输出和退出码。如果退出码非零(代表一种错误),ocf_run 以 err级别将输出记录到日志,资源代理随后退出。如果退出码是0(表示成功),则输出将以info级别记录到日志。
如果资源代理希望忽略成功执行的输出,可以使用 -q 参数。在下面的例子中,ocf_run 只会将退出码非零的执行输出结果导入日志。
1 | ocf_run -q "frobnicate --spam=eggs" || exit $OCF_ERR_GENERIC |
最后,如果资源代理想以不同的日志级别(非 err )记录那些返回码非零的执行结果,可以通过使用 -info 或者 -warn参数:
1 | ocf_run -warn "frobnicate --spam=eggs" |
7.4 锁:ocf_take_lock和 ocf_release_lock_on_exit
偶然也会出现这种情况,按集群配置,相同类型的不同资源不能同时并行运行。资源代理需要保证在相同机器上不会并行:
1 2 3 4 5 6 7 8 | 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 数值检测
对于参数检测,这个函数可以用来检测一个值是否是一个数。例子如下:
1 2 3 4 5 6 7 8 9 10 | 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函数比较方便:
1 2 3 | 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的行为应该像下面这个样子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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 } |
感谢各位的阅读,以上就是"OCF便利的函数有哪些"的内容了,经过本文的学习后,相信大家对OCF便利的函数有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!