Big-IP: Sharepoint 2010 Monitor

While specing out a Sharepoint 2007 to 2010 migration I discovered that the default monitor created by the application template on our big-ip LTM load balancers does not work. In seeking a solution I ran across this gentleman’s blog with a custom external monitor but found that it didn’t really work. The solution to make it work was simple (as I explained on his blog in a comment). I went ahead and extended it to be more environment generic.
Copy this script to /user/bin/monitors/sharepoint2010.sh and chmod +x the file to use.

#!/bin/bash
# A custom NTLM capable sharepoint (or other site capable) health script for your big-ip load balancers
# Zachary Loeber 01/21/2011
# Save as /usr/bin/monitors/sharepoint2010.sh
# Make executable using chmod 700 sharepoint2010.sh
# The following variables should be set to get this to work properly
#
# URI: part of the site you want to use as your monitor (ie. _layouts/recyclebin.aspx)
# LOOKFOR: what will be returned that shows the site is up (ie. deleted)
# HOSTHEAD: the host header to use for the site (ie. sharepoint.corp.contoso.com)
# NTLMUSER: an account which can access this uri (ie. svcSPLBMonitoring@corp.contoso.com)
# NTLMPASS: the password of the above user (ie. password1)
# DEBUG: optional variable for debugging purposes, can be set to 0 or 1

# Log debug to local0.debug (/var/log/ltm)?
# Check if a variable named DEBUG exists from the monitor definition
# This can be set using a monitor variable DEBUG=0 or 1
if [ -n "$DEBUG" ]
then
 if [ $DEBUG -eq 1 ]; then echo "EAV `basename $0`: \$DEBUG: $DEBUG" | logger -p local0.debug; fi
else
 # If the monitor config didn't specify debug, enable/disable it here
 DEBUG=0
 #echo "EAV `basename $0`: \$DEBUG: $DEBUG" | logger -p local0.debug
fi

# Remove IPv6/IPv4 compatibility prefix (LTM passes addresses in IPv6 format)
IP=`echo $1 | sed 's/::ffff://'`

# Save the port for use in the shell command
PORT=$2

# Check if there is a prior instance of the monitor running
pidfile="/var/run/`basename $0`.$IP.$PORT.pid"
if [ -f $pidfile ]
then
 kill -9 `cat $pidfile` > /dev/null 2>&1
 echo "EAV `basename $0`: exceeded monitor interval, needed to kill ${IP}:${PORT} with PID `cat $pidfile`" | logger -p local0.error
fi

# Add the current PID to the pidfile
echo "$$" > $pidfile

####  Customize the shell command to run here. ###
# Use $IP and $PORT to specify which host/port to perform the check against
# Modify this portion of the line:
# nc $IP $PORT | grep "my receive string"
# And leave this portion as is:
# '2>&1 > /dev/null'
# The above code redirects stderr and stdout to nothing to ensure we don't errantly mark the pool member up

# Send the request request and check the response
curl -H "Host: $HOSTHEAD" -fNs --ntlm -k --user "$NTLMUSER:$NTLMPASS" \
 "http://$IP:$PORT/$URI" | grep -i "$LOOKFOR" 2>&1 > /dev/null

 # Check if the command ran successfully
# Note that any standard output will result in the script execution being stopped
# So do any cleanup before echoing to STDOUT
if [ $? -eq 0 ]
then
 echo "UP"
 rm -f $pidfile
 if [ $DEBUG -eq 1 ]; then echo "EAV `basename $0`: Succeeded for ${IP}:${PORT}" | logger -p local0.debug; fi
else
 rm -f $pidfile
 if [ $DEBUG -eq 1 ]; then echo "EAV `basename $0`: Failed for ${IP}:${PORT}" | logger -p local0.debug; fi
fi

# Debug
if [ $DEBUG -eq 1 ]
then
 ####  Customize the log statement here if you want to log the command run or the output ####
 echo "EAV `basename $0`: Running for ${IP}:${PORT} using custom command" | logger -p local0.debug
fi

Here is an example health monitor configuration:

Comments (3)

  1. 3:55 PM, 06/28/2012Doug Woodgate  / Reply

    Quick followup, if you plan to run the same script against multiple Virtual Servers on the same nodes, you will run into PID file problems.
    To solve, I’ve added the $HOSTHEAD variable to the PID file name to make them unique.
    For instance
    pidfile=”/var/run/`basename $0`.$HOSTHEAD.$IP.$PORT.pid”

  2. 9:27 AM, 05/10/2012Will  / Reply

    Excellent script, this has helped tremendously! One minor correction though – the PID file cleanup fails since STDOUT is stopping the script before cleanup occurs (your comments note this). You’ll want to move the echo to the end of the if/then section.


    # Check if the command ran successfully
    # Note that any standard output will result in the script execution being stopped
    # So do any cleanup before echoing to STDOUT
    if [ $? -eq 0 ]
    then
    rm -f $pidfile
    if [ $DEBUG -eq 1 ]; then echo "EAV `basename $0`: Succeeded for ${IP}:${PORT}" | logger -p local0.debug; fi
    echo "UP"
    else
    rm -f $pidfile
    if [ $DEBUG -eq 1 ]; then echo "EAV `basename $0`: Failed for ${IP}:${PORT}" | logger -p local0.debug; fi
    fi

  3. 3:45 AM, 04/10/2012Fachrul  / Reply

    it doesn’t work on version 9.3.0. Do you know why?

Leave a Reply

Pingbacks (0)

› No pingbacks yet.