Last active
August 29, 2015 13:57
-
-
Save armon/9512874 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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://s3.amazonaws.com/hc-ops/serf/serf.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 <<EOF >/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 <<EOF >/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 <<EOF >/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 <<EOF >/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 <<EOF >/tmp/query.conf | |
description "Query the serf cluster load" | |
start on runlevel [2345] | |
stop on runlevel [!2345] | |
respawn | |
script | |
echo I am "${HOSTNAME}<br>" > /var/www/index.html | |
serf query -no-ack load | sed 's|$|<br>|' >> /var/www/index.html | |
sleep 10 | |
end script | |
EOF | |
sudo mv /tmp/query.conf /etc/init/serf-query.conf | |
sudo start serf-query |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment