[ClusterLabs] [Linux-HA] fence_ec2 agent
Dejan Muhamedagic
dejanmm at fastmail.fm
Thu Oct 1 13:16:35 UTC 2015
Hi Kazuhiko-san,
On Mon, Sep 28, 2015 at 02:22:02PM +0900, 東一彦 wrote:
> Hi Dejan,
>
> I made a patch file as unified diff by "hg export tip" command.
>
> Would you please marge it ?
Merged. I just modified a bit the summary and patch description
beforehand. Many thanks!
Cheers,
Dejan
>
>
> Regards,
> Kazuhiko Higashi
>
> On 2015/09/25 0:04, Dejan Muhamedagic wrote:
> >Hi Kazuhiko-san,
> >
> >On Wed, Mar 25, 2015 at 10:47:01AM +0900, 東一彦 wrote:
> >>Hi Markus,
> >>
> >>I implemented it for trial.
> >>
> >>[diff from http://hg.linux-ha.org/glue/rev/9da0680bc9c0 ]
> >>50d49
> >>< port_default=""
> >>60c59
> >>< ec2_tag=${tag}
> >>---
> >>>[ -n "$tag" ] && ec2_tag="$tag"
> >>63d61
> >>< : ${port=${port_default}}
> >>97c95
> >>< <parameter name="port" unique="1" required="1">
> >>---
> >>> <parameter name="port" unique="1" required="0">
> >>105c103
> >>< <parameter name="tag" unique="0" required="1">
> >>---
> >>> <parameter name="tag" unique="0" required="0">
> >>132c130
> >>< <parameter name="port" unique="1" required="1">
> >>---
> >>> <parameter name="port" unique="1" required="0">
> >>142c140
> >>< <parameter name="tag" unique="0" required="1">
> >>---
> >>> <parameter name="tag" unique="0" required="0">
> >>221a220,224
> >>>function monitor()
> >>>{
> >>> # Is the device ok?
> >>> aws ec2 describe-instances $options | grep INSTANCES &> /dev/null
> >>>}
> >>267a271
> >>>[ -n "$2" ] && node_to_fence=$2
> >>326a331,334
> >>>if [ -z "$port" ]; then
> >>> port="$node_to_fence"
> >>>fi
> >>>
> >>379,380c387
> >>< # Is the device ok?
> >>< aws ec2 describe-instances $options | grep INSTANCES &> /dev/null
> >>---
> >>> monitor
> >>391c398
> >>< instance_status $instance > /dev/null
> >>---
> >>> monitor
> >>
> >>
> >>
> >>It works fine on my environment with 2 patterns settings below.
> >>
> >>[pattern No.1]
> >>Without "port" and "tag" parameters.
> >>And instances has "Name=<uname>" tag.
> >>
> >>----
> >>primitive prmStonith1-2 stonith:external/ec2 \
> >> params \
> >> pcmk_off_timeout="120s" \
> >> op start interval="0s" timeout="60s" \
> >> op monitor interval="3600s" timeout="60s" \
> >> op stop interval="0s" timeout="60s"
> >>----
> >>
> >>
> >>[pattern No.2]
> >>With only "tag" parameter.(Without "port" parameter.)
> >>And, The 1st instance(node01) has "Cluster1=node01" tag.
> >>The 2nd instance(node02) has "Cluster1=node02" tag.
> >>
> >>----
> >>primitive prmStonith1-2 stonith:external/ec2 \
> >> params \
> >> pcmk_off_timeout="120s" \
> >> tag="Cluster1" \
> >> op start interval="0s" timeout="60s" \
> >> op monitor interval="3600s" timeout="60s" \
> >> op stop interval="0s" timeout="60s"
> >>----
> >
> >Sounds good. Sorry for the delay, but would it be possible that
> >you provide a patch as unified diff or similar so that we can
> >apply it.
> >
> >Cheers,
> >
> >Dejan
> >
> >>
> >>Regards,
> >>Kazuhiko Higashi
> >>
> >>
> >>On 2015/03/24 20:48, 東一彦 wrote:
> >>>Hi Markus,
> >>>
> >>>Thank you for the comment.
> >>>
> >>>>Would it be possible, to implement this idea as an additional configuration method to the fence_ec2 agent?
> >>>I think that your idea is good.
> >>>
> >>>So, I tries to implement it.
> >>>I'm going to change the fence_ec2(ec2) the following points.
> >>>
> >>> - the "tag" and the "port" options will be "not" required.
> >>>
> >>> - if the "port" option is not set, the 2nd argument of ec2 will use as the "port".
> >>> - the 2nd argument of ec2 is "node to fence".
> >>>
> >>> - the "stat" and "status" action will be same the "monitor" action.
> >>> (for do not use the "port" parameter in "stat" action.)
> >>>
> >>>
> >>>By the above modifications, If it is described uname in the Name tag,
> >>>the setting of the "tag" and "port" parameters are no longer necessary.
> >>>
> >>>----
> >>>primitive prmStonith1-2 stonith:external/ec2 \
> >>> params \
> >>> pcmk_off_timeout="120s" \
> >>> op start interval="0s" timeout="60s" \
> >>> op monitor interval="3600s" timeout="60s" \
> >>> op stop interval="0s" timeout="60s"
> >>>----
> >>>
> >>>
> >>>You can use "tag" parameter like your "Clustername" tag.
> >>>If cluster nodes(instances) have "Cluster1" tag, and uname is described in that tag,
> >>>it works just like you to expect.
> >>>
> >>>----
> >>>primitive prmStonith1-2 stonith:external/ec2 \
> >>> params \
> >>> pcmk_off_timeout="120s" \
> >>> tag="Cluster1" \
> >>> op start interval="0s" timeout="60s" \
> >>> op monitor interval="3600s" timeout="60s" \
> >>> op stop interval="0s" timeout="60s"
> >>>----
> >>>
> >>>The 1st instance have "Cluster1=node01" tag-key.
> >>>The 2nd instance have "Cluster1=node02" tag-key.
> >>>The 3rd instance have "Cluster1=node03" tag-key.
> >>>...
> >>>The prmStonith1-2 can fence node01 , node02 and node03.
> >>>
> >>>
> >>>If you like above, I will implement that.
> >>>
> >>>
> >>>Regards,
> >>>Kazuhiko Higashi
> >>>
> >>>
> >>>On 2015/03/19 1:03, Markus Guertler wrote:
> >>>>Hi Kazuhiko, Dejan,
> >>>>
> >>>>the new resource agent is very good. Since there were a couple of days between my original question and the answer from
> >>>>Kazuhiko, I also have written a stonith agent proof of concept (attached to this email) in order to continue in my
> >>>>project. However, I think that your fence_ec2 agent is better from a development perspective and it doesn't make sense
> >>>>to have two different agents for the same use case.
> >>>>
> >>>>Nevertheless, I've implemented an idea, that is very useful in EC2 environments with clusters that have more than two
> >>>>nodes: All EC2 instances that belong to a cluster get a unique cluster name via an EC2 instance tag. The agent uses this
> >>>>tag to determine all cluster nodes that belong to his own cluster
> >>>>
> >>>>--- SNIP ---
> >>>> gethosts)
> >>>> # List of hostnames of this cluster
> >>>> init_agent
> >>>> ec2-describe-instances --filter "tag-key=Clustername" --filter "tag-value=$clustername" | grep "^TAG" |grep
> >>>>"Hostname" | awk '{ print $5 }' | sort -u
> >>>>--- SNIP ---
> >>>>
> >>>>The advantage of this method is, that you just need one configuration snippet for all nodes. This allows to dynamically
> >>>>add or remove EC2 instances / cluster nodes to/from a cluster without having to need to touch the cluster configuration.
> >>>>Dynamically adding or removing nodes (compute instances) is a very common scenario in a cloud.
> >>>>
> >>>>Would it be possible, to implement this idea as an additional configuration method to the fence_ec2 agent?
> >>>>
> >>>>Cheers,
> >>>>Markus
> >>>>
> >>>>>>>東一彦 <higashi.kazuhiko at lab.ntt.co.jp> 3/12/2015 10:44 AM >>>
> >>>>Hi Dejan
> >>>>
> >>>>Thank you for add it and the fix some issues !
> >>>>
> >>>>
> >>>> > I was not able to test it, hope it works :)
> >>>>I confirmed that it works fine in my AWS environment :)
> >>>>
> >>>>
> >>>>Regards,
> >>>>Kazuhiko Higashi
> >>>>
> >>>>On 2015/03/11 21:27, Dejan Muhamedagic wrote:
> >>>>>Hi Kazuhiko-san,
> >>>>>
> >>>>>On Wed, Mar 11, 2015 at 02:36:43PM +0900, 東一彦 wrote:
> >>>>>>Hi, Dejan
> >>>>>>
> >>>>>>Thank you for the comment.
> >>>>>>
> >>>>>>I'd like to contribute it as glue stonith agents.
> >>>>>>
> >>>>>>So, I rename it to just "ec2".
> >>>>>>
> >>>>>>Would you please add it to glue repository (http://hg.linux-ha.org/glue/) ?
> >>>>>
> >>>>>I just added your stonith agent. There were this change in the
> >>>>>initial changeset:
> >>>>>
> >>>>>- replaced '-' which is not allowed in identifiers with '_' in
> >>>>> function getinfo_xml().
> >>>>>
> >>>>>There were other smaller changes. You can find them in the
> >>>>>repository.
> >>>>>
> >>>>>I was not able to test it, hope it works :)
> >>>>>
> >>>>>Many thanks for the contribution.
> >>>>>
> >>>>>Cheers,
> >>>>>
> >>>>>Dejan
> >>>>>
> >>>>>>Regards,
> >>>>>>Kazuhiko Higashi
> >>>>>>
> >>>>>>On 2015/03/06 2:38, Dejan Muhamedagic wrote:
> >>>>>>>Hi,
> >>>>>>>
> >>>>>>>On Tue, Mar 03, 2015 at 05:13:49PM +0900, 東一彦 wrote:
> >>>>>>>>Dear Markus,
> >>>>>>>>
> >>>>>>>>I was also thinking the same thing.
> >>>>>>>>So, Already I've created a new one.
> >>>>>>>
> >>>>>>>Perhaps you'd like to then contribute it upstream? Either to
> >>>>>>>glue stonith agents or RHT fencing agents. It appears that the
> >>>>>>>agent is using the stonith interface, but the name reflects the
> >>>>>>>fencing agents naming scheme.
> >>>>>>>
> >>>>>>>Cheers,
> >>>>>>>
> >>>>>>>Dejan
> >>>>>>>
> >>>>>>>>[ChangeSet]
> >>>>>>>>- An API to be used was changed from "Amazon EC2 CLI" to "AWS CLI".
> >>>>>>>> -- "AWS CLI" is based Python. So, CPU load might be reduced.
> >>>>>>>>
> >>>>>>>>- The "--private-key" and "--cert" options are deprecated in AWS CLI.
> >>>>>>>> So, I add a new option "--profile". Use a specific profile from that credential file.
> >>>>>>>> default is ""
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>[How to use]
> >>>>>>>>- Plaese install the "AWS CLI".
> >>>>>>>> http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
> >>>>>>>>
> >>>>>>>>- Please copy the fence_ec2 in /usr/lib64/stonith/plugins/external/.
> >>>>>>>> And , Please set the permissions to 755.
> >>>>>>>>
> >>>>>>>>- Please set crm settings as in this example.
> >>>>>>>> - The instance that have been set as "node01" in the "Name" tag are fence.
> >>>>>>>> ------
> >>>>>>>> primitive prmStonith1-2 stonith:external/fence_ec2 \
> >>>>>>>> params \
> >>>>>>>> pcmk_off_timeout="300s" \
> >>>>>>>> port="node01" \
> >>>>>>>> tag="Name"
> >>>>\
> >>>>>>>> op start interval="0s" timeout="60s" \
> >>>>>>>> op monitor interval="3600s" timeout="60s" \
> >>>>>>>> op stop interval="0s" timeout="60s"
> >>>>>>>> ------
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>Regards,
> >>>>>>>>Kazuhiko Higashi
> >>>>>>>>
> >>>>>>>>On 2015/02/25 7:22, Markus Guertler wrote:
> >>>>>>>>>Dear list,
> >>>>>>>>>I was just trying to configure the fence_ec2 stonith agent from 2012, written by Andrew Beekhof. It looks like,
> >>>>that this one not working anymore with newer stonith / cluster versions. Is there any other EC2 agent, that is still
> >>>>maintained?
> >>>>>>>>>
> >>>>>>>>>If not, I'll write one myself. However, I'd like to check all options first.
> >>>>>>>>>
> >>>>>>>>>Cheers,
> >>>>>>>>>Markus
> >>>>>>>>>
> >>>>>>>>>_______________________________________________
> >>>>>>>>>Linux-HA mailing list
> >>>>>>>>>Linux-HA at lists.linux-ha.org
> >>>>>>>>>http://lists.linux-ha.org/mailman/listinfo/linux-ha
> >>>>>>>>>See also: http://linux-ha.org/ReportingProblems
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>
> >>>>>>#!/bin/bash
> >>>>>>
> >>>>>>description="
> >>>>>>fence_ec2 is an I/O Fencing agent which can be used with Amazon EC2 instances.
> >>>>>>
> >>>>>>API functions used by this agent:
> >>>>>>- aws ec2 describe-tags
> >>>>>>- aws ec2 describe-instances
> >>>>>>- aws ec2 stop-instances
> >>>>>>- aws ec2 start-instances
> >>>>>>- aws ec2 reboot-instances
> >>>>>>
> >>>>>>If the uname used by the cluster node is any of:
> >>>>>> - Public DNS name (or part there of),
> >>>>>> - Private DNS name (or part there of),
> >>>>>> - Instance ID (eg. i-4f15a839)
> >>>>>> - Contents of tag associated with the instance
> >>>>>>then the agent should be able to automatically discover the instances it can control.
> >>>>>>
> >>>>>>If the tag containing the uname is not [Name], then it will need to be specified using the [tag] option.
> >>>>>>"
> >>>>>>
> >>>>>>#
> >>>>>># Copyright (c) 2011-2013 Andrew Beekhof
> >>>>>># Copyright (c) 2014 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
> >>>>>># 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.
> >>>>>>#
> >>>>>>#######################################################################
> >>>>>>
> >>>>>>quiet=0
> >>>>>>port_default=""
> >>>>>>
> >>>>>>instance_not_found=0
> >>>>>>unknown_are_stopped=0
> >>>>>>
> >>>>>>action_default="reset" # Default fence action
> >>>>>>ec2_tag_default="Name" # EC2 Tag containing the instance's uname
> >>>>>>
> >>>>>>sleep_time="1"
> >>>>>>
> >>>>>>ec2_tag=${tag}
> >>>>>>
> >>>>>>: ${ec2_tag=${ec2_tag_default}}
> >>>>>>: ${port=${port_default}}
> >>>>>>
> >>>>>>function usage()
> >>>>>>{
> >>>>>>cat <<EOF
> >>>>>>`basename $0` - A fencing agent for Amazon EC2 instances
> >>>>>>
> >>>>>>$description
> >>>>>>
> >>>>>>Usage: `basename $0` -o|--action [-n|--port] [options]
> >>>>>>Options:
> >>>>>> -h, --help This text
> >>>>>> -V, --version Version information
> >>>>>> -q, --quiet Reduced output mode
> >>>>>>
> >>>>>>Commands:
> >>>>>> -o, --action Action to perform: on|off|reboot|status|monitor
> >>>>>> -n, --port The name of a machine/instance to control/check
> >>>>>>
> >>>>>>Additional Options:
> >>>>>> -p, --profile Use a specific profile from your credential file.
> >>>>>> -t, --tag Name of the tag containing the instance's uname
> >>>>>>
> >>>>>>Dangerous options:
> >>>>>> -U, --unknown-are-stopped Assume any unknown instance is safely stopped
> >>>>>>
> >>>>>>EOF
> >>>>>>
> >>>> exit 0;
> >>>>>>}
> >>>>>>
> >>>>>>function getinfo-xml()
> >>>>>>{
> >>>>>> cat <<EOF
> >>>>>><parameters>
> >>>>>> <parameter name="port" unique="1" required="1">
> >>>>>> <content type="string" />
> >>>>>> <shortdesc lang="en">The name/id/tag of a instance to control/check</shortdesc>
> >>>>>> </parameter>
> >>>>>> <parameter name="profile" unique="0" required="0">
> >>>>>> <content type="string" default="default" />
> >>>>>> <shortdesc lang="en">Use a specific profile from your credential file.</shortdesc>
> >>>>>> </parameter>
> >>>>>> <parameter name="tag" unique="0" required="1">
> >>>>>> <content type="string" default="Name" />
> >>>>>> <shortdesc lang="en">Name of the tag containing the instances uname</shortdesc>
> >>>>>> </parameter>
> >>>>>> <parameter name="unknown_are_stopped" unique="0" required="0">
> >>>>>> <content type="string" default="false" />
> >>>>>> <shortdesc lang="en">DANGER: Assume any unknown instance is safely stopped</shortdesc>
> >>>>>> </parameter>
> >>>>>></parameters>
> >>>>>>EOF
> >>>>>> exit 0;
> >>>>>>}
> >>>>>>
> >>>>>>function metadata()
> >>>>>>{
> >>>>>> cat <<EOF
> >>>>>><?xml version="1.0" ?>
> >>>>>><resource-agent name="fence_ec2" shortdesc="Fencing agent for Amazon EC2 instances" >
> >>>>>> <longdesc>
> >>>>>>$description
> >>>>>> </longdesc>
> >>>>>> <parameters>
> >>>>>> <parameter name="action" unique="0" required="1">
> >>>>>> <getopt mixed="-o, --action=[action]" />
> >>>>>> <content type="string" default="reboot" />
> >>>>>> <shortdesc lang="en">Fencing Action</shortdesc>
> >>>>>> </parameter>
> >>>>>> <parameter name="port" unique="1" required="1">
> >>>>>> <getopt mixed="-n, --port=[port]" />
> >>>>>> <content type="string" />
> >>>>>> <shortdesc lang="en">The name/id/tag of a instance to control/check</shortdesc>
> >>>>>> </parameter>
> >>>>>> <parameter name="profile" unique="0" required="0">
> >>>>>> <getopt mixed="-p, --profile=[profile]" />
> >>>>>> <content type="string" default="default" />
> >>>>>> <shortdesc lang="en">Use a specific profile from your credential file.</shortdesc>
> >>>>>> </parameter>
> >>>>>> <parameter name="tag" unique="0" required="1">
> >>>>>> <getopt mixed="-t, --tag=[tag]" />
> >>>>>> <content type="string" default="Name" />
> >>>>>> <shortdesc lang="en">Name of the tag containing the instances uname</shortdesc>
> >>>>>> </parameter>
> >>>>>> <parameter name="unknown-are-stopped" unique="0" required="0">
> >>>>>> <getopt mixed="-U, --unknown-are-stopped" />
> >>>>>> <content type="string" default="false" />
> >>>>>> <shortdesc lang="en">DANGER: Assume any unknown instance is safely stopped</shortdesc>
> >>>>>> </parameter>
> >>>>>> </parameters>
> >>>>>> <actions>
> >>>>>> <action name="on" />
> >>>>>> <action name="off" />
> >>>>>> <action name="reboot" />
> >>>>>> <action name="status" />
> >>>>>> <action name="list" />
> >>>>>> <action name="monitor" />
> >>>>>> <action name="metadata" />
> >>>>>> </actions>
> >>>>>></resource-agent>
> >>>>>>EOF
> >>>>>> exit 0;
> >>>>>>}
> >>>>>>
> >>>>>>function instance_for_port()
> >>>>>>{
> >>>>>> local port=$1
> >>>>>> local instance=""
> >>>>>>
> >>>>>> # Look for port name -n in the INSTANCE data
> >>>>>> instance=`aws ec2 describe-instances $options | grep "^INSTANCES[[:space:]].*[[:space:]]$port[[:space:]]" | awk
> >>>>'{print $8}'`
> >>>>>> if [ -z $instance ]; then
> >>>>>> # Look for port name -n in the Name TAG
> >>>>>> instance=`aws ec2 describe-tags $options | grep
> >>>>"^TAGS[[:space:]]$ec2_tag[[:space:]].*[[:space:]]instance[[:space:]]$port$" | awk '{print $3}'`
> >>>>>> fi
> >>>>>>
> >>>>>> if [ -z $instance ]; then
> >>>>>> instance_not_found=1
> >>>>>> instance=$port
> >>>>>> fi
> >>>>>>
> >>>>>> echo $instance
> >>>>>>}
> >>>>>>
> >>>>>>function instance_on()
> >>>>>>{
> >>>>>> aws ec2 start-instances $options --instance-ids $instance
> >>>>>>}
> >>>>>>
> >>>>>>function instance_off()
> >>>>>>{
> >>>>>> if [ $unknown_are_stopped = 1 -a $instance_not_found ]; then
> >>>>>> : nothing to do
> >>>>>> ha_log.sh info "Assuming unknown instance $instance is already off"
> >>>>>> else
> >>>>>> aws ec2 stop-instances $options --instance-ids $instance --force
> >>>>>> fi
> >>>>>>}
> >>>>>>
> >>>>>>function instance_status()
> >>>>>>{
> >>>>>> local instance=$1
> >>>>>> local status="unknown"
> >>>>>> local rc=1
> >>>>>>
> >>>>>> # List of instances and their current status
> >>>>>> if [ $unknown_are_stopped = 1 -a $instance_not_found ]; then
> >>>>>> ha_log.sh info "$instance stopped (unknown)"
> >>>>>> else
> >>>>>> status=`aws ec2 describe-instance
> >>>>s $options --instance-ids $instance | awk '{
> >>>>>> if (/^STATE¥t/) { printf "%s", $3 }
> >>>>>> }'`
> >>>>>> rc=$?
> >>>>>> fi
> >>>>>> ha_log.sh info "status check for $instance is $status"
> >>>>>> echo $status
> >>>>>> return $rc
> >>>>>>}
> >>>>>>
> >>>>>>
> >>>>>>TEMP=`getopt -o qVho:e:p:n:t:U --long version,help,action:,port:,option:,profile:,tag:,quiet,unknown-are-stopped ¥
> >>>>>> -n 'fence_ec2' -- "$@"`
> >>>>>>
> >>>>>>if [ $? != 0 ];then
> >>>>>> usage
> >>>>>> exit 1
> >>>>>>fi
> >>>>>>
> >>>>>># Note the quotes around `$TEMP': they are essential!
> >>>>>>eval set -- "$TEMP"
> >>>>>>
> >>>>>>if [ -z $1 ]; then
> >>>>>> # If there are no command line args, look for options from stdin
> >>>>>> while read line; do
> >>>>>> case $line in
> >>>>>> option=*|action=*) action=`echo $line | sed s/.*=//`;;
> >>>>>> port=*) port=`echo $line | sed s/.*=//`;;
> >>>>>> profile=*) ec2_profile=`echo $line | sed s/.*=//`;;
> >>>>>> tag=*) ec2_tag=`echo $line | sed s/.*=//`;;
> >>>>>> quiet*) quiet=1;;
> >>>>>> unknown-are-stopped*) unknown_are_stopped=1;;
> >>>>>> --);;
> >>>>>> *) ha_log.sh err "Invalid command: $line";;
> >>>>>> esac
> >>>>>> done
> >>>>>>fi
> >>>>>>
> >>>>>>while true ; do
> >>>>>> case "$1" in
> >>>>>> -o|--action|--option) action=$2; shift; shift;;
> >>>>>> -n|--port) port=$2; shift; shift;;
> >>>>>> -p|--profile) ec2_profile=$2; shift; shift;;
> >>>>>> -t|--tag) ec2_tag=$2; shift; shift;;
> >>>>>> -U|--unknown-are-stopped) unknown_are_stopped=1; shift;;
> >>>>>> -q|--quiet) quiet=1; shift;;
> >>>>>> -V|--version) echo "1.0.0"; exit 0;;
> >>>>>> --help|-h)
> >>>>>> usage;
> >>>>>> exit 0;;
> >>>>>> --) shift ; break ;;
> >>>>>> *) ha_log.sh err "Unknown option: $1. See --help for details."; exit 1;;
> >>>>>> esac
> >>>>>>done
> >>>>>>
> >>>>>>[ -n "$1" ] && action=$1
> >>>>>>
> >>>>>>if [ -z "$ec2_profile"]; then
> >>>>>> options="--output text --profile default"
> >>>>>>else
> >>>>>> options="--output text --profile $ec2_profile "
> >>>>>>fi
> >>>>>>
> >>>>>>action=`echo $action | tr 'A-Z' 'a-z'`
> >>>>>>
> >>>>>>case $action in
> >>>>>> metadata)
> >>>>>> metadata
> >>>>>> ;;
> >>>>>> getinfo-xml)
> >>>>>> getinfo-xml
> >>>>>> ;;
> >>>>>> getconfignames)
> >>>>>> for i in profile port tag
> >>>>>> do
> >>>>>> echo $i
> >>>>>> done
> >>>>>> exit 0
> >>>>>> ;;
> >>>>>> getinfo-devid)
> >>>>>> echo "EC2 STONITH device"
> >>>>>> exit 0
> >>>>>> ;;
> >>>>>> getinfo-devname)
> >>>>>> echo "EC2 STONITH external device"
> >>>>>> exit 0
> >>>>>> ;;
> >>>>>> getinfo-devdescr)
> >>>>>> echo "fence_ec2 is an I/O Fencing agent which can be used with Amazon EC2 instances."
> >>>>>> exit 0
> >>>>>> ;;
> >>>>>> getinfo-devurl)
> >>>>>> echo ""
> >>>>>> exit 0
> >>>>>> ;;
> >>>>>>esac
> >>>>>>
> >>>>>># get my instance id
> >>>>>>myinstance=`curl http://169.254.169.254/latest/meta-data/instance-id`
> >>>>>>
> >>>>>># check my status.
> >>>>>># When the EC2 instance be stopped by the "aws ec2 stop-instances" , the stop processing of the OS is executed.
> >>>>>># While the OS stop processing, Pacemaker can execute the STONITH processing.
> >>>>>># So, If my status is not "running", it determined that I was already fenced. And to prevent fencing each other
> >>>>>># in split-brain, I don't fence other node.
> >>>>>>if [ -z "$myinstance" ]; then
> >>>>>> ha_log.sh err "Failed to get My Instance ID. so can not check my status."
> >>>>>> exit 1
> >>>>>>fi
> >>>>>>mystatus=`instance_status $myinstance`
> >>>>>>if [ "$mystatus" != "running" ]; then #do not fence
> >>>>>> ha_log.sh warn "I was already fenced (My instance status=$mystatus). I don't fence other node."
> >>>>>> exit 1
> >>>>>>fi
> >>>>>>
> >>>>>># get target's instance id
> >>>>>>instance=""
> >>>>>>if [ ! -z "$port" ]; then
> >>>>>> instance=`instance_for_port $port $options`
> >>>>>>fi
> >>>>>>
> >>>>>>case $action in
> >>>>>> reboot|reset)
> >>>>>> status=`instance_status $instance`
> >>>>>> if [ "$status" != "stopped" ]; then
> >>>>>> instance_off
> >>>>>> fi
> >>>>>> while true;
> >>>>>> do
> >>>>>> status=`instance_status $instance`
> >>>>>> if [ "$status" = "stopped" ]; then
> >>>>>> break
> >>>>>> fi
> >>>>>> sleep $sleep_time
> >>>>>> done
> >>>>>> instance_on
> >>>>>> while true;
> >>>>>> do
> >>>>>> status=`instance_status $instance`
> >>>>>> if [ "$status" = "running" ]; then
> >>>>>> break
> >>>>>> fi
> >>>>>> sleep $sleep_time
> >>>>>> done
> >>>>>> ;;
> >>>>>> poweron|on)
> >>>>>> instance_on
> >>>>>> while true;
> >>>>>> do
> >>>>>> status=`instance_status $instance`
> >>>>>> if [ "$
> >>>>status" = "running" ]; then
> >>>>>> break
> >>>>>> fi
> >>>>>> done
> >>>>>> ;;
> >>>>>> poweroff|off)
> >>>>>> instance_off
> >>>>>> while true;
> >>>>>> do
> >>>>>> status=`instance_status $instance`
> >>>>>> if [ "$status" = "stopped" ]; then
> >>>>>> break
> >>>>>> fi
> >>>>>> sleep $sleep_time
> >>>>>> done
> >>>>>> ;;
> >>>>>> monitor)
> >>>>>> # Is the device ok?
> >>>>>> aws ec2 describe-instances $options | grep INSTANCES &> /dev/null
> >>>>>> ;;
> >>>>>> gethosts|hostlist|list)
> >>>>>> # List of names we know about
> >>>>>> a=`aws ec2 describe-instances $options | awk -v tag_pat="^TAGS¥t$ec2_tag¥t" -F '¥t' '{
> >>>>>> if (/^INSTANCES/) { printf "%s¥n", $8 }
> >>>>>> else if ( $1"¥t"$2"¥t" ‾ tag_pat ) { printf "%s¥n", $3 }
> >>>>>> }' | sort -u`
> >>>>>> echo $a
> >>>>>> ;;
> >>>>>> stat|status)
> >>>>>> instance_status $instance > /dev/null
> >>>>>> ;;
> >>>>>> *) ha_log.sh err "Unknown action: $action"; exit 1;;
> >>>>>>esac
> >>>>>>
> >>>>>>status=$?
> >>>>>>
> >>>>>>if [ $quiet -eq 1 ]; then
> >>>>>> : nothing
> >>>>>>elif [ $status -eq 0 ]; then
> >>>>>> ha_log.sh info "Operation $action passed"
> >>>>>>else
> >>>>>> ha_log.sh err "Operation $action failed: $status"
> >>>>>>fi
> >>>>>>exit $status
> >>>>>
> >>>>>>_______________________________________________
> >>>>>>Linux-HA mailing list
> >>>>>>Linux-HA at lists.linux-ha.org
> >>>>>>http://lists.linux-ha.org/mailman/listinfo/linux-ha
> >>>>>>See also: http://linux-ha.org/ReportingProblems
> >>>>>
> >>>>>_______________________________________________
> >>>>>Linux-HA mailing list
> >>>>>Linux-HA at lists.linux-ha.org
> >>>>>http://lists.linux-ha.org/mailman/listinfo/linux-ha
> >>>>>See also: http://linux-ha.org/ReportingProblems
> >>>>>
> >>>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>_______________________________________________
> >>>>Users mailing list: Users at clusterlabs.org
> >>>>http://clusterlabs.org/mailman/listinfo/users
> >>>>
> >>>>Project Home: http://www.clusterlabs.org
> >>>>Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
> >>>>Bugs: http://bugs.clusterlabs.org
> >>>>
> >>>
> >>>
> >>
> >>
> >
> >>#!/bin/bash
> >>
> >>description="
> >>fence_ec2 is an I/O Fencing agent which can be used with Amazon EC2 instances.
> >>
> >>API functions used by this agent:
> >>- aws ec2 describe-tags
> >>- aws ec2 describe-instances
> >>- aws ec2 stop-instances
> >>- aws ec2 start-instances
> >>- aws ec2 reboot-instances
> >>
> >>If the uname used by the cluster node is any of:
> >> - Public DNS name (or part there of),
> >> - Private DNS name (or part there of),
> >> - Instance ID (eg. i-4f15a839)
> >> - Contents of tag associated with the instance
> >>then the agent should be able to automatically discover the instances it can control.
> >>
> >>If the tag containing the uname is not [Name], then it will need to be specified using the [tag] option.
> >>"
> >>
> >>#
> >># Copyright (c) 2011-2013 Andrew Beekhof
> >># Copyright (c) 2014 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
> >># 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.
> >>#
> >>#######################################################################
> >>
> >>quiet=0
> >>
> >>instance_not_found=0
> >>unknown_are_stopped=0
> >>
> >>action_default="reset" # Default fence action
> >>ec2_tag_default="Name" # EC2 Tag containing the instance's uname
> >>
> >>sleep_time="1"
> >>
> >>[ -n "$tag" ] && ec2_tag="$tag"
> >>
> >>: ${ec2_tag=${ec2_tag_default}}
> >>
> >>function usage()
> >>{
> >>cat <<EOF
> >>`basename $0` - A fencing agent for Amazon EC2 instances
> >>
> >>$description
> >>
> >>Usage: `basename $0` -o|--action [-n|--port] [options]
> >>Options:
> >> -h, --help This text
> >> -V, --version Version information
> >> -q, --quiet Reduced output mode
> >>
> >>Commands:
> >> -o, --action Action to perform: on|off|reboot|status|monitor
> >> -n, --port The name of a machine/instance to control/check
> >>
> >>Additional Options:
> >> -p, --profile Use a specific profile from your credential file.
> >> -t, --tag Name of the tag containing the instance's uname
> >>
> >>Dangerous options:
> >> -U, --unknown-are-stopped Assume any unknown instance is safely stopped
> >>
> >>EOF
> >> exit 0;
> >>}
> >>
> >>function getinfo_xml()
> >>{
> >> cat <<EOF
> >><parameters>
> >> <parameter name="port" unique="1" required="0">
> >> <content type="string" />
> >> <shortdesc lang="en">The name/id/tag of a instance to control/check</shortdesc>
> >> </parameter>
> >> <parameter name="profile" unique="0" required="0">
> >> <content type="string" default="default" />
> >> <shortdesc lang="en">Use a specific profile from your credential file.</shortdesc>
> >> </parameter>
> >> <parameter name="tag" unique="0" required="0">
> >> <content type="string" default="Name" />
> >> <shortdesc lang="en">Name of the tag containing the instances uname</shortdesc>
> >> </parameter>
> >> <parameter name="unknown_are_stopped" unique="0" required="0">
> >> <content type="string" default="false" />
> >> <shortdesc lang="en">DANGER: Assume any unknown instance is safely stopped</shortdesc>
> >> </parameter>
> >></parameters>
> >>EOF
> >> exit 0;
> >>}
> >>
> >>function metadata()
> >>{
> >> cat <<EOF
> >><?xml version="1.0" ?>
> >><resource-agent name="fence_ec2" shortdesc="Fencing agent for Amazon EC2 instances" >
> >> <longdesc>
> >>$description
> >> </longdesc>
> >> <parameters>
> >> <parameter name="action" unique="0" required="1">
> >> <getopt mixed="-o, --action=[action]" />
> >> <content type="string" default="reboot" />
> >> <shortdesc lang="en">Fencing Action</shortdesc>
> >> </parameter>
> >> <parameter name="port" unique="1" required="0">
> >> <getopt mixed="-n, --port=[port]" />
> >> <content type="string" />
> >> <shortdesc lang="en">The name/id/tag of a instance to control/check</shortdesc>
> >> </parameter>
> >> <parameter name="profile" unique="0" required="0">
> >> <getopt mixed="-p, --profile=[profile]" />
> >> <content type="string" default="default" />
> >> <shortdesc lang="en">Use a specific profile from your credential file.</shortdesc>
> >> </parameter>
> >> <parameter name="tag" unique="0" required="0">
> >> <getopt mixed="-t, --tag=[tag]" />
> >> <content type="string" default="Name" />
> >> <shortdesc lang="en">Name of the tag containing the instances uname</shortdesc>
> >> </parameter>
> >> <parameter name="unknown-are-stopped" unique="0" required="0">
> >> <getopt mixed="-U, --unknown-are-stopped" />
> >> <content type="string" default="false" />
> >> <shortdesc lang="en">DANGER: Assume any unknown instance is safely stopped</shortdesc>
> >> </parameter>
> >> </parameters>
> >> <actions>
> >> <action name="on" />
> >> <action name="off" />
> >> <action name="reboot" />
> >> <action name="status" />
> >> <action name="list" />
> >> <action name="monitor" />
> >> <action name="metadata" />
> >> </actions>
> >></resource-agent>
> >>EOF
> >> exit 0;
> >>}
> >>
> >>function instance_for_port()
> >>{
> >> local port=$1
> >> local instance=""
> >>
> >> # Look for port name -n in the INSTANCE data
> >> instance=`aws ec2 describe-instances $options | grep "^INSTANCES[[:space:]].*[[:space:]]$port[[:space:]]" | awk '{print $8}'`
> >> if [ -z $instance ]; then
> >> # Look for port name -n in the Name TAG
> >> instance=`aws ec2 describe-tags $options | grep "^TAGS[[:space:]]$ec2_tag[[:space:]].*[[:space:]]instance[[:space:]]$port$" | awk '{print $3}'`
> >> fi
> >>
> >> if [ -z $instance ]; then
> >> instance_not_found=1
> >> instance=$port
> >> fi
> >>
> >> echo $instance
> >>}
> >>
> >>function instance_on()
> >>{
> >> aws ec2 start-instances $options --instance-ids $instance
> >>}
> >>
> >>function instance_off()
> >>{
> >> if [ "$unknown_are_stopped" = 1 -a $instance_not_found ]; then
> >> : nothing to do
> >> ha_log.sh info "Assuming unknown instance $instance is already off"
> >> else
> >> aws ec2 stop-instances $options --instance-ids $instance --force
> >> fi
> >>}
> >>
> >>function instance_status()
> >>{
> >> local instance=$1
> >> local status="unknown"
> >> local rc=1
> >>
> >> # List of instances and their current status
> >> if [ "$unknown_are_stopped" = 1 -a $instance_not_found ]; then
> >> ha_log.sh info "$instance stopped (unknown)"
> >> else
> >> status=`aws ec2 describe-instances $options --instance-ids $instance | awk '{
> >> if (/^STATE¥t/) { printf "%s", $3 }
> >> }'`
> >> rc=$?
> >> fi
> >> ha_log.sh info "status check for $instance is $status"
> >> echo $status
> >> return $rc
> >>}
> >>
> >>function monitor()
> >>{
> >> # Is the device ok?
> >> aws ec2 describe-instances $options | grep INSTANCES &> /dev/null
> >>}
> >>
> >>TEMP=`getopt -o qVho:e:p:n:t:U --long version,help,action:,port:,option:,profile:,tag:,quiet,unknown-are-stopped ¥
> >> -n 'fence_ec2' -- "$@"`
> >>
> >>if [ $? != 0 ];then
> >> usage
> >> exit 1
> >>fi
> >>
> >># Note the quotes around `$TEMP': they are essential!
> >>eval set -- "$TEMP"
> >>
> >>if [ -z $1 ]; then
> >> # If there are no command line args, look for options from stdin
> >> while read line; do
> >> case $line in
> >> option=*|action=*) action=`echo $line | sed s/.*=//`;;
> >> port=*) port=`echo $line | sed s/.*=//`;;
> >> profile=*) ec2_profile=`echo $line | sed s/.*=//`;;
> >> tag=*) ec2_tag=`echo $line | sed s/.*=//`;;
> >> quiet*) quiet=1;;
> >> unknown-are-stopped*) unknown_are_stopped=1;;
> >> --);;
> >> *) ha_log.sh err "Invalid command: $line";;
> >> esac
> >> done
> >>fi
> >>
> >>while true ; do
> >> case "$1" in
> >> -o|--action|--option) action=$2; shift; shift;;
> >> -n|--port) port=$2; shift; shift;;
> >> -p|--profile) ec2_profile=$2; shift; shift;;
> >> -t|--tag) ec2_tag=$2; shift; shift;;
> >> -U|--unknown-are-stopped) unknown_are_stopped=1; shift;;
> >> -q|--quiet) quiet=1; shift;;
> >> -V|--version) echo "1.0.0"; exit 0;;
> >> --help|-h)
> >> usage;
> >> exit 0;;
> >> --) shift ; break ;;
> >> *) ha_log.sh err "Unknown option: $1. See --help for details."; exit 1;;
> >> esac
> >>done
> >>
> >>[ -n "$1" ] && action=$1
> >>[ -n "$2" ] && node_to_fence=$2
> >>
> >>if [ -z "$ec2_profile"]; then
> >> options="--output text --profile default"
> >>else
> >> options="--output text --profile $ec2_profile "
> >>fi
> >>
> >>action=`echo $action | tr 'A-Z' 'a-z'`
> >>
> >>case $action in
> >> metadata)
> >> metadata
> >> ;;
> >> getinfo-xml)
> >> getinfo_xml
> >> ;;
> >> getconfignames)
> >> for i in profile port tag unknown_are_stopped
> >> do
> >> echo $i
> >> done
> >> exit 0
> >> ;;
> >> getinfo-devid)
> >> echo "EC2 STONITH device"
> >> exit 0
> >> ;;
> >> getinfo-devname)
> >> echo "EC2 STONITH external device"
> >> exit 0
> >> ;;
> >> getinfo-devdescr)
> >> echo "ec2 is an I/O Fencing agent which can be used with Amazon EC2 instances."
> >> exit 0
> >> ;;
> >> getinfo-devurl)
> >> echo ""
> >> exit 0
> >> ;;
> >>esac
> >>
> >># get my instance id
> >>myinstance=`curl http://169.254.169.254/latest/meta-data/instance-id`
> >>
> >># check my status.
> >># When the EC2 instance be stopped by the "aws ec2 stop-instances" , the stop processing of the OS is executed.
> >># While the OS stop processing, Pacemaker can execute the STONITH processing.
> >># So, If my status is not "running", it determined that I was already fenced. And to prevent fencing each other
> >># in split-brain, I don't fence other node.
> >>if [ -z "$myinstance" ]; then
> >> ha_log.sh err "Failed to get My Instance ID. so can not check my status."
> >> exit 1
> >>fi
> >>mystatus=`instance_status $myinstance`
> >>if [ "$mystatus" != "running" ]; then #do not fence
> >> ha_log.sh warn "I was already fenced (My instance status=$mystatus). I don't fence other node."
> >> exit 1
> >>fi
> >>
> >>if [ -z "$port" ]; then
> >> port="$node_to_fence"
> >>fi
> >>
> >># get target's instance id
> >>instance=""
> >>if [ ! -z "$port" ]; then
> >> instance=`instance_for_port $port $options`
> >>fi
> >>
> >>case $action in
> >> reboot|reset)
> >> status=`instance_status $instance`
> >> if [ "$status" != "stopped" ]; then
> >> instance_off
> >> fi
> >> while true;
> >> do
> >> status=`instance_status $instance`
> >> if [ "$status" = "stopped" ]; then
> >> break
> >> fi
> >> sleep $sleep_time
> >> done
> >> instance_on
> >> while true;
> >> do
> >> status=`instance_status $instance`
> >> if [ "$status" = "running" ]; then
> >> break
> >> fi
> >> sleep $sleep_time
> >> done
> >> ;;
> >> poweron|on)
> >> instance_on
> >> while true;
> >> do
> >> status=`instance_status $instance`
> >> if [ "$status" = "running" ]; then
> >> break
> >> fi
> >> done
> >> ;;
> >> poweroff|off)
> >> instance_off
> >> while true;
> >> do
> >> status=`instance_status $instance`
> >> if [ "$status" = "stopped" ]; then
> >> break
> >> fi
> >> sleep $sleep_time
> >> done
> >> ;;
> >> monitor)
> >> monitor
> >> ;;
> >> gethosts|hostlist|list)
> >> # List of names we know about
> >> a=`aws ec2 describe-instances $options | awk -v tag_pat="^TAGS¥t$ec2_tag¥t" -F '¥t' '{
> >> if (/^INSTANCES/) { printf "%s¥n", $8 }
> >> else if ( $1"¥t"$2"¥t" ‾ tag_pat ) { printf "%s¥n", $3 }
> >> }' | sort -u`
> >> echo $a
> >> ;;
> >> stat|status)
> >> monitor
> >> ;;
> >> *) ha_log.sh err "Unknown action: $action"; exit 1;;
> >>esac
> >>
> >>status=$?
> >>
> >>if [ $quiet -eq 1 ]; then
> >> : nothing
> >>elif [ $status -eq 0 ]; then
> >> ha_log.sh info "Operation $action passed"
> >>else
> >> ha_log.sh err "Operation $action failed: $status"
> >>fi
> >>exit $status
> >
> >>_______________________________________________
> >>Users mailing list: Users at clusterlabs.org
> >>http://clusterlabs.org/mailman/listinfo/users
> >>
> >>Project Home: http://www.clusterlabs.org
> >>Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
> >>Bugs: http://bugs.clusterlabs.org
> >
> >
> >
>
>
> --
> ----------------------------------------------------
> 東 一彦
> NTT OSSセンタ 基盤技術ユニット 高信頼担当
> (SV総研 ソフトウェアイノベーションセンタ OSS推進PJ)
> Mail:higashi.kazuhiko at lab.ntt.co.jp
> Tel :03-5860-5135 (直通:5111)
> 〒108-8019 東京都港区港南1-9-1 NTT品川TWINSビル11階
>
> ★OSSセンタポータルサイトをぜひご覧ください★
> ・NTT東日本、NTT西日本、NTTコミュニケーションズの方
> https://www.oss-sc.ecl.ipxp/
> ・上記以外の方
> https://www.oss-sc.ecl.ntt.co.jp/
> ----------------------------------------------------
> # HG changeset patch
> # User Kazuhiko Higashi <kazuh at goo.jp>
> # Date 1443417289 -32400
> # Node ID 70c1608dd39535465b9f04147081436bcc59f611
> # Parent 9da0680bc9c0b99eba65b40aac9282a8dd28889a
> Dev: stonith: external/ec2: Be able to omit the "port" option.
>
> It changed the following points.
>
> - the "tag" and the "port" options will be "not" required.
>
> - if the "port" option is not set, the 2nd argument of ec2 will use as the "port".
> - the 2nd argument of ec2 is "node to fence".
>
> - the "stat" and "status" action will be same the "monitor" action.
> (for do not use the "port" parameter in "stat" action.)
>
> By this modifications, If it is described uname in the Name tag,
> the setting of the "tag" and "port" parameters are no longer necessary.
>
> diff -r 9da0680bc9c0 -r 70c1608dd395 lib/plugins/stonith/external/ec2
> --- a/lib/plugins/stonith/external/ec2 Wed Mar 11 13:24:25 2015 +0100
> +++ b/lib/plugins/stonith/external/ec2 Mon Sep 28 14:14:49 2015 +0900
> @@ -47,7 +47,6 @@
> #######################################################################
>
> quiet=0
> -port_default=""
>
> instance_not_found=0
> unknown_are_stopped=0
> @@ -57,10 +56,9 @@
>
> sleep_time="1"
>
> -ec2_tag=${tag}
> +[ -n "$tag" ] && ec2_tag="$tag"
>
> : ${ec2_tag=${ec2_tag_default}}
> -: ${port=${port_default}}
>
> function usage()
> {
> @@ -94,7 +92,7 @@
> {
> cat <<EOF
> <parameters>
> - <parameter name="port" unique="1" required="1">
> + <parameter name="port" unique="1" required="0">
> <content type="string" />
> <shortdesc lang="en">The name/id/tag of a instance to control/check</shortdesc>
> </parameter>
> @@ -102,7 +100,7 @@
> <content type="string" default="default" />
> <shortdesc lang="en">Use a specific profile from your credential file.</shortdesc>
> </parameter>
> - <parameter name="tag" unique="0" required="1">
> + <parameter name="tag" unique="0" required="0">
> <content type="string" default="Name" />
> <shortdesc lang="en">Name of the tag containing the instances uname</shortdesc>
> </parameter>
> @@ -129,7 +127,7 @@
> <content type="string" default="reboot" />
> <shortdesc lang="en">Fencing Action</shortdesc>
> </parameter>
> - <parameter name="port" unique="1" required="1">
> + <parameter name="port" unique="1" required="0">
> <getopt mixed="-n, --port=[port]" />
> <content type="string" />
> <shortdesc lang="en">The name/id/tag of a instance to control/check</shortdesc>
> @@ -139,7 +137,7 @@
> <content type="string" default="default" />
> <shortdesc lang="en">Use a specific profile from your credential file.</shortdesc>
> </parameter>
> - <parameter name="tag" unique="0" required="1">
> + <parameter name="tag" unique="0" required="0">
> <getopt mixed="-t, --tag=[tag]" />
> <content type="string" default="Name" />
> <shortdesc lang="en">Name of the tag containing the instances uname</shortdesc>
> @@ -219,6 +217,11 @@
> return $rc
> }
>
> +function monitor()
> +{
> + # Is the device ok?
> + aws ec2 describe-instances $options | grep INSTANCES &> /dev/null
> +}
>
> TEMP=`getopt -o qVho:e:p:n:t:U --long version,help,action:,port:,option:,profile:,tag:,quiet,unknown-are-stopped ¥
> -n 'fence_ec2' -- "$@"`
> @@ -265,6 +268,7 @@
> done
>
> [ -n "$1" ] && action=$1
> +[ -n "$2" ] && node_to_fence=$2
>
> if [ -z "$ec2_profile"]; then
> options="--output text --profile default"
> @@ -324,6 +328,10 @@
> exit 1
> fi
>
> +if [ -z "$port" ]; then
> + port="$node_to_fence"
> +fi
> +
> # get target's instance id
> instance=""
> if [ ! -z "$port" ]; then
> @@ -376,8 +384,7 @@
> done
> ;;
> monitor)
> - # Is the device ok?
> - aws ec2 describe-instances $options | grep INSTANCES &> /dev/null
> + monitor
> ;;
> gethosts|hostlist|list)
> # List of names we know about
> @@ -388,7 +395,7 @@
> echo $a
> ;;
> stat|status)
> - instance_status $instance > /dev/null
> + monitor
> ;;
> *) ha_log.sh err "Unknown action: $action"; exit 1;;
> esac
More information about the Users
mailing list