diff -uNr a/doc/man/Makefile.am b/doc/man/Makefile.am --- a/doc/man/Makefile.am 2018-02-21 13:07:56.172091057 +0100 +++ b/doc/man/Makefile.am 2018-02-21 13:05:37.589245986 +0100 @@ -99,6 +99,9 @@ ocf_heartbeat_anything.7 \ ocf_heartbeat_apache.7 \ ocf_heartbeat_asterisk.7 \ + ocf_heartbeat_aws-vpc-move-ip.7 \ + ocf_heartbeat_awseip.7 \ + ocf_heartbeat_awsvip.7 \ ocf_heartbeat_clvm.7 \ ocf_heartbeat_conntrackd.7 \ ocf_heartbeat_db2.7 \ diff -uNr a/heartbeat/awseip b/heartbeat/awseip --- a/heartbeat/awseip 1970-01-01 01:00:00.000000000 +0100 +++ b/heartbeat/awseip 2018-02-21 13:08:21.112887254 +0100 @@ -0,0 +1,278 @@ +#!/bin/sh +# +# +# Manage Elastic IP with Pacemaker +# +# +# Copyright 2016 guessi +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# + +# +# Prerequisites: +# +# - preconfigured AWS CLI running environment (AccessKey, SecretAccessKey, etc.) +# - a reserved secondary private IP address for EC2 instances high availablity +# - IAM user role with the following permissions: +# * DescribeInstances +# * AssociateAddress +# * DisassociateAddress +# + +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# +# Defaults +# +OCF_RESKEY_awscli_default="/usr/bin/aws" +OCF_RESKEY_profile_default="default" +OCF_RESKEY_api_delay_default="3" + +: ${OCF_RESKEY_awscli=${OCF_RESKEY_awscli_default}} +: ${OCF_RESKEY_profile=${OCF_RESKEY_profile_default}} +: ${OCF_RESKEY_api_delay=${OCF_RESKEY_api_delay_default}} + +meta_data() { + cat < + + +1.0 + + +Resource Agent for Amazon AWS Elastic IP Addresses. + +It manages AWS Elastic IP Addresses with awscli. + +Credentials needs to be setup by running "aws configure". + +See https://aws.amazon.com/cli/ for more information about awscli. + +Amazon AWS Elastic IP Address Resource Agent + + + + + +command line tools for aws services + +aws cli tools + + + + + +Valid AWS CLI profile name (see ~/.aws/config and 'aws configure') + +profile name + + + + + +reserved elastic ip for ec2 instance + +reserved elastic ip for ec2 instance + + + + + +reserved allocation id for ec2 instance + +reserved allocation id for ec2 instance + + + + + +predefined private ip address for ec2 instance + +predefined private ip address for ec2 instance + + + + + +a short delay between API calls, to avoid sending API too quick + +a short delay between API calls + + + + + + + + + + + + + + + + +END +} + +####################################################################### + +awseip_usage() { + cat < +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# + +# +# Prerequisites: +# +# - preconfigured AWS CLI running environment (AccessKey, SecretAccessKey, etc.) +# - a reserved secondary private IP address for EC2 instances high availablity +# - IAM user role with the following permissions: +# * DescribeInstances +# * AssignPrivateIpAddresses +# * UnassignPrivateIpAddresses +# + +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +####################################################################### + +# +# Defaults +# +OCF_RESKEY_awscli_default="/usr/bin/aws" +OCF_RESKEY_profile_default="default" +OCF_RESKEY_api_delay_default="3" + +: ${OCF_RESKEY_awscli=${OCF_RESKEY_awscli_default}} +: ${OCF_RESKEY_profile=${OCF_RESKEY_profile_default}} +: ${OCF_RESKEY_api_delay=${OCF_RESKEY_api_delay_default}} + +meta_data() { + cat < + + +1.0 + + +Resource Agent for Amazon AWS Secondary Private IP Addresses. + +It manages AWS Secondary Private IP Addresses with awscli. + +Credentials needs to be setup by running "aws configure". + +See https://aws.amazon.com/cli/ for more information about awscli. + +Amazon AWS Secondary Private IP Address Resource Agent + + + + + +command line tools for aws services + +aws cli tools + + + + + +Valid AWS CLI profile name (see ~/.aws/config and 'aws configure') + +profile name + + + + + +reserved secondary private ip for ec2 instance + +reserved secondary private ip for ec2 instance + + + + + +a short delay between API calls, to avoid sending API too quick + +a short delay between API calls + + + + + + + + + + + + + + + + +END +} + +####################################################################### + +awsvip_usage() { + cat < + + +2.0 + +Resource Agent to move IP addresses within a VPC of the Amazon Webservices EC2 +by changing an entry in an specific routing table + +Move IP within a APC of the AWS EC2 + + + + +Path to command line tools for AWS + +Path to AWS CLI tools + + + + + +Valid AWS CLI profile name (see ~/.aws/config and 'aws configure') + +profile name + + + + + +VPC private IP address + +VPC private IP + + + + + +Name of the routing table, where the route for the IP address should be changed, i.e. rtb-... + +routing table name + + + + + +Name of the network interface, i.e. eth0 + +network interface name + + + + + +Enable enhanced monitoring using AWS API calls to check route table entry + +Enhanced Monitoring + + + + + + + + + + + + +END +} + +ec2ip_validate() { + for cmd in aws ip curl; do + check_binary "$cmd" + done + + if [ -z "$OCF_RESKEY_profile" ]; then + ocf_exit_reason "profile parameter not set" + return $OCF_ERR_CONFIGURED + fi + + EC2_INSTANCE_ID="$(curl -s http://169.254.169.254/latest/meta-data/instance-id)" + + if [ -z "${EC2_INSTANCE_ID}" ]; then + ocf_exit_reason "Instance ID not found. Is this a EC2 instance?" + return $OCF_ERR_GENERIC + fi + + return $OCF_SUCCESS +} + +ec2ip_monitor() { + if ocf_is_true ${OCF_RESKEY_monapi} || [ "$__OCF_ACTION" = "start" ]; then + ocf_log info "monitor: check routing table (API call)" + cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile --output text ec2 describe-route-tables --route-table-ids $OCF_RESKEY_routing_table" + ocf_log debug "executing command: $cmd" + ROUTE_TO_INSTANCE="$($cmd | grep $OCF_RESKEY_ip | awk '{ print $3 }')" + if [ -z "$ROUTE_TO_INSTANCE" ]; then + ROUTE_TO_INSTANCE="" + fi + + if [ "$EC2_INSTANCE_ID" != "$ROUTE_TO_INSTANCE" ];then + ocf_log warn "not routed to this instance ($EC2_INSTANCE_ID) but to instance $ROUTE_TO_INSTANCE" + return $OCF_NOT_RUNNING + fi + else + ocf_log debug "monitor: Enhanced Monitoring disabled - omitting API call" + fi + + cmd="ping -W 1 -c 1 $OCF_RESKEY_ip" + ocf_log debug "executing command: $cmd" + $cmd > /dev/null + if [ "$?" -gt 0 ]; then + ocf_log warn "IP $OCF_RESKEY_ip not locally reachable via ping on this system" + return $OCF_NOT_RUNNING + fi + + ocf_log debug "route in VPC and locally reachable" + return $OCF_SUCCESS +} + + +ec2ip_drop() { + cmd="ip addr delete ${OCF_RESKEY_ip}/32 dev $OCF_RESKEY_interface" + ocf_log debug "executing command: $cmd" + $cmd + rc=$? + if [ "$rc" -gt 0 ]; then + ocf_log warn "command failed, rc $rc" + return $OCF_ERR_GENERIC + fi + + return $OCF_SUCCESS +} + +ec2ip_get_and_configure() { + # Adjusting the routing table + cmd="$OCF_RESKEY_awscli --profile $OCF_RESKEY_profile ec2 replace-route --route-table-id $OCF_RESKEY_routing_table --destination-cidr-block ${OCF_RESKEY_ip}/32 --instance-id $EC2_INSTANCE_ID" + ocf_log debug "executing command: $cmd" + $cmd + rc=$? + if [ "$rc" != 0 ]; then + ocf_log warn "command failed, rc: $rc" + return $OCF_ERR_GENERIC + fi + + # Reconfigure the local ip address + ec2ip_drop + ip addr add "${OCF_RESKEY_ip}/32" dev $OCF_RESKEY_interface + rc=$? + if [ $rc != 0 ]; then + ocf_log warn "command failed, rc: $rc" + return $OCF_ERR_GENERIC + fi + + return $OCF_SUCCESS +} + +ec2ip_stop() { + ocf_log info "EC2: Bringing down IP address $OCF_RESKEY_ip" + + ec2ip_monitor + if [ $? = $OCF_NOT_RUNNING ]; then + ocf_log info "EC2: Address $OCF_RESKEY_ip already down" + return $OCF_SUCCESS + fi + + ec2ip_drop + if [ $? != $OCF_SUCCESS ]; then + return $OCF_ERR_GENERIC + fi + + ec2ip_monitor + if [ $? != $OCF_NOT_RUNNING ]; then + ocf_log error "EC2: Couldn't bring down IP address $OCF_RESKEY_ip on interface $OCF_RESKEY_interface." + return $OCF_ERR_GENERIC + fi + + ocf_log info "EC2: Successfully brought down $OCF_RESKEY_ip" + return $OCF_SUCCESS +} + +ec2ip_start() { + ocf_log info "EC2: Moving IP address $OCF_RESKEY_ip to this host by adjusting routing table $OCF_RESKEY_routing_table" + + ec2ip_monitor + if [ $? = $OCF_SUCCESS ]; then + ocf_log info "EC2: $OCF_RESKEY_ip already started" + return $OCF_SUCCESS + fi + + ocf_log info "EC2: Adjusting routing table and locally configuring IP address" + ec2ip_get_and_configure + rc=$? + if [ $rc != $OCF_SUCCESS ]; then + ocf_log error "Received $rc from 'aws'" + return $OCF_ERR_GENERIC + fi + + ec2ip_monitor + if [ $? != $OCF_SUCCESS ]; then + ocf_log error "EC2: IP address couldn't be configured on this host (IP: $OCF_RESKEY_ip, Interface: $OCF_RESKEY_interface)" + return $OCF_ERR_GENERIC + fi + + return $OCF_SUCCESS +} + +############################################################################### +# +# MAIN +# +############################################################################### + +case $__OCF_ACTION in + meta-data) + metadata + exit $OCF_SUCCESS + ;; + usage|help) + echo $USAGE + exit $OCF_SUCCESS + ;; +esac + +if ! ocf_is_root; then + ocf_log err "You must be root for $__OCF_ACTION operation." + exit $OCF_ERR_PERM +fi + +ec2ip_validate + +case $__OCF_ACTION in + start) + ec2ip_start;; + stop) + ec2ip_stop;; + monitor) + ec2ip_monitor;; + validate-all) + exit $?;; + *) + echo $USAGE + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac diff -uNr a/heartbeat/Makefile.am b/heartbeat/Makefile.am --- a/heartbeat/Makefile.am 2018-02-21 13:07:45.862175305 +0100 +++ b/heartbeat/Makefile.am 2018-02-21 13:05:37.589245986 +0100 @@ -64,6 +64,9 @@ AoEtarget \ apache \ asterisk \ + aws-vpc-move-ip \ + awseip \ + awsvip \ nginx \ AudibleAlarm \ clvm \