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 <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="makevip">
<version>1.0</version>

<longdesc lang="en">
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.
</longdesc>

<shortdesc lang="en">Manages virtual IPv4 and IPv6 addresses (Linux specific version)</shortdesc>

<parameters>
<parameter name="vip" unique="1" required="1">
<longdesc lang="en">IP address.</longdesc>
<shortdesc lang="en">IP</shortdesc>
<content type="string" default="${OCF_RESKEY_vip_default}" />
</parameters>

<actions>
<action name="start" timeout="60s" />
<action name="stop" timeout="20s" />
<action name="status" depth="0" timeout="20s" interval="10s" />
<action name="monitor" depth="0" timeout="20s" interval="10s" />
<action name="meta-data" timeout="5s" />
<action name="validate-all" timeout="20s" />
</actions>
</resource-agent>
END
    exit $OCF_SUCCESS
}

makevip_usage()
{
    cat <<END
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容