Eric Robinson <eric.robin...@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@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 // kgronl...@suse.com _______________________________________________ Users mailing list: Users@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