create new pcs resource agent

一. 引子

pcs可以用来管理集群中虚拟IP等pacemaker的资源,以VIP为例子,在创建VIP的时候要执行如下指令:

>> pcs resource create VIP-1 ocf:heartbeat:IPaddr params ip="192.168.1.10" netmask="255.255.255.0" location="node-1" op start timeout="60s" monitor timeout="30s" interval="10s" on-fail="restart"

拆解上述指令:

1. 资源名字:VIP-1
2. 资源代理:【ocf:heartbeat:IPaddr】
3. 传给资源代理的参数:params ip="192.168.1.10" netmask="255.255.255.0" location="node-1"
4. 创建即执行的操作:op start timeout="60s" monitor timeout="30s" interval="10s" on-fail="restart"

本篇文章里讲述的就是上述中的资源代理(Resource Agent, RA)。

二. 科普

讲述之前先科普:

pacemaker中资源分为两类,ocf资源和lsb资源,查看集群节点中的资源状态可以用pcs status指令,查看资源的提供者可以用pcs resource providers指令,你可以看到提供者可以是【heartbeat、openstack、pacemaker】,我们这里用的就是第一个提供者,而后跟的就是代理脚本名称,即上述指令中的IPaddr。

该脚本使用任何语言实现都可以,大多时候我们都用shell语言,所以还要科普下shell语言的语法:

$value是调用value的意思,可以放在引号里,也可以不放。

在shell中判断是否相等用的是一个‘=’号,而不是两个‘==’。

1. -d:判断指定的变量是否为目录;
2. -z:判断制定的变量是否存在值。可以理解成-zero,如果NIC=0,则if [ -z “$NIC” ]为True;
3. -f:判断指定的变量是否为文件;
4. -L:判断指定的变量是否为符号链接;
5. -r:判断指定的变量是否可读;
6. -s:判断存在的对象长度是否为0;
7. -w:判断指定的变量是否可写;
8. -x:判断存在的对象是否可以执行;
9. -n:如果 string 长度非零,则为真。

三. 代理语法

假设我们创建的新脚本叫:makevip

就像所有的脚本一样,makevip代理脚本也要有它的main:

#Main
ocf_log notice "action $__OCF_ACTION"
case $__OCF_ACTION in
    meta-data)
        meta_data
       ;;
    usage|help)
        makevip_usage
        exit $OCF_SUCCESS
        ;;
esac
  
makevip_validate_all

case $__OCF_ACTION in
    start)
        makevip_start ;;
    stop)
        makevip_stop ;;
    monitor)
        makevip_monitor ;;
    validate-all) ;;
    *)
        makevip_usage
        exit $OCF_ERR_UNIMPLEMENTED ;;
esac

上述代理块中,ocf_log是pcs的内置函数,用于打印日志。

上述中的action函数一般都是以代理的名字为前缀【makevip_[start/stop/monitor]】,action是pacemaker内部封装的在特定条件下会触发的行为,可以是start/stop/monitor等,上述代码中提及的各个函数作用如下:

1. makevip_usage:脚本的用户手册;
2. makevip_start:资源漂移的时候启用资源;
3. makevip_stop:停止资源;
4. makevip_monitor:监控资源的状态;
5. makevip_validate_all:验证传过来的参数的可用性;
6. meta_data:指令传过来的各个参数的规范【参数名字、必填/可选、唯一等】。

除了action行为外,资源代理还有几种可用的返回值:

1. OCF_SUCCESS:操作执行成功;
2. OCF_NOT_RUNNING:资源不运行了;
3. OCF_ERR_GENERIC:资源返回一个一般的错误;
4. OCF_ERR_UNIMPLEMENTED:资源使用了一个没有实现的action;
5. OCF_ERR_CONFIGURED:配置文件有问题。

脚本变量:

1. $OCF_ROOT:一般值是/usr/lib/ocf;
2. $__OCF_ACTION:当前的action值是什么;
3. $OCF_FUNCTIONS_DIR:资源代理的函数库。

上述case的语法是:

case value in:
    1)    ocf_log notice "value=1";;
    2)    ocf_log notice "value=2";;
esac

四. 代理成品

下面是资源代理makevip的代码:

#!/bin/sh
#
# OCF Resource Agent compliant makevip script.
#
# Copyright (c) 2018 Chaoyue Ge
# All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
############################################################
# Initialization:
 : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
 . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
 . ${OCF_FUNCTIONS_DIR}/findif.sh
 # Defaults
OCF_RESKEY_vip_default="192.168.1.100"
 : ${OCF_RESKEY_vip=${OCF_RESKEY_vip_default}}

############################################################
meta_data() {
    cat <


1.0


This Linux-specific resource manages IP alias IP addresses.
It can add an IP alias, or remove one.
In addition, it can implement Cluster Alias IP functionality
if invoked as a clone resource.

Manages virtual IPv4 and IPv6 addresses (Linux specific version)



IP address.
IP










END
    exit $OCF_SUCCESS
}

makevip_usage()
{
    cat <usage: $0 {start|stop|status|monitor|validate-all|meta-data}

Expects to have a fully populated OCF RA-compliant environment set.
END
}

makevip_validate_all()
{
    if [ -n "$OCF_RESKEY_vip" ]; then
        VIP=${OCF_RESKEY_vip}
        ocf_log notice "$OCF_RESKEY_vip"
        return $OCF_SUCCESS
    else
        ocf_log info "You need to specify which ge to run"
        return $OCF_ERR_ARGS
    fi
}

makevip_monitor()
{
    local rc
    # $?代表上一条指令执行的结果返回值,0(成功)或者非0(失败)
    makevip_validate_all || exit $?
    case "$?" in
        0)
            rc=$OCF_SUCCESS
            ocf_log debug "Resource is running"
            ;;
        1)
            rc=$OCF_NOT_RUNNING
            ocf_log debug "Resource is not running" ;;
        *)
            ocf_log err "Resource has failed"
            exit $OCF_ERR_GENERIC
    esac
    return $rc
}

makevip_start()
{
    ocf_log notice "[+] RUNNING Start Function!"
    makevip_validate_all || exit $?
    if makevip_monitor; then
        ocf_log info "Resource is already running"
        return $OCF_SUCCESS
    fi
    while ! makevip_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        
}

makevip_stop()
{
    ocf_log notice "[+] RUNNING Stop Function!"
    local rc
    makevip_validate_all || exit $?
    makevip_monitor rc=$?
    case "$rc" in
        "$OCF_SUCCESS")
            ocf_log debug "[+] Resource is currently running"
            ;;
        "$OCF_NOT_RUNNING")
            # Currently not running. Nothing to do.
            ocf_log info "[+] Resource is already stopped"
            return $OCF_SUCCESS
            ;;
    esac
    return $OCF_SUCCESS
}

#
# Main
#
ocf_log notice "action $__OCF_ACTION"
case $__OCF_ACTION in
meta-data)
    meta_data ;;
usage|help)
    makevip_usage
    exit $OCF_SUCCESS
    ;;
esac

makevip_validate_all
case $__OCF_ACTION in
    start)
        makevip_start
        ;;
    stop)
        makevip_stop
        ;;
    monitor)
        makevip_monitor
        ;;
    validate-all) ;;
    *)
        makevip_usage
        exit $OCF_ERR_UNIMPLEMENTED
        ;;
esac

将上述文件makevip放到/usr/lib/ocf/heartbeat/文件夹下,并给予755权限,然后这个代理就算安装好了。

五. 测试

你可以使用如下指令测试代理的效果:

>> pcs resource create vip-1 ocf:heartbeat:makevip params vip=192.168.1.188 op start timeout="60s" monitor timeout="30s" interval="10s" on-fail="restart"
>> pcs constraint location vip-1 prefers node-1=INFINITY        # 让资源偏向在node-1上开启
>> pcs status
Last updated: Mon Apr 23 11:31:35 2018 Last change: Mon Apr 23 10:39:38 2018 by root via cibadmin on node-1
Stack: corosync
Current DC: node-1 (version 1.1.13-a14efad) - partition with quorum
2 nodes and 0 resources configured
Online: [ node-1 node-2 ]
Full list of resources:
    vip-1     (ocf::heartbeat:makevip):            Started node-1
PCSD Status:
    node-1: Online
    node-2: Online

Daemon Status:
    corosync: active/corosync.service is not a native service, redirecting to /sbin/chkconfig.
    pacemaker: active/Executing /sbin/chkconfig corosync --level=5
    pcsd: active/disabled 

资源创建成功,你还可以将某个节点down掉,测试一下资源的漂移。

六. 扩展

在资源漂移向其他节点的时候,会触发资源的start函数,我们可以在代理的start函数中,调用python或者其他语言的文件并传参,这样由资源的漂移引发的其他业务逻辑就可以在其他语言的文件中做进一步处理了。

资源代理的官网:http://www.linux-ha.org/doc/dev-guides/ra-dev-guide.html

你可能感兴趣的:(create new pcs resource agent)