Especialistas
Estou tendo um problema ao obter um script do PowerCLI chamado como parte de um desligamento do APCUPSD. Eu tenho tentado descobrir o que está impedindo que o script PowerCLI seja executado, mas preciso da sua ajuda.
Eu tenho um servidor em execução: Ubuntu Server 14.04, APCUPSD, Powershell v6.0.0-alpha.18, Núcleo PowerCLI
A finalidade deste servidor é usar o PowerCLI para percorrer algumas máquinas virtuais em um servidor ESXi e desligá-las antes de desligar o host. Coisas bem típicas.
Eu tenho o APCUPSD configurado para chamar um script de showdown personalizado: / etc / apcupsd / doshutdown, conforme indicado pelo homem / docs.
=============================================
cat / etc / apcupsd / doshutdown
logger "Starting doshutdown script"
export HOME=/home/apcups
sudo powershell -f /sbin/esxbk-shutdown.ps1
logger "Finished doshutdown script"
exit 99
=============================================
Dentro de /sbin/esxbk-shutdown.ps1, eu executo algum PowerCLI para desligar o host e algumas VMs. Não é o mais elegante, mas funciona:
==========================================
/etc/apcupsd# cat /sbin/esxbk-shutdown.ps1
#Should connect to ESX and request all the VMs do Guest Shutdown, then power off ESXi.
logger "Starting ESXBK-shutdown.ps1"
#Load PowerCLI modules
Get-Module -ListAvailable PowerCLI* | Import-Module
#Ensure the IP address matches the ESXi host
Connect-viserver -server 192.168.X.X -user apcups -password "my password"
#Loop through each VM that is not the UPS control VM and is powered on
Foreach ($VM in ( Get-VM | Where { $_.Name -notlike "ESXBK-UPS*" -and $_.PowerState -eq "PoweredOn" } )){
# Shutdown the guest cleanly
$VM | Shutdown-VMGuest -Confirm:$false
}
#Allow VMs to properly shutdown
$waittime = 300 #Total seconds for VMs to shutdown
do {
# Wait for the VMs to be Shutdown cleanly
sleep 10.0
$waittime = $waittime - 10
$numvms = @(Get-VM | Where { $_.Name -notlike "ESXBK-UPS*" -and $_.PowerState -eq "PoweredOn" }).Count
Write-host "Waiting for shutdown of $numvms VMs or until $waittime seconds"
} until ((@(Get-VM | Where { $_.Name -notlike "ESXBK-UPS*" -and $_.PowerState -eq "PoweredOn" }).Count) -eq 0 -or $waittime -le 0)
#send shutdown to Carmel-ESXBK
#get-vmhost | Foreach {Get-View $_.ID} | Foreach {$_.ShutdownHost_Task($TRUE)}
logger "Finished ESXBK-shutdown.ps1"
=============================================== =
Aqui está a parte frustrante: Se eu chamar este script a partir da linha de comando com ./doshutdown ou / etc / apcupsd / doshutdown, ele funcionará perfeitamente.
Quando o apcupsd o chama, ele sufoca na parte do powershell. Nunca termina de executar a parte do powershell. Eu não consigo descobrir o porquê.
Eu fiz uma entrada muito feia sudoers para permitir que o script powershell sempre execute como root, como você pode ver no script chamando sudo /sbin/esxbk-shutdown.ps1, mas ainda não há alegria.
ALL ALL = (root) NOPASSWD: /sbin/esxbk-shutdown.ps1
(Tenho certeza de que isso é um tipo de erro, mas estou testando correções, provavelmente não é necessário, mas estou tentando garantir que não haja problemas com permissões, se puder.)
Aqui está a saída do syslog:
Jun 2 21:37:38 ESXBK-UPS apcups: Starting doshutdown script
XDG_SESSION_ID=1
TERM=xterm
SHELL=/bin/bash
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
SUDO_USER=apcups
SUDO_UID=1000
USERNAME=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
MAIL=/var/mail/root
PWD=/
LANG=en_US.UTF-8
HOME=/root
SUDO_COMMAND=/bin/su
SHLVL=2
LOGNAME=root
LESSOPEN=| /usr/bin/lesspipe %s
SUDO_GID=1000
XDG_RUNTIME_DIR=/run/user/1000
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/printenv
Jun 2 21:37:41 ESXBK-UPS apcups: Starting ESXBK-shutdown.ps1
Jun 2 21:37:43 ESXBK-UPS powershell: DEFAULT_APPNAME Warning: 0 :
Jun 2 21:37:43 ESXBK-UPS powershell: Unable to load settings file : /var/opt/vmware/powercli/PowerCLI_Settings.xml. Error: System.IO.DirectoryNotFoundException: Could not find a part of the path '/var/opt/vmware/powercli/PowerCLI_Settings.xml'.#012 at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func'2 errorRewriter)#012 at Interop.CheckIo[TSafeHandle](TSafeHandle handle, String path, Boolean isDirectory, Func'2 errorRewriter)#012 at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)#012 at System.IO.UnixFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, FileStream parent)#012 at System.IO.UnixFileSystem.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, FileStream parent)#012 at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)#012 at VMware.VimAutomation.ViCore.Util10.Settings.FileSettingsStore.LoadFileSettings(String settingsFile)#012 at VMware.VimAutomation.ViCore.Util10.Settings.FileSettingsStore.LoadSettings()
Jun 2 21:37:43 ESXBK-UPS powershell: DEFAULT_APPNAME Warning: 0 :
Jun 2 21:37:43 ESXBK-UPS powershell: Unable to load settings file : /var/opt/vmware/powercli/PowerCLI_Data.xml. Error: System.IO.DirectoryNotFoundException: Could not find a part of the path '/var/opt/vmware/powercli/PowerCLI_Data.xml'.#012 at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func'2 errorRewriter)#012 at Interop.CheckIo[TSafeHandle](TSafeHandle handle, String path, Boolean isDirectory, Func'2 errorRewriter)#012 at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)#012 at System.IO.UnixFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, FileStream parent)#012 at System.IO.UnixFileSystem.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, FileStream parent)#012 at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)#012 at VMware.VimAutomation.ViCore.Util10.Settings.FileSettingsStore.LoadFileSettings(String settingsFile)#012 at VMware.VimAutomation.ViCore.Util10.Settings.FileSettingsStore.LoadSettings()
Jun 2 21:38:29 ESXBK-UPS apcups: Finished ESXBK-shutdown.ps1
Jun 2 21:38:30 ESXBK-UPS apcups: Finished doshutdown script
Não consigo descobrir o que esse erro significa, mas o script é executado corretamente quando eu o chamo, mas não quando o APCUPSD o faz. Esse diretório não existe, mas não sei por que ele é solicitado ou é importante, já que posso executá-lo.
Encontrei um post semelhante sobre um problema como este, mas ele está tentando usar o PLINK, não o PowerCLI: link
Alguém pode ter ideias sobre como solucionar esse problema ou contorná-lo?
Por fim, não sou muito versado em linux, você pode ter que quebrar alguma coisa ou fornecer comandos completos para tentar, desculpe.
Eu realmente agradeço a ajuda de ninguém.
Obrigado.
Tags powershell