<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Forgot to mention that it’s called AZaddr and is intended to be dependent on IPaddr2 (or vice versa) and live in /usr/lib/ocf/resource.d/heartbeat.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><span style="color:#1F497D">--<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Eric Robinson<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">   <o:p></o:p></span></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Eric Robinson [mailto:eric.robinson@psmnv.com] <br>
<b>Sent:</b> Friday, September 15, 2017 3:56 PM<br>
<b>To:</b> Cluster Labs - All topics related to open-source clustering welcomed <users@clusterlabs.org><br>
<b>Subject:</b> [ClusterLabs] Azure Resource Agent<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" align="left" width="100%" style="width:100.0%">
<tbody>
<tr>
<td style="background:#910A19;padding:5.25pt 1.5pt 5.25pt 1.5pt"></td>
<td width="100%" style="width:100.0%;background:#FDF2F4;padding:5.25pt 3.75pt 5.25pt 11.25pt;word-wrap:break-word">
<div>
<p class="MsoNormal" style="mso-element:frame;mso-element-frame-hspace:2.25pt;mso-element-wrap:around;mso-element-anchor-vertical:paragraph;mso-element-anchor-horizontal:column;mso-height-rule:exactly">
<span style="font-size:9.0pt;font-family:"Segoe UI",sans-serif;color:#212121">This sender failed our fraud detection checks and may not be who they appear to be. Learn about <a href="http://aka.ms/LearnAboutSpoofing">spoofing</a><o:p></o:p></span></p>
</div>
</td>
<td width="75" style="width:56.25pt;background:#FDF2F4;padding:5.25pt 3.75pt 5.25pt 3.75pt;word-wrap:break-word;align:left">
<p class="MsoNormal" style="mso-element:frame;mso-element-frame-hspace:2.25pt;mso-element-wrap:around;mso-element-anchor-vertical:paragraph;mso-element-anchor-horizontal:column;mso-height-rule:exactly">
<span style="font-size:9.0pt;font-family:"Segoe UI",sans-serif;color:#212121"><a href="http://aka.ms/SafetyTipsFeedback">Feedback</a><o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<div>
<p class="MsoNormal">Greetings, all --<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If anyone’s interested, I wrote a resource agent that works with Microsoft Azure. I’m no expert at shell scripting, so I’m certain it needs a great deal of improvement, but I’ve done some testing and it works with a 2-node cluster in my
 Azure environment. Offhand, I don’t know any reason why it wouldn’t work with larger clusters, too.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">My colocation stack looks like this:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">mysql -> azure_ip -> cluster_ip -> filesystem -> drbd<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Failover takes up to 4 minutes because it takes that long for the Azure IP address de-association and re-association to complete. None of the delay is the fault of the cluster itself.  <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Right now the script burps a bunch of debug output to syslog, which is helpful if you feel like you’re waiting forever for the cluster to failover, you can look at /var/log/messages and see that you’re waiting for the Azure cloud to finish
 something. To eliminate the debug messages, set DEBUG_LEVEL to 0.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The agent requires the Azure client to be installed and the nodes to have been logged into the cloud. It currently only works with one NIC per VM, and two ipconfigs per NIC (one of which is the floating cluster IP).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">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.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">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.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">--<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#!/bin/sh<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal">#             OCF parameters are as below<o:p></o:p></p>
<p class="MsoNormal">#             OCF_RESKEY_ip<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#######################################################################<o:p></o:p></p>
<p class="MsoNormal"># Initialization:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}<o:p></o:p></p>
<p class="MsoNormal">. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs<o:p></o:p></p>
<p class="MsoNormal">DEBUG_LEVEL=2<o:p></o:p></p>
<p class="MsoNormal">MY_HOSTNAME=$(hostname -s)<o:p></o:p></p>
<p class="MsoNormal">SCRIPT_NAME=$(basename $0)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#######################################################################<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">meta_data() {<o:p></o:p></p>
<p class="MsoNormal">                logIt "debug1: entered: meta_data()"<o:p></o:p></p>
<p class="MsoNormal">                cat <<END<o:p></o:p></p>
<p class="MsoNormal"><?xml version="1.0"?><o:p></o:p></p>
<p class="MsoNormal"><!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"><o:p></o:p></p>
<p class="MsoNormal"><resource-agent name="AZaddr2"><o:p></o:p></p>
<p class="MsoNormal"><version>1.0</version><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><longdesc lang="en"><o:p></o:p></p>
<p class="MsoNormal">Resource agent for managing IP configs in Azure.<o:p></o:p></p>
<p class="MsoNormal"></longdesc><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><shortdesc lang="en">Short descrption/</shortdesc><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><parameters><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><parameter name="ip" unique="1" required="1"><o:p></o:p></p>
<p class="MsoNormal"><longdesc lang="en"><o:p></o:p></p>
<p class="MsoNormal">The IPv4 (dotted quad notation) <o:p></o:p></p>
<p class="MsoNormal">example IPv4 "192.168.1.1".<o:p></o:p></p>
<p class="MsoNormal"></longdesc><o:p></o:p></p>
<p class="MsoNormal"><shortdesc lang="en">IPv4 address</shortdesc><o:p></o:p></p>
<p class="MsoNormal"><content type="string" default="" /><o:p></o:p></p>
<p class="MsoNormal"></parameter><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"></parameters><o:p></o:p></p>
<p class="MsoNormal"><actions><o:p></o:p></p>
<p class="MsoNormal"><action name="start"   timeout="20s" /><o:p></o:p></p>
<p class="MsoNormal"><action name="stop"    timeout="20s" /><o:p></o:p></p>
<p class="MsoNormal"><action name="status" depth="0"  timeout="20s" interval="10s" /><o:p></o:p></p>
<p class="MsoNormal"><action name="monitor" depth="0"  timeout="20s" interval="10s" /><o:p></o:p></p>
<p class="MsoNormal"><action name="meta-data"  timeout="5s" /><o:p></o:p></p>
<p class="MsoNormal"><action name="validate-all"  timeout="20s" /><o:p></o:p></p>
<p class="MsoNormal"></actions><o:p></o:p></p>
<p class="MsoNormal"></resource-agent><o:p></o:p></p>
<p class="MsoNormal">END<o:p></o:p></p>
<p class="MsoNormal">                logIt "leaving: exiting: meta_data()"<o:p></o:p></p>
<p class="MsoNormal">                return $OCF_SUCCESS<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">azip_query() {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                logIt "debug1: entered: azip_query()"<o:p></o:p></p>
<p class="MsoNormal">                logIt "debug1: checking to determine if an Azure ipconfig named '$AZ_IPCONFIG_NAME' exists for the interface"<o:p></o:p></p>
<p class="MsoNormal">                logIt "debug1: executing: az network nic ip-config show --name $AZ_IPCONFIG_NAME --nic-name $AZ_NIC_NAME -g $AZ_RG_NAME 2>&1"<o:p></o:p></p>
<p class="MsoNormal">        R=$(az network nic ip-config show --name $AZ_IPCONFIG_NAME --nic-name $AZ_NIC_NAME -g $AZ_RG_NAME 2>&1)
<o:p></o:p></p>
<p class="MsoNormal">                logIt "debug2: $R"<o:p></o:p></p>
<p class="MsoNormal">                R2=$(echo "$R"|grep "does not exist")<o:p></o:p></p>
<p class="MsoNormal">                if [ -n "$R2" ]; then<o:p></o:p></p>
<p class="MsoNormal">                                logIt "debug1: ipconfig named '$AZ_IPCONFIG_NAME' does not exist"<o:p></o:p></p>
<p class="MsoNormal">                                return $OCF_NOT_RUNNING<o:p></o:p></p>
<p class="MsoNormal">                else<o:p></o:p></p>
<p class="MsoNormal">                                R2=$(echo "$R"|grep "Succeeded")<o:p></o:p></p>
<p class="MsoNormal">                                if [ -n "$R2" ]; then<o:p></o:p></p>
<p class="MsoNormal">                                                logIt "debug1: ipconfig '$AZ_IPCONFIG_NAME' exists"<o:p></o:p></p>
<p class="MsoNormal">                                                return $OCF_SUCCESS<o:p></o:p></p>
<p class="MsoNormal">                                else<o:p></o:p></p>
<p class="MsoNormal">                                                logIt "debug1: not sure how this happens"<o:p></o:p></p>
<p class="MsoNormal">                                                return $OCF_ERR_GENERIC<o:p></o:p></p>
<p class="MsoNormal">                                fi<o:p></o:p></p>
<p class="MsoNormal">                fi<o:p></o:p></p>
<p class="MsoNormal">                logIt "debug1: exiting: azip_query()"<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">azip_usage() {<o:p></o:p></p>
<p class="MsoNormal">                cat <<END<o:p></o:p></p>
<p class="MsoNormal">usage: $0 {start|stop|status|monitor|validate-all|meta-data}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Expects to have a fully populated OCF RA-compliant environment set.<o:p></o:p></p>
<p class="MsoNormal">END<o:p></o:p></p>
<p class="MsoNormal">                return $OCF_SUCCESS<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">azip_start() {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                logIt "debug1: entered: azip_start()"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                #--if a matching ipconfig already exists in Azure, return success<o:p></o:p></p>
<p class="MsoNormal">                azip_query;RC=$?<o:p></o:p></p>
<p class="MsoNormal">                if [ $RC -eq 0 ]; then<o:p></o:p></p>
<p class="MsoNormal">                                logIt "debug1: $OCF_RESKEY_ip is already associated"<o:p></o:p></p>
<p class="MsoNormal">                                return $OCF_SUCCESS<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                else<o:p></o:p></p>
<p class="MsoNormal">                                #--create an interface ipconfig in Azure<o:p></o:p></p>
<p class="MsoNormal">                                logIt "debug1: creating ipconfig '$AZ_IPCONFIG_NAME'"<o:p></o:p></p>
<p class="MsoNormal">                                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 \<o:p></o:p></p>
<p class="MsoNormal">                                                --subnet $AZ_SUBNET_NAME --vnet-name $AZ_VNET_NAME"<o:p></o:p></p>
<p class="MsoNormal">                                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)<o:p></o:p></p>
<p class="MsoNormal">                                logIt "debug2: output: $R"<o:p></o:p></p>
<p class="MsoNormal">                                R2=$(echo "$R"|grep Succeeded)<o:p></o:p></p>
<p class="MsoNormal">                                if [ -n "$R2" ]; then<o:p></o:p></p>
<p class="MsoNormal">                                                logIt "debug1: $AZ_IPCONFIG_NAME created successfully with ip address $OCF_RESKEY_ip"<o:p></o:p></p>
<p class="MsoNormal">                                                return $OCF_SUCCESS<o:p></o:p></p>
<p class="MsoNormal">                                else<o:p></o:p></p>
<p class="MsoNormal">                                                logIt "debug1: failed to create ipconfig $AZ_IPCONFIG_NAME"<o:p></o:p></p>
<p class="MsoNormal">                                                return $OCF_ERR_GENERIC<o:p></o:p></p>
<p class="MsoNormal">                                fi<o:p></o:p></p>
<p class="MsoNormal">                fi<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                logIt "debug1: exiting: azip_start()"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">azip_stop() {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                logIt "debug1: entered: azip_stop()"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        #--if there is no matching ipconfig in Azure, exit with success<o:p></o:p></p>
<p class="MsoNormal">        azip_query;RC=$?<o:p></o:p></p>
<p class="MsoNormal">                if [ $RC -ne 0 ]; then <o:p></o:p></p>
<p class="MsoNormal">                logIt "debug1: $OCF_RESKEY_ip is not associated"<o:p></o:p></p>
<p class="MsoNormal">                return $OCF_SUCCESS<o:p></o:p></p>
<p class="MsoNormal">                else<o:p></o:p></p>
<p class="MsoNormal">               #--delete it<o:p></o:p></p>
<p class="MsoNormal">                                logIt "deleting ipconfig '$AZ_IPCONFIG_NAME'"<o:p></o:p></p>
<p class="MsoNormal">                                R=$(az network nic ip-config delete --name $AZ_IPCONFIG_NAME --nic-name $AZ_NIC_NAME --resource-group $AZ_RG_NAME)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                #--verify that it was deleted<o:p></o:p></p>
<p class="MsoNormal">                                logIt "verifying that ipconfig '$AZ_IPCONFIG_NAME' got removed"<o:p></o:p></p>
<p class="MsoNormal">                                azip_query;RC=$?<o:p></o:p></p>
<p class="MsoNormal">               if [ $RC -ne 0 ]; then<o:p></o:p></p>
<p class="MsoNormal">                              logIt "debug1: ipconfig $AZ_IPCONFIG_NAME successfully removed"<o:p></o:p></p>
<p class="MsoNormal">                              return $OCF_SUCCESS<o:p></o:p></p>
<p class="MsoNormal">                                else<o:p></o:p></p>
<p class="MsoNormal">                                                logIt "failed to remove $AZ_IPCONFIG_NAME."<o:p></o:p></p>
<p class="MsoNormal">                                                return $OCF_ERR_GENERIC<o:p></o:p></p>
<p class="MsoNormal">               fi<o:p></o:p></p>
<p class="MsoNormal">                fi<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                logIt "debug1: exiting: azip_stop()"<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">azip_monitor() {<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                logIt "debug1: entered: azip_monitor()"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                azip_query;RC=$?<o:p></o:p></p>
<p class="MsoNormal">                logIt "debug1: function azip_query() returned $RC"<o:p></o:p></p>
<p class="MsoNormal">                if [ $RC -eq 0 ]; then<o:p></o:p></p>
<p class="MsoNormal">                                return $OCF_SUCCESS<o:p></o:p></p>
<p class="MsoNormal">                else<o:p></o:p></p>
<p class="MsoNormal">                                return $OCF_NOT_RUNNING<o:p></o:p></p>
<p class="MsoNormal">                fi<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                logIt "debug1: exiting: azip_monitor()"<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">logIt() {<o:p></o:p></p>
<p class="MsoNormal">        MSG=$1<o:p></o:p></p>
<p class="MsoNormal">        if [ ${MSG:0:5} == "debug" ]<o:p></o:p></p>
<p class="MsoNormal">        then<o:p></o:p></p>
<p class="MsoNormal">                                MSG_LEVEL=${MSG:5:1}<o:p></o:p></p>
<p class="MsoNormal">                                if [ $MSG_LEVEL -le $DEBUG_LEVEL ]; then<o:p></o:p></p>
<p class="MsoNormal">                                                if [ $MSG_LEVEL -gt 1 ]; then<o:p></o:p></p>
<p class="MsoNormal">                                                                logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): debug$MSG_LEVEL ####################################################################"<o:p></o:p></p>
<p class="MsoNormal">                                                                logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): $1"<o:p></o:p></p>
<p class="MsoNormal">                                                                logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): debug$MSG_LEVEL ####################################################################"<o:p></o:p></p>
<p class="MsoNormal">                                                else<o:p></o:p></p>
<p class="MsoNormal">                                               logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): $1"<o:p></o:p></p>
<p class="MsoNormal">                                                fi<o:p></o:p></p>
<p class="MsoNormal">                                else<o:p></o:p></p>
<p class="MsoNormal">                                                return<o:p></o:p></p>
<p class="MsoNormal">                                fi<o:p></o:p></p>
<p class="MsoNormal">                else<o:p></o:p></p>
<p class="MsoNormal">               logger "$SCRIPT_NAME ($OCF_RESOURCE_INSTANCE): $1"<o:p></o:p></p>
<p class="MsoNormal">        fi<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">logIt "debug1: agent was asked to $__OCF_ACTION resource $OCF_RESOURCE_INSTANCE with IP address $OCF_RESKEY_ip"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">######################################################################<o:p></o:p></p>
<p class="MsoNormal">#  Azure Initialization<o:p></o:p></p>
<p class="MsoNormal">######################################################################<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#--check if azure is enabled<o:p></o:p></p>
<p class="MsoNormal">AZ_ENABLED=$(az account show|grep Enabled|sed "s/  *//g"|cut -d":" -f2|sed "s/\"//g"|sed "s/,//g")<o:p></o:p></p>
<p class="MsoNormal">if [ -z "$AZ_ENABLED" ]<o:p></o:p></p>
<p class="MsoNormal">then<o:p></o:p></p>
<p class="MsoNormal">        logIt "Azure account not detected"<o:p></o:p></p>
<p class="MsoNormal">                logIt "debug1: exiting $SCRIPT_NAME"<o:p></o:p></p>
<p class="MsoNormal">        exit $OCF_ERR_GENERIC<o:p></o:p></p>
<p class="MsoNormal">else<o:p></o:p></p>
<p class="MsoNormal">        logIt "debug1: AZ_ENABLED=$AZ_ENABLED"<o:p></o:p></p>
<p class="MsoNormal">fi<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#--set the ipconfig name <o:p></o:p></p>
<p class="MsoNormal">AZ_IPCONFIG_NAME="ipconfig-""$OCF_RESKEY_ip"<o:p></o:p></p>
<p class="MsoNormal">logIt "debug1: AZ_IPCONFIG_NAME=$AZ_IPCONFIG_NAME"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#--get the resource group name<o:p></o:p></p>
<p class="MsoNormal">AZ_RG_NAME=$(az group list|grep name|cut -d":" -f2|sed "s/  *//g"|sed "s/\"//g"|sed "s/,//g")<o:p></o:p></p>
<p class="MsoNormal">if [ -z "$AZ_RG_NAME" ]<o:p></o:p></p>
<p class="MsoNormal">then<o:p></o:p></p>
<p class="MsoNormal">        logIt "could not determine the Azure resource group name"<o:p></o:p></p>
<p class="MsoNormal">        exit $OCF_ERR_GENERIC<o:p></o:p></p>
<p class="MsoNormal">else<o:p></o:p></p>
<p class="MsoNormal">        logIt "debug1: AZ_RG_NAME=$AZ_RG_NAME"<o:p></o:p></p>
<p class="MsoNormal">fi<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#--get the nic name<o:p></o:p></p>
<p class="MsoNormal">AZ_NIC_NAME=$(az vm nic list -g $AZ_RG_NAME --vm-name $MY_HOSTNAME|grep networkInterfaces|cut -d"/" -f9|sed "s/\",//g")<o:p></o:p></p>
<p class="MsoNormal">if [ -z "$AZ_NIC_NAME" ]<o:p></o:p></p>
<p class="MsoNormal">then<o:p></o:p></p>
<p class="MsoNormal">        echo "could not determine the Azure NIC name"<o:p></o:p></p>
<p class="MsoNormal">        exit $OCF_ERR_GENERIC<o:p></o:p></p>
<p class="MsoNormal">else<o:p></o:p></p>
<p class="MsoNormal">        logIt "debug1: AZ_NIC_NAME=$AZ_NIC_NAME"<o:p></o:p></p>
<p class="MsoNormal">fi<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#--get the vnet and subnet names<o:p></o:p></p>
<p class="MsoNormal">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")<o:p></o:p></p>
<p class="MsoNormal">LDIFS=$IFS<o:p></o:p></p>
<p class="MsoNormal">IFS="/"<o:p></o:p></p>
<p class="MsoNormal">R_ARRAY=( $R )<o:p></o:p></p>
<p class="MsoNormal">AZ_VNET_NAME=${R_ARRAY[0]}<o:p></o:p></p>
<p class="MsoNormal">AZ_SUBNET_NAME=${R_ARRAY[1]}<o:p></o:p></p>
<p class="MsoNormal">if [ -z "$AZ_VNET_NAME" ]<o:p></o:p></p>
<p class="MsoNormal">then<o:p></o:p></p>
<p class="MsoNormal">        logIt "could not determine Azure vnet name"<o:p></o:p></p>
<p class="MsoNormal">        exit $OCF_ERR_GENERIC<o:p></o:p></p>
<p class="MsoNormal">else<o:p></o:p></p>
<p class="MsoNormal">        logIt "debug1: AZ_VNET_NAME=$AZ_VNET_NAME"<o:p></o:p></p>
<p class="MsoNormal">fi<o:p></o:p></p>
<p class="MsoNormal">if [ -z "$AZ_SUBNET_NAME" ]<o:p></o:p></p>
<p class="MsoNormal">then<o:p></o:p></p>
<p class="MsoNormal">        logIt "could not determine the Azure subnet name"<o:p></o:p></p>
<p class="MsoNormal">        exit $OCF_ERR_GENERIC<o:p></o:p></p>
<p class="MsoNormal">else<o:p></o:p></p>
<p class="MsoNormal">        logIt "debug1: AZ_SUBNET_NAME=$AZ_SUBNET_NAME"<o:p></o:p></p>
<p class="MsoNormal">fi<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">######################################################################<o:p></o:p></p>
<p class="MsoNormal">#  Actions <o:p></o:p></p>
<p class="MsoNormal">######################################################################<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">case $__OCF_ACTION in<o:p></o:p></p>
<p class="MsoNormal">meta-data)         meta_data<o:p></o:p></p>
<p class="MsoNormal">                                RC=$?<o:p></o:p></p>
<p class="MsoNormal">                                ;;<o:p></o:p></p>
<p class="MsoNormal">usage|help)       azip_usage<o:p></o:p></p>
<p class="MsoNormal">                                RC=$?<o:p></o:p></p>
<p class="MsoNormal">                                ;;<o:p></o:p></p>
<p class="MsoNormal">start)                     azip_start<o:p></o:p></p>
<p class="MsoNormal">                                RC=$?<o:p></o:p></p>
<p class="MsoNormal">                                ;;<o:p></o:p></p>
<p class="MsoNormal">stop)                     azip_stop<o:p></o:p></p>
<p class="MsoNormal">                                RC=$?<o:p></o:p></p>
<p class="MsoNormal">                                ;;<o:p></o:p></p>
<p class="MsoNormal">status)                  azip_query<o:p></o:p></p>
<p class="MsoNormal">                                RC=$?<o:p></o:p></p>
<p class="MsoNormal">                                ;;<o:p></o:p></p>
<p class="MsoNormal">monitor)              azip_monitor<o:p></o:p></p>
<p class="MsoNormal">                                RC=$?<o:p></o:p></p>
<p class="MsoNormal">                                ;;<o:p></o:p></p>
<p class="MsoNormal">validate-all)        ;;<o:p></o:p></p>
<p class="MsoNormal">*)                            azip_usage<o:p></o:p></p>
<p class="MsoNormal">                                RC=$OCF_ERR_UNIMPLEMENTED<o:p></o:p></p>
<p class="MsoNormal">                                ;;<o:p></o:p></p>
<p class="MsoNormal">esac<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#--exit with return code<o:p></o:p></p>
<p class="MsoNormal">logIt "debug1: exiting $SCRIPT_NAME with code $RC"<o:p></o:p></p>
<p class="MsoNormal">exit $RC<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#--end<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">--<br>
Eric Robinson<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</body>
</html>