[ClusterLabs] Azure Resource Agent

Kristoffer Grönlund kgronlund at suse.com
Mon Sep 18 06:10:01 EDT 2017


Eric Robinson <eric.robinson at psmnv.com> writes:

> This is obviously beta as it currently only works with a manual failover. I need to add some code to handle an actual node crash or power-plug test.
>
> Feedback, suggestions, improvements are welcome. If someone who knows awk wants to clean up my azure client calls, that would be a good place to start.

Hi,

Great to see an initial agent for managing IPs on Azure! First of all, I
would ask: What is your license for the code? Would you be interested in
getting an agent based on this version included in the upstream
resource-agents repository?

Cheers,
Kristoffer

>
> --
>
> #!/bin/sh
> #
> #             OCF parameters are as below
> #             OCF_RESKEY_ip
>
> #######################################################################
> # Initialization:
>
> : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
> . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
> DEBUG_LEVEL=2
> MY_HOSTNAME=$(hostname -s)
> SCRIPT_NAME=$(basename $0)
>
> #######################################################################
>
> meta_data() {
>                 logIt "debug1: entered: meta_data()"
>                 cat <<END
> <?xml version="1.0"?>
> <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
> <resource-agent name="AZaddr2">
> <version>1.0</version>
>
> <longdesc lang="en">
> Resource agent for managing IP configs in Azure.
> </longdesc>
>
> <shortdesc lang="en">Short descrption/</shortdesc>
>
> <parameters>
>
> <parameter name="ip" unique="1" required="1">
> <longdesc lang="en">
> The IPv4 (dotted quad notation)
> example IPv4 "192.168.1.1".
> </longdesc>
> <shortdesc lang="en">IPv4 address</shortdesc>
> <content type="string" default="" />
> </parameter>
>
> </parameters>
> <actions>
> <action name="start"   timeout="20s" />
> <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
>                 logIt "leaving: exiting: meta_data()"
>                 return $OCF_SUCCESS
> }
>
> azip_query() {
>
>                 logIt "debug1: entered: azip_query()"
>                 logIt "debug1: checking to determine if an Azure ipconfig named '$AZ_IPCONFIG_NAME' exists for the interface"
>                 logIt "debug1: executing: az network nic ip-config show --name $AZ_IPCONFIG_NAME --nic-name $AZ_NIC_NAME -g $AZ_RG_NAME 2>&1"
>         R=$(az network nic ip-config show --name $AZ_IPCONFIG_NAME --nic-name $AZ_NIC_NAME -g $AZ_RG_NAME 2>&1)
>                 logIt "debug2: $R"
>                 R2=$(echo "$R"|grep "does not exist")
>                 if [ -n "$R2" ]; then
>                                 logIt "debug1: ipconfig named '$AZ_IPCONFIG_NAME' does not exist"
>                                 return $OCF_NOT_RUNNING
>                 else
>                                 R2=$(echo "$R"|grep "Succeeded")
>                                 if [ -n "$R2" ]; then
>                                                 logIt "debug1: ipconfig '$AZ_IPCONFIG_NAME' exists"
>                                                 return $OCF_SUCCESS
>                                 else
>                                                 logIt "debug1: not sure how this happens"
>                                                 return $OCF_ERR_GENERIC
>                                 fi
>                 fi
>                 logIt "debug1: exiting: azip_query()"
> }
>
> azip_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
>                 return $OCF_SUCCESS
> }
>
> azip_start() {
>
>                 logIt "debug1: entered: azip_start()"
>
>                 #--if a matching ipconfig already exists in Azure, return success
>                 azip_query;RC=$?
>                 if [ $RC -eq 0 ]; then
>                                 logIt "debug1: $OCF_RESKEY_ip is already associated"
>                                 return $OCF_SUCCESS
>
>                 else
>                                 #--create an interface ipconfig in Azure
>                                 logIt "debug1: creating ipconfig '$AZ_IPCONFIG_NAME'"
>                                 logIt "debug1: executing: az network nic ip-config create --name $AZ_IPCONFIG_NAME --nic-name $AZ_NIC_NAME --resource-group $AZ_RG_NAME --private-ip-address $OCF_RESKEY_ip \
>                                                 --subnet $AZ_SUBNET_NAME --vnet-name $AZ_VNET_NAME"
>                                 R=$(az network nic ip-config create --name $AZ_IPCONFIG_NAME --nic-name $AZ_NIC_NAME --resource-group $AZ_RG_NAME --private-ip-address $OCF_RESKEY_ip --subnet $AZ_SUBNET_NAME --vnet-name $AZ_VNET_NAME)
>                                 logIt "debug2: output: $R"
>                                 R2=$(echo "$R"|grep Succeeded)
>                                 if [ -n "$R2" ]; then
>                                                 logIt "debug1: $AZ_IPCONFIG_NAME created successfully with ip address $OCF_RESKEY_ip"
>                                                 return $OCF_SUCCESS
>                                 else
>                                                 logIt "debug1: failed to create ipconfig $AZ_IPCONFIG_NAME"
>                                                 return $OCF_ERR_GENERIC
>                                 fi
>                 fi
>
>                 logIt "debug1: exiting: azip_start()"
>
> }
>
> azip_stop() {
>
>                 logIt "debug1: entered: azip_stop()"
>
>         #--if there is no matching ipconfig in Azure, exit with success
>         azip_query;RC=$?
>                 if [ $RC -ne 0 ]; then
>                 logIt "debug1: $OCF_RESKEY_ip is not associated"
>                 return $OCF_SUCCESS
>                 else
>                #--delete it
>                                 logIt "deleting ipconfig '$AZ_IPCONFIG_NAME'"
>                                 R=$(az network nic ip-config delete --name $AZ_IPCONFIG_NAME --nic-name $AZ_NIC_NAME --resource-group $AZ_RG_NAME)
>
>                                 #--verify that it was deleted
>                                 logIt "verifying that ipconfig '$AZ_IPCONFIG_NAME' got removed"
>                                 azip_query;RC=$?
>                if [ $RC -ne 0 ]; then
>                               logIt "debug1: ipconfig $AZ_IPCONFIG_NAME successfully removed"
>                               return $OCF_SUCCESS
>                                 else
>                                                 logIt "failed to remove $AZ_IPCONFIG_NAME."
>                                                 return $OCF_ERR_GENERIC
>                fi
>                 fi
>
>                 logIt "debug1: exiting: azip_stop()"
> }
>
> azip_monitor() {
>
>                 logIt "debug1: entered: azip_monitor()"
>
>                 azip_query;RC=$?
>                 logIt "debug1: function azip_query() returned $RC"
>                 if [ $RC -eq 0 ]; then
>                                 return $OCF_SUCCESS
>                 else
>                                 return $OCF_NOT_RUNNING
>                 fi
>
>                 logIt "debug1: exiting: azip_monitor()"
> }
>
> logIt() {
>         MSG=$1
>         if [ ${MSG:0:5} == "debug" ]
>         then
>                                 MSG_LEVEL=${MSG:5:1}
>                                 if [ $MSG_LEVEL -le $DEBUG_LEVEL ]; then
>                                                 if [ $MSG_LEVEL -gt 1 ]; then
>                                                                 logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): debug$MSG_LEVEL ####################################################################"
>                                                                 logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): $1"
>                                                                 logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): debug$MSG_LEVEL ####################################################################"
>                                                 else
>                                                logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): $1"
>                                                 fi
>                                 else
>                                                 return
>                                 fi
>                 else
>                logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): $1"
>         fi
> }
>
> logIt "debug1: agent was asked to $__OCF_ACTION resource $OCF_RESOURCE_INSTANCE with IP address $OCF_RESKEY_ip"
>
>
> ######################################################################
> #  Azure Initialization
> ######################################################################
>
> #--check if azure is enabled
> AZ_ENABLED=$(az account show|grep Enabled|sed "s/  *//g"|cut -d":" -f2|sed "s/\"//g"|sed "s/,//g")
> if [ -z "$AZ_ENABLED" ]
> then
>         logIt "Azure account not detected"
>                 logIt "debug1: exiting $SCRIPT_NAME"
>         exit $OCF_ERR_GENERIC
> else
>         logIt "debug1: AZ_ENABLED=$AZ_ENABLED"
> fi
>
> #--set the ipconfig name
> AZ_IPCONFIG_NAME="ipconfig-""$OCF_RESKEY_ip"
> logIt "debug1: AZ_IPCONFIG_NAME=$AZ_IPCONFIG_NAME"
>
> #--get the resource group name
> AZ_RG_NAME=$(az group list|grep name|cut -d":" -f2|sed "s/  *//g"|sed "s/\"//g"|sed "s/,//g")
> if [ -z "$AZ_RG_NAME" ]
> then
>         logIt "could not determine the Azure resource group name"
>         exit $OCF_ERR_GENERIC
> else
>         logIt "debug1: AZ_RG_NAME=$AZ_RG_NAME"
> fi
>
> #--get the nic name
> AZ_NIC_NAME=$(az vm nic list -g $AZ_RG_NAME --vm-name $MY_HOSTNAME|grep networkInterfaces|cut -d"/" -f9|sed "s/\",//g")
> if [ -z "$AZ_NIC_NAME" ]
> then
>         echo "could not determine the Azure NIC name"
>         exit $OCF_ERR_GENERIC
> else
>         logIt "debug1: AZ_NIC_NAME=$AZ_NIC_NAME"
> fi
>
> #--get the vnet and subnet names
> R=$(az network nic show --name $AZ_NIC_NAME --resource-group $AZ_RG_NAME|grep -i subnets|head -1|sed "s/  */ /g"|cut -d"/" -f9,11|sed "s/\",//g")
> LDIFS=$IFS
> IFS="/"
> R_ARRAY=( $R )
> AZ_VNET_NAME=${R_ARRAY[0]}
> AZ_SUBNET_NAME=${R_ARRAY[1]}
> if [ -z "$AZ_VNET_NAME" ]
> then
>         logIt "could not determine Azure vnet name"
>         exit $OCF_ERR_GENERIC
> else
>         logIt "debug1: AZ_VNET_NAME=$AZ_VNET_NAME"
> fi
> if [ -z "$AZ_SUBNET_NAME" ]
> then
>         logIt "could not determine the Azure subnet name"
>         exit $OCF_ERR_GENERIC
> else
>         logIt "debug1: AZ_SUBNET_NAME=$AZ_SUBNET_NAME"
> fi
>
> ######################################################################
> #  Actions
> ######################################################################
>
> case $__OCF_ACTION in
> meta-data)         meta_data
>                                 RC=$?
>                                 ;;
> usage|help)       azip_usage
>                                 RC=$?
>                                 ;;
> start)                     azip_start
>                                 RC=$?
>                                 ;;
> stop)                     azip_stop
>                                 RC=$?
>                                 ;;
> status)                  azip_query
>                                 RC=$?
>                                 ;;
> monitor)              azip_monitor
>                                 RC=$?
>                                 ;;
> validate-all)        ;;
> *)                            azip_usage
>                                 RC=$OCF_ERR_UNIMPLEMENTED
>                                 ;;
> esac
>
> #--exit with return code
> logIt "debug1: exiting $SCRIPT_NAME with code $RC"
> exit $RC
>
> #--end
>
> --
> Eric Robinson
>
> _______________________________________________
> Users mailing list: Users at clusterlabs.org
> http://lists.clusterlabs.org/mailman/listinfo/users
>
> Project Home: http://www.clusterlabs.org
> Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
> Bugs: http://bugs.clusterlabs.org

-- 
// Kristoffer Grönlund
// kgronlund at suse.com




More information about the Users mailing list