проблема при выполнении сценария удаленного золы SSH на хосте ESXI - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть два сервера: оболочка Linux (192.168.1.11) и оболочка хоста ESXI (192.168.1.12).

Желаемый результат:

  • Локальный testsuspend.sh scp uploadssuspendvm.sh на удаленный сервер ESXI и выполняется на ESXI.По окончании testsuspend.sh продолжается и завершается.
  • Script testsuspend.sh on .11 загружает сценарий ash (suspendvm.sh) на хост ESXi .12, должен выполнить его и дождаться его завершения, затем завершить testsuspend.sh.

В Linux я хочу удаленно выполнить скрипт suspendvm.sh из другого скрипта testsuspend.sh, чтобы приостановить все виртуальные машины и перевести хост ESXI в режим обслуживания.

Когда я выполняю testsuspend.sh в Linux, он останавливается на выполнении suspendvm.sh через SSH.Если я выполню сценарий приостановки sustendvm.sh непосредственно на хосте ESXI, он будет работать.

Файл после копирования на ESXI:

-rwxr-xr-x    1 root     root          1260 Apr 16 07:06 suspendvm.sh

У вас есть представление о том, что мне нужно сделать здесьчтобы заставить удаленный скрипт ssh правильно выполняться на хосте ESXi и локальный скрипт, чтобы дождаться завершения удаленного?

... Итак, я обнаружил, что если я запускаю это в testsuspend.sh, это работает:

cat suspendVM.sh | ssh -T $user@$host

Почему это работает, но не копирует и выполняет?

Локальный сценарий 192.168.1.11, testsuspend.sh должен выполнить suspenvm.sh удаленно:

#!/bin/sh
user="root"
host="192.168.1.120"

scp suspendvm.sh $user@$host:/tmp
echo "copy suspend script"
ssh $user@$host 'sh -s /tmp/suspendvm.sh' &
exit

Удаленный сценарий 192.168.1.12, suspendvm.sh работает, когда я выполняю на хосте ESXI .12):

#!/bin/sh
RUNNING=0
VMS=`vim-cmd vmsvc/getallvms | grep -v Vmid | awk '{print $1}'`
for VM in $VMS ; do
     # echo "Probing VM with id: $VM."
     PWR=`vim-cmd vmsvc/power.getstate $VM | grep -v "Retrieved runtime info"`
     name=`vim-cmd vmsvc/get.config $VM | grep -i "name =" | awk '{print $3}' | head -1 | awk -F'"' '{print $2}'
     echo "VM with id $VM has power state $PWR (name = $name)."
     if [ "$PWR" == "Powered on" ] ; then
          RUNNING=1
          echo "Powered on VM with id $VM and name: $name"
          echo "Suspending VM with id $VM and name: $name"
          vim-cmd vmsvc/power.suspend $VM > /dev/null &
     fi
done

while true ; do
     if [ $RUNNING -eq 0 ] ; then
          echo "Gone..."
          break
     echo "Powered on VM with id $VM and name: $name"
          echo "Suspending VM with id $VM and name: $name"
          vim-cmd vmsvc/power.suspend $VM > /dev/null &
     fi
done

while true ; do
     if [ $RUNNING -eq 0 ] ; then
          echo "Gone..."
          break
     fi
     RUNNING=0
     for VM in $VMS ; do
          PWR=`vim-cmd vmsvc/power.getstate $VM | grep -v "Retrieved runtime info"`
          if [ "$PWR" == "Powered on" ] ; then
               name=`vim-cmd vmsvc/get.config $VM | grep -i "name =" | awk '{print $3}' | head -1 | awk -F'"' '{$
               echo "Waiting for id $VM and name: $name..."
               RUNNING=1
          fi
     done
     sleep 1
esxcli system maintenanceMode set --enable true
done

Удаленный сценарий # 2, который должен делать то же самое с помощью esxicli, он также работает, когда я его выполняюна .12, но не через ssh с .11:

#! /bin/ash
#test2
rm -f listid
touch listid

######## Listing the running vms################

esxcli vm process list |grep -v "^\s.*"| grep -v "^$" > list

######## If you want to reuse list for later use #######
####### put the file in a datastore, else it ##########
#######gonna be erease on next reboot ##########
####### Command look like this: ###############

## esxcli vm process list |grep -v "^\s.*"| grep -v "^$" > /vmfs/volumes/tmp/list

########## cleaning the id.s file by keeping only the id
for name in `cat list`;do
########## Dont forget to change the path if #######
########## you choose to put it in a datastore #####
####### put the file in a datastore, else it ##########
#######gonna be erease on next reboot ##########
####### Command look like this: ###############

## esxcli vm process list |grep -v "^\s.*"| grep -v "^$" > /vmfs/volumes/tmp/list

########## cleaning the id.s file by keeping only the id
for name in `cat list`;do
########## Dont forget to change the path if #######
########## you choose to put it in a datastore #####

## Example: for name in `cat /vmfs/volumes/yourDatastore/list`;do

        vim-cmd vmsvc/getallvms | grep $name | grep vmx | grep -v "^$" | awk '{print $1}'>> listid
done

for id in `cat listid`;do
        ###### suspending vms##########
        echo "Suspending the running machines"
        vim-cmd vmsvc/power.suspend $id

## Example: for name in `cat /vmfs/volumes/yourDatastore/list`;do

        vim-cmd vmsvc/getallvms | grep $name | grep vmx | grep -v "^$" | awk '{print $1}'>> listid
done

for id in `cat listid`;do
        ###### suspending vms##########
        echo "Suspending the running machines"
        vim-cmd vmsvc/power.suspend $id

done

echo "done."
echo "shutting down the host now.."
#/bin/poweroff
vim-cmd hostsvc/maintenance_mode_enter
#excli system maintenanceMode set --enable true
#done
...