Hi,
On Thu, Dec 18, 2008 at 11:48:46AM -0500, Jason Noble wrote:
> I had a customer who tried to use this script, but it didn't work. I
> made some modifications to the control script. Additionally, the
> customer wanted to start/stop multiple machines. The solution
> implemented makes the Resource Agent a simple script -- vmstart_all --
> that makes multiple calls to vmstart in order to start/stop the virtual
> machines.
Thanks for sharing the RA. BTW, what's wrong with having multiple
VM resources?
Thanks,
Dejan
> Here is vmstart_all:
>
> #!/bin/bash
> VMSTARTDIR="/etc/ha.d/resource.d"
> # Start up multiple virtual machines
> # enter one per line in the following format:
> # $VMSTARTDIR/vmstart $1 directoryname
> #
> # where directoryname is the name of the
> # directory that contains a .vmx file
> $VMSTARTDIR/vmstart $1 vm1
> $VMSTARTDIR/vmstart $1 vm2
>
> And here's the patch for vmstart:
> --- vmstart.20081114 2008-12-18 11:02:30.000000000 -0500
> +++ vmstart 2008-12-18 11:12:45.000000000 -0500
> @@ -31,79 +31,106 @@
> #################################################################
>
> # Source ocf shell functions
> -#. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
> -. /usr/lib64/heartbeat/ocf-shellfuncs
> -#. /etc/ha.d/shellfuncs
> +OCF_ROOT=/usr/lib/ocf
> +. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
> +#. /usr/lib64/heartbeat/ocf-shellfuncs
> +. /etc/ha.d/shellfuncs
> +
> # Basic variables configuration
> #################################################################
>
> # Path to the virtual machine configuration file
> -VMXPATH="$OCF_RESKEY_vmxpath"
> +#VMXPATH="$OCF_RESKEY_vmxpath"
> +VMXPATH="/mnt/vmware/$2"
>
> # Path to the vmware-vim-cmd executable
> -VIMSHBIN="$OCF_RESKEY_vimshbin"
> +#VIMSHBIN="$OCF_RESKEY_vimshbin"
> +VIMSHBIN="/usr/bin/vmware-vim-cmd"
> +
> +# Additional options to pass to vmware-vim-cmd executable
> +VIMSHBINOPTS="-H localhost -O 904"
> +
> +# Print usage summary
> +vmware_usage() {
> +cat <<EOF
> +usage: $0 VMDIR {start|stop|status|monitor|meta-data|validate-all}
> +
> +VMDIR A directory under $VMXPATH that contains a virtual machine.
> +EOF
> +}
> +
> +# Check for two parameters
> +if [ "$2" == "" ]; then
> + vmware_usage
> + exit 0
> +fi
> +
>
> # vmware-vim-cmd functions
> #################################################################
>
> # Get virtual machine vid
> vmware_get_vid() {
> -$VIMSHBIN vmsvc/getallvms 2>/dev/null | awk '/\/'"$1"'/ {print $1}'
> +$VIMSHBIN $VIMSHBINOPTS vmsvc/getallvms 2>/dev/null | awk '/\/'"$1"'/
> {print $1}'
> }
>
> # Is the vm waiting for input after a migration?
> vmware_uuid_alt() {
> -$VIMSHBIN vmsvc/message $1 2>/dev/null | awk /^msg.uuid.altered/
> +$VIMSHBIN $VIMSHBINOPTS vmsvc/message $1 2>/dev/null | awk
> /^msg.uuid.altered/
> }
>
> # Get message id
> vmware_get_msgid() {
> -$VIMSHBIN vmsvc/message $1 2>/dev/null | awk '/^Virtual machine
> message/ {print $4}' | awk -F : '{print $1}'
> +$VIMSHBIN $VIMSHBINOPTS vmsvc/message $1 2>/dev/null | awk '/^Virtual
> machine message/ {print $4}' | awk -F : '{print $1}'
> }
>
> # Answers message
> vmware_answer_msg() {
> -$VIMSHBIN vmsvc/message $1 $2 $3 &> /dev/null
> +$VIMSHBIN $VIMSHBINOPTS vmsvc/message $1 $3 $4 &> /dev/null
> }
>
> # Register a virtual machine
> vmware_register_vm() {
> -$VIMSHBIN solo/registervm '"'$1'"' &> /dev/null
> +$VIMSHBIN $VIMSHBINOPTS solo/registervm '"'$1'"' &> /dev/null
> }
>
> # Unregister a virtual machine
> vmware_unregister_vm() {
> -$VIMSHBIN vmsvc/unregister $1 &> /dev/null
> +$VIMSHBIN $VIMSHBINOPTS vmsvc/unregister $1 &> /dev/null
> }
>
> # Start a virtual machine
> vmware_poweron_vm() {
> -$VIMSHBIN vmsvc/power.on $1 &> /dev/null
> +$VIMSHBIN $VIMSHBINOPTS vmsvc/power.on $1 &> /dev/null
> }
>
> # Suspend a virtual machine
> vmware_suspend_vm() {
> -$VIMSHBIN vmsvc/power.suspend $1 &> /dev/null
> +$VIMSHBIN $VIMSHBINOPTS vmsvc/power.suspend $1 &> /dev/null
> }
>
> # Get virtual machine power state
> vmware_get_status() {
> -$VIMSHBIN vmsvc/power.getstate $1 2>/dev/null | awk '/^Powered on/ ||
> /^Powered off/ || /^Suspended/'
> +$VIMSHBIN $VIMSHBINOPTS vmsvc/power.getstate $1 2>/dev/null | awk
> '/^Powered on/ || /^Powered off/ || /^Suspended/'
> }
>
> # Get vid of missing virtual machines
> vmware_get_broken() {
> -$VIMSHBIN vmsvc/getallvm 2>&1 | awk -F "'" '/^Skipping/ {print $2}'
> +$VIMSHBIN $VIMSHBINOPTS vmsvc/getallvm 2>&1 | awk -F "'" '/^Skipping/
> {print $2}'
> }
>
> # Variables depending on the above functions
> #################################################################
>
> # Directory containing the virtual machine
> -VMXDIR="`dirname "$VMXPATH"`"
> +#VMXDIR="`dirname "$VMXPATH"`"
> +VMXDIR=$VMXPATH
>
> # Basename of the configuration file
> -RELVMXPATH="`basename "$VMXPATH"`"
> +#RELVMXPATH="`basename "$VMXPATH"`"
> +RELVMXPATH=`basename "$(ls -1 $VMXPATH/*.vmx 2>/dev/null| head -n1)"
> 2>/dev/null`
> +
> +VMXPATH=$VMXDIR/$RELVMXPATH
>
> # Vid of the virtual machine (can be empty if the vm is not registered)
> VMID=`vmware_get_vid "$RELVMXPATH"`
> @@ -120,15 +147,6 @@
> # Main functions
> #################################################################
>
> -# Print usage summary
> -vmware_usage() {
> -cat <<END
> -usage: $0 {start|stop|status|monitor|meta-data|validate-all}
> -
> -Expects to have a fully populated OCF RA-compliant environment set.
> -END
> -}
> -
> # Check for mandatory files presence and consistency
> vmware_validate() {
> if [ -z "`pidof vmware-hostd`" ]; then
> @@ -182,7 +200,7 @@
> if [ -z "$VMID" ]; then
> # VM is not registered, need to register
> ocf_log info "Virtual machine $VM is not registered"
> -ocf_log info "Registering Virtual machine $VM"
> +ocf_log info "Registering Virtual machine $VM >>>> $VMXPATH"
> vmware_register_vm "$VMXPATH"
> VMID=`vmware_get_vid "$RELVMXPATH"`
> if [ -z "$VMID" ]; then
> @@ -269,7 +287,7 @@
>
> # Print metadata informations
> meta_data() {
> -cat <<END
> +cat <<EOF
> <?xml version="1.0"?>
> <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
> <resource-agent name="vmwarevm">
> @@ -305,7 +323,7 @@
> <action name="meta-data" timeout="5" />
> </actions>
> </resource-agent>
> -END
> +EOF
> }
>
> # See how we were called
> _______________________________________________
> Linux-HA mailing list
> [email protected]
> http://lists.linux-ha.org/mailman/listinfo/linux-ha
> See also: http://linux-ha.org/ReportingProblems
_______________________________________________
Linux-HA mailing list
[email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha
See also: http://linux-ha.org/ReportingProblems