Hello, find attached, a vsphere (works with esx-server 3/4 virual center 2.X and 4) stonith plugin, a squid3 resource agent for debian lenny and a example configuration.
Thomas
use_logd yes bcast eth0 node ha-01 ha-02 watchdog /dev/watchdog crm on
#!/bin/sh
if [ -z "${OCF_ROOT}" ]; then
export OCF_ROOT=/usr/lib/ocf/
fi
. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
SQUID_PORT=3128
INIT_SCRIPT=/etc/init.d/squid3
PID=/var/run/squid3.pid
CHECK_URLS="http://www.google.de/ http://www.glanzmann.de/
http://www.uni-erlangen.de"
case "$1" in
start)
if [ -f "${PID}" ]; then
kill -0 `cat ${PID}` &> /dev/null && exit 0;
else
rm -f "${PID}"
fi
${INIT_SCRIPT} start > /dev/null 2>&1 && exit || exit 1
;;
stop)
if [ -f "${PID}" ]; then
${INIT_SCRIPT} stop > /dev/null 2>&1 && exit || exit 1
fi
exit 0;
;;
status)
if [ -f "${PID}" ]; then
kill -0 `cat ${PID}` && exit;
fi
exit 1;
;;
monitor)
if [ -f "${PID}" ]; then
kill -0 `cat ${PID}` || exit 7
else
exit 7;
fi
for URL in ${CHECK_URLS}; do
http_proxy=http://localhost:${SQUID_PORT}/ wget -o
/dev/null -O /dev/null -T 1 -t 1 ${URL} && exit
done
exit 1;
;;
meta-data)
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="squid">
<version>1.0</version>
<longdesc lang="en">
OCF Ressource Agent on top of squid init script shipped with debian.
</longdesc>
<shortdesc lang="en">OCF Ressource Agent on top of squid init script
shipped with debian.</shortdesc>
<actions>
<action name="start" timeout="90" />
<action name="stop" timeout="100" />
<action name="status" timeout="60" />
<action name="monitor" depth="0" timeout="30s" interval="10s" start-delay="10s"
/>
<action name="meta-data" timeout="5s" />
<action name="validate-all" timeout="20s" />
</actions>
</resource-agent>
END
;;
esac
#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
# Thomas Glanzmann 10:28 09-08-19
# apt-get install libarchive-zip-perl libclass-methodmaker-perl
libcompress-raw-zlib-perl libcompress-zlib-perl libcompress-zlib-perl
libdata-dump-perl libio-compress-base-perl libio-compress-zlib-perl
libsoap-lite-perl liburi-perl libuuid-perl libxml-libxml-perl
libxml-libxml-common-perl libxml-namespacesupport-perl libwww-perl
# tar xfz ~/VMware-vSphere-SDK-for-Perl-4.0.0-161974.i386.tar.gz
# answer all questins with no
use lib '/usr/lib/vmware-vcli/apps/';
use VMware::VIRuntime;
use AppUtil::VMUtil;
sub
connect
{
Opts::parse();
Opts::validate();
Util::connect();
}
my $vm_views = undef;
sub poweron_vm {
foreach (@$vm_views) {
my $mor_host = $_->runtime->host;
my $hostname = Vim::get_view(mo_ref => $mor_host)->name;
eval {
$_->PowerOnVM();
Util::trace(0, "\nvirtual machine '" . $_->name .
"' under host $hostname powered on \n");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
Util::trace (0, "\nError in '" . $_->name . "'
under host $hostname: ");
if (ref($...@->detail) eq 'NotSupported') {
Util::trace(0,"Virtual machine is
marked as a template ");
} elsif (ref($...@->detail) eq
'InvalidPowerState') {
Util::trace(0, "The attempted
operation".
" cannot be performed
in the current state" );
} elsif (ref($...@->detail) eq 'InvalidState') {
Util::trace(0,"Current State of the "
." virtual machine is
not supported for this operation");
} else {
Util::trace(0, "VM '" .$_->name.
"' can't be powered on
\n" . $@ . "" );
}
} else {
Util::trace(0, "VM '" .$_->name.
"' can't be powered on \n" . $@
. "" );
}
Util::disconnect();
exit 1;
}
}
}
sub poweroff_vm {
foreach (@$vm_views) {
my $mor_host = $_->runtime->host;
my $hostname = Vim::get_view(mo_ref => $mor_host)->name;
eval {
$_->PowerOffVM();
Util::trace (0, "\nvirtual machine '" . $_->name .
"' under host $hostname powered off ");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
Util::trace (0, "\nError in '" . $_->name . "'
under host $hostname: ");
if (ref($...@->detail) eq 'InvalidPowerState') {
Util::trace(0, "The attempted
operation".
" cannot be performed
in the current state" );
} elsif (ref($...@->detail) eq 'InvalidState') {
Util::trace(0,"Current State of the".
" virtual machine is
not supported for this operation");
} elsif(ref($...@->detail) eq 'NotSupported') {
Util::trace(0,"Virtual machine is
marked as template");
} else {
Util::trace(0, "VM '" .$_->name. "'
can't be powered off \n"
. $@ . "" );
}
} else {
Util::trace(0, "VM '" .$_->name. "' can't be
powered off \n" . $@ . "" );
}
Util::disconnect();
exit 1;
}
}
}
sub reset_vm {
foreach (@$vm_views) {
my $mor_host = $_->runtime->host;
my $hostname = Vim::get_view(mo_ref => $mor_host)->name;
eval {
$_->ResetVM();
Util::trace(0, "\nvirtual machine '" . $_->name . "'
under host".
" $hostname reset successfully ");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
Util::trace (0, "\nError in '" . $_->name . "'
under host $hostname: ");
if (ref($...@->detail) eq 'InvalidState') {
Util::trace(0,"Host is in maintenance
mode");
} elsif (ref($...@->detail) eq
'InvalidPowerState') {
Util::trace(0, "The attempted
operation".
" cannot be performed
in the current state" );
} elsif (ref($...@->detail) eq 'NotSupported') {
Util::trace(0,"Virtual machine is
marked as a template ");
} else {
Util::trace(0, "VM '" .$_->name. "'
can't be reset \n" . $@ . "");
}
} else {
Util::trace(0, "VM '" .$_->name. "' can't be
reset \n" . $@ . "");
}
Util::disconnect();
exit 1;
}
}
}
if ($ARGV[0] eq 'gethosts') {
&connect;
$vm_views = VMUtils::get_vms ('VirtualMachine', $ENV{'vm'});
foreach (@$vm_views) {
print $_->{name} . "\n";
}
Util::disconnect();
} elsif ($ARGV[0] eq 'on') {
&connect;
$vm_views = VMUtils::get_vms ('VirtualMachine', $ENV{'vm'});
poweron_vm;
Util::disconnect();
} elsif ($ARGV[0] eq 'off') {
&connect;
$vm_views = VMUtils::get_vms ('VirtualMachine', $ENV{'vm'});
poweroff_vm;
Util::disconnect();
} elsif ($ARGV[0] eq 'reset') {
&connect;
$vm_views = VMUtils::get_vms ('VirtualMachine', $ENV{'vm'});
reset_vm;
Util::disconnect();
} elsif ($ARGV[0] eq 'status') {
&connect;
Util::disconnect();
} elsif ($ARGV[0] eq 'getconfignames') {
print <<EOF;
vm
VI_SERVER
VI_USERNAME
VI_PASSWORD
EOF
} elsif ($ARGV[0] eq 'getinfo-devid') {
print "vSphere STONITH device\n";
} elsif ($ARGV[0] eq 'getinfo-devname') {
print "vSphere STONITH external device\n";
} elsif ($ARGV[0] eq 'getinfo-devdescr') {
print "vSphere-based host reset\n";
} elsif ($ARGV[0] eq 'getinfo-devurl') {
print "http://www.vmware.com/support/developer/viperltoolkit/\n"
} elsif ($ARGV[0] eq 'getinfo-xml') {
print <<IPMIXML
<parameters>
<parameter name="vm" unique="1">
<content type="string" />
<shortdesc lang="en">
vm to reset
</shortdesc>
<longdesc lang="en">
The name of the host to be managed by this STONITH device
</longdesc>
</parameter>
<parameter name="VI_SERVER" unique="1">
<content type="string" />
<shortdesc lang="en">
IP Address
</shortdesc>
<longdesc lang="en">
The IP address of the ESX server or vSphere Center
</longdesc>
</parameter>
<parameter name="VI_USERNAME" unique="1">
<content type="string" />
<shortdesc lang="en">
Login
</shortdesc>
<longdesc lang="en">
The username used for logging in to the ESX server or vSphere Center
</longdesc>
</parameter>
<parameter name="VI_PASSWORD" unique="1">
<content type="string" />
<shortdesc lang="en">
Password
</shortdesc>
<longdesc lang="en">
The password used for logging in to the ESX server or vSphere Center
</longdesc>
</parameter>
</parameters>
IPMIXML
} else {
exit 1
}
squid.xml
Description: XML document
_______________________________________________ Linux-HA mailing list [email protected] http://lists.linux-ha.org/mailman/listinfo/linux-ha See also: http://linux-ha.org/ReportingProblems
