Skip to content

Instantly share code, notes, and snippets.

@inokappa
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save inokappa/09f424f12a65c14179c2 to your computer and use it in GitHub Desktop.
Save inokappa/09f424f12a65c14179c2 to your computer and use it in GitHub Desktop.
Corosync と Pacemaker を利用して複数の EIP をインスタンス間で付け替えるスクリプトアルファ版
#!/bin/sh
#
#
# Resource Agent for AWS EC2 EIP
#
# Copyright (c) 2014 mooapp All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like. Any license provided herein, whether implied or
# otherwise, applies only to this software file. Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
#######################################################################
# Initialization:
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
#. /usr/lib/ocf/lib/heartbeat/ocf-shellfuncs
#######################################################################
meta_data() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="eip" version="0.9">
<version>1.0</version>
<longdesc lang="en">
This is a Resource Agent for AWS EC2 EIP (Elastic IP Address).
</longdesc>
<shortdesc lang="en">AWS EC2 EIP resource agent</shortdesc>
<parameters>
<parameter name="elastic_ip" required="1">
<longdesc lang="en">
The Elastic IP address
</longdesc>
<shortdesc lang="en">EIP</shortdesc>
<content type="string" />
</parameter>
<parameter name="eip_if" required="1">
<longdesc lang="en">
The Elastic IP address attached Interface
</longdesc>
<shortdesc lang="en">EIP_IF</shortdesc>
<content type="string" />
</parameter>
</parameters>
<actions>
<action name="start" timeout="20" />
<action name="stop" timeout="20" />
<action name="monitor" timeout="20" interval="10" depth="0" />
<action name="meta-data" timeout="5" />
<action name="validate-all" timeout="20" />
</actions>
</resource-agent>
END
}
#######################################################################
### Get Infomation Function
get_instance_id() {
instance_id=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
}
get_alloc_id() {
alloc_id=`/usr/bin/aws ec2 describe-addresses --public-ips ${OCF_RESKEY_elastic_ip} \
--query "Addresses[*].AllocationId" \
--output text`
}
get_instance_metainfo() {
mac_addr=`/sbin/ip link show ${OCF_RESKEY_eip_if} | tail -1 | awk '{print $2}'`
interface_id=`wget -q -O - http://169.254.169.254/latest/meta-data/network/interfaces/macs/${mac_addr}/interface-id`
private_ips=`wget -q -O - http://169.254.169.254/latest/meta-data/network/interfaces/macs/${mac_addr}/local-ipv4s`
}
### Execute Function
eip_usage() {
cat <<END
usage: $0 {start|stop|monitor|validate-all|meta-data}
Expects to have a fully populated OCF RA-compliant environment set.
END
}
eip_start() {
get_alloc_id
get_instance_metainfo
#eip_monitor
#if [ $? = $OCF_SUCCESS ]; then
# return $OCF_SUCCESS
#fi
echo "${OCF_RESKEY_elastic_ip} attaching start..." >> /tmp/test.log
for private_ip in ${private_ips[@]}
do
if [ ! -f /tmp/eip_${private_ip}.lock ];then
attached_privateip=`/usr/bin/aws ec2 describe-addresses --public-ips ${OCF_RESKEY_elastic_ip} --query 'Addresses[*].PrivateIpAddress' --output text`
if [ -z ${attached_privateip} ];then
/usr/bin/aws ec2 associate-address --allocation-id ${alloc_id} --network-interface-id ${interface_id} --private-ip-address ${private_ip}
echo -n ${OCF_RESKEY_elastic_ip} > /tmp/eip_${private_ip}.lock
echo "${OCF_RESKEY_elastic_ip} => ${private_ip} attached success." >> /tmp/test.log
exit 0
else
echo "${OCF_RESKEY_elastic_ip} => ${attached_privateip} already attached." >> /tmp/test.log
fi
else
echo "/tmp/eip_${private_ip}.lock exits." >> /tmp/test.log
fi
done
}
eip_stop() {
eip_monitor
if [ $? = $OCF_SUCCESS ]; then
/usr/bin/aws ec2 disassociate-address --public-ip ${OCF_RESKEY_elastic_ip}
rm /tmp/eip_*.lock
rm /tmp/test.log
fi
return $OCF_SUCCESS
}
eip_monitor() {
get_instance_id
mon=`/usr/bin/aws ec2 describe-addresses --public-ips ${OCF_RESKEY_elastic_ip} --filters "Name=instance-id,Values=${instance_id}" --output json | grep ${instance_id} | wc -l`
if [ $mon -ne 0 ]; then
return $OCF_SUCCESS
fi
return $OCF_NOT_RUNNING
}
eip_validate() {
return $OCF_SUCCESS
}
case $__OCF_ACTION in
meta-data) meta_data
exit $OCF_SUCCESS
;;
start) eip_start;;
stop) eip_stop;;
monitor) eip_monitor;;
validate-all) eip_validate;;
debug) eip_debug;;
usage|help) eip_usage
exit $OCF_SUCCESS
;;
*) eip_usage
exit $OCF_ERR_UNIMPLEMENTED
;;
esac
rc=$?
ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"
exit $rc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment