create new pcs resource agent

一. 引子

pcs可以用來管理集群中虛擬IP等pacemaker的資源,以VIP為例子,在創(chuàng)建VIP的時候要執(zhí)行如下指令:

>> 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. 傳給資源代理的參數(shù):params ip="192.168.1.10" netmask="255.255.255.0" location="node-1"
4. 創(chuàng)建即執(zhí)行的操作:op start timeout="60s" monitor timeout="30s"?interval="10s" on-fail="restart"

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

二. 科普

講述之前先科普:

pacemaker中資源分為兩類,ocf資源和lsb資源,查看集群節(jié)點中的資源狀態(tài)可以用pcs status指令,查看資源的提供者可以用pcs resource providers指令,你可以看到提供者可以是【heartbeat、openstack、pacemaker】,我們這里用的就是第一個提供者,而后跟的就是代理腳本名稱,即上述指令中的IPaddr。

該腳本使用任何語言實現(xiàn)都可以,大多時候我們都用shell語言,所以還要科普下shell語言的語法:

$value是調(diào)用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:判斷存在的對象是否可以執(zhí)行;
9. -n:如果 string 長度非零,則為真。

三. 代理語法

假設我們創(chuàng)建的新腳本叫: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的內(nèi)置函數(shù),用于打印日志。

上述中的action函數(shù)一般都是以代理的名字為前綴【makevip_[start/stop/monitor]】,action是pacemaker內(nèi)部封裝的在特定條件下會觸發(fā)的行為,可以是start/stop/monitor等,上述代碼中提及的各個函數(shù)作用如下:

1. makevip_usage:腳本的用戶手冊;
2. makevip_start:資源漂移的時候啟用資源;
3. makevip_stop:停止資源;
4. makevip_monitor:監(jiān)控資源的狀態(tài);
5. makevip_validate_all:驗證傳過來的參數(shù)的可用性;
6.?meta_data:指令傳過來的各個參數(shù)的規(guī)范【參數(shù)名字、必填/可選、唯一等】。

除了action行為外,資源代理還有幾種可用的返回值:

1.?OCF_SUCCESS:操作執(zhí)行成功;
2.?OCF_NOT_RUNNING:資源不運行了;
3.?OCF_ERR_GENERIC:資源返回一個一般的錯誤;
4.?OCF_ERR_UNIMPLEMENTED:資源使用了一個沒有實現(xiàn)的action;
5.?OCF_ERR_CONFIGURED:配置文件有問題。

腳本變量:

1. $OCF_ROOT:一般值是/usr/lib/ocf;
2. $__OCF_ACTION:當前的action值是什么;
3. $OCF_FUNCTIONS_DIR:資源代理的函數(shù)庫。

上述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
? ??# $?代表上一條指令執(zhí)行的結果返回值,0(成功)或者非0(失?。?br>????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?

資源創(chuàng)建成功,你還可以將某個節(jié)點down掉,測試一下資源的漂移。

六. 擴展

在資源漂移向其他節(jié)點的時候,會觸發(fā)資源的start函數(shù),我們可以在代理的start函數(shù)中,調(diào)用python或者其他語言的文件并傳參,這樣由資源的漂移引發(fā)的其他業(yè)務邏輯就可以在其他語言的文件中做進一步處理了。

資源代理的官網(wǎng):http://www.linux-ha.org/doc/dev-guides/ra-dev-guide.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容