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_binarycheck_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 01秒间一个随机的时间,再重试。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

}