Мне нужно контролировать виртуальную машину, запущенную в среде Windows Server 2008, с помощью VirtualBox. Я использую Nagios для мониторинга. Этот процесс выполняется в среде сервера Ubuntu.
Связь между Nagios и машиной Windows основана на NRPE (Nagios Remote Protocol Executor). Я установил NSClient ++ на машину Windows и написал сценарий, который запускает команду VBoxManage для проверки состояния виртуальной машины.
Вот сценарий:
@ECHO off
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo "win732" --machinereadable > C:\Users\root\etat_machine.txt
FOR /F "tokens=* delims= " %%a in ('FINDSTR /I "win732" C:\Users\root\etat_machine.txt ^| FIND /C /I "win732"') do ( set res=%%a )
IF %res% == 1 goto ok
IF %res% == 0 goto err
:err
ECHO WARNING: VM DOWN
EXIT /B 1
:ok
ECHO OK: VM UP
EXIT /B 0
Если я запустил этот сценарий непосредственно на сервере Windows (./check_vm.bat), файл etat_machine.txt будет содержать VMState = "running", и сценарий вернет VM UP. Если сценарий выполняется через NRPE, он содержит VMState = "poweroff", хотя виртуальная машина работает.
Есть у кого-нибудь объяснение? Я проверил пользователя, выполняющего скрипт, и в обоих случаях это root. Так что я не думаю, что это проблема с разрешением ... Или, может быть, разрешение на службу NSClient тогда ...
Я действительно думаю, что это связано с привилегиями (или, по крайней мере, с тем, как работает Virtual box). Я провел здесь быстрый тест (поскольку я широко использую виртуальный ящик для тестирования nsclient ++).
Запуск данного виртуального бокса от имени «я» (привилегированный пользователь). Затем выполните следующую команду: VBoxManage.exe showvminfo 610c457f-52e2-4c83-9e0c-e3ef13a8b152 (где GUID оказался одной из моих виртуальных машин).
Как «я» я получаю:
State: running (since 2011-08-30T07:12:01.597000000)
Как и я с консолью администратора, я получаю (т.е. cmd как admin):
State: powered off (since 2011-08-30T03:50:32.000000000)
В качестве пользовательского теста я получаю:
VBoxManage.exe: error: Could not find a registered machine named '610c457f-52e2-4c83-9e0c-e3ef13a8b152'
В качестве пользовательского теста в качестве администратора я получаю:
VBoxManage.exe: error: Could not find a registered machine named '610c457f-52e2-4c83-9e0c-e3ef13a8b152'
Таким образом, похоже, что состояние не переносится между разными пользователями / уровнями. Но опять же, это просто я играю, поэтому я действительно не знаю ...
NSClient ++ был запущен как системная учетная запись. Использовать PsИнструменты чтобы запустить ваш bat-файл (или VBoxManage.exe) в качестве этой учетной записи, чтобы посмотреть, что произойдет.