#!/bin/sh # # This script installs and configures the Serf agent that runs on # every node. As with the other scripts, this should probably be done with # formal configuration management, but a shell script is simple as well. # # The SERF_ROLE environmental variable must be passed into this script # in order to set the role of the machine. This should be either "lb" or # "web". # set -e sudo apt-get install -y unzip # Download and install Serf cd /tmp until wget -O serf.zip https://dl.bintray.com/mitchellh/serf/0.6.4_linux_amd64.zip; do sleep 1 done unzip serf.zip sudo mv serf /usr/local/bin/serf # The member join script is invoked when a member joins the Serf cluster. # Our join script simply adds the node to the load balancer. cat </tmp/join.sh if [ "x\${SERF_TAG_ROLE}" != "xlb" ]; then echo "Not an lb. Ignoring member join." exit 0 fi while read line; do ROLE=\`echo \$line | awk '{print \\\$3 }'\` if [ "x\${ROLE}" != "xweb" ]; then continue fi echo \$line | \\ awk '{ printf " server %s %s check\\n", \$1, \$2 }' >>/etc/haproxy/haproxy.cfg done /etc/init.d/haproxy reload EOF sudo mv /tmp/join.sh /usr/local/bin/serf_member_join.sh chmod +x /usr/local/bin/serf_member_join.sh # The member leave script is invoked when a member leaves or fails out # of the serf cluster. Our script removes the node from the load balancer. cat </tmp/leave.sh if [ "x\${SERF_TAG_ROLE}" != "xlb" ]; then echo "Not an lb. Ignoring member leave" exit 0 fi while read line; do NAME=\`echo \$line | awk '{print \\\$1 }'\` sed -i'' "/\${NAME} /d" /etc/haproxy/haproxy.cfg done /etc/init.d/haproxy reload EOF sudo mv /tmp/leave.sh /usr/local/bin/serf_member_left.sh chmod +x /usr/local/bin/serf_member_left.sh # Configure the agent cat </tmp/agent.conf description "Serf agent" start on runlevel [2345] stop on runlevel [!2345] exec /usr/local/bin/serf agent \\ -event-handler "member-join=/usr/local/bin/serf_member_join.sh" \\ -event-handler "member-leave,member-failed=/usr/local/bin/serf_member_left.sh" \\ -event-handler "query:load=uptime" \\ -tag role=${SERF_ROLE} >>/var/log/serf.log 2>&1 EOF sudo mv /tmp/agent.conf /etc/init/serf.conf # Start the agent! sudo start serf # If we're the web node, then we need to configure the join retry if [ "x${SERF_ROLE}" != "xweb" ]; then exit 0 fi cat </tmp/join.conf description "Join the serf cluster" start on runlevel [2345] stop on runlevel [!2345] task respawn script sleep 5 exec /usr/local/bin/serf join 10.0.0.5 end script EOF sudo mv /tmp/join.conf /etc/init/serf-join.conf sudo start serf-join cat </tmp/query.conf description "Query the serf cluster load" start on runlevel [2345] stop on runlevel [!2345] respawn script echo `date` I am "${HOSTNAME}
" > /var/www/index.html.1 serf query -no-ack load | sed 's|$|
|' >> /var/www/index.html.1 mv /var/www/index.html.1 /var/www/index.html sleep 10 end script EOF sudo mv /tmp/query.conf /etc/init/serf-query.conf sudo start serf-query