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@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-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 > } > > > 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@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@lists.linux-ha.org http://lists.linux-ha.org/mailman/listinfo/linux-ha See also: http://linux-ha.org/ReportingProblems