Дело было вечером, делать было много чего. И почти все — в VirtualBox. Используя headless виртуалки.
Я уже давно оценил плюсы виртуальных машин для разработки, и повсеместно их использую. В результате имею парк в 5-10 виртуальных машин, с разными ветками и проектами. Несколько из которых постоянно запущены.
90% из них запускаются в headless режиме. И берут IP динамически. Так как статику контролировать постоянно невозможно, и она имеет другие ограничения. Отсюда результат — достоверно неизвестно с каким адресом запустится виртуалка.
В этом случае у меня такой порядок запуска виртуалки:
1. запуск в нормальном режиме
2. смотрим внутри нее ifconfig / ipconfig на предмет адреса
3. гасим ее
4. запускаем в headless и надеемся, что адрес будет таким же
Думаю вы с таким сталкивались. Если нет — можете перейти к следующему посту. Под катом нет никакой волшебной теории или особого кода. Под катом — простое и готовое решение. Для тех, кому эта небольшая повседневная задача знакома.
На VB трекере есть соответствующий feature request. Но он закрыт как «works for me». Вот код этого решения:
VBoxManage guestproperty enumerate {`VBoxManage list runningvms | awk -F"{" '{print $2}'` | grep
IP | awk -F"," '{print $2}' | awk '{print $2}'
Решение «Linux only», что меня не устраивает. Других, особенно более красивых, решений не нашлось, тч было решено написать свое.
Небольшой скрипт для node.js, который перечисляет все запущенные виртуалки и все их сетевые адреса. Сперва он получает список запущенных машин, после чего получает проперти каждой:
Частичный листинг
exec("vboxmanage list runningvms", function (err, stdout, stderr) {
if (stdout) {
var vmNames = stdout.match(/"([^"]*)"/g);
if (vmNames) {
for (var x = 0; x < vmNames.length; x++) {
var vmName = vmNames[x];
(function (vmName) {
exec("VBoxManage guestproperty enumerate " + vmName, function (err, stdout, stderr) {
getVmIps(err, stdout, stderr, vmName)
});
})(vmName);
}
} else {
console.log("No running VMs");
}
} else {
console.log(stderr);
}
});
Запускается с помощью «node vmip» и показывает что-то типа:
SomeMachine
192.168.13.188U3
10.0.2.15
192.168.13.29
192.168.56.101XP
192.168.56.102
10.0.2.15
Скрипт проверен на используемых Windows / OS X. Полностью лишен красоты и наполнен суровой практичностью. Если будет спрос — будет дополняться.
Автор: DenisO