Updated + code: Свой «VBoxManage list ip» — список адресов запущенных виртуальных машин

в 13:28, , рубрики: javascript, virtualbox, администрирование, виртуализация, системное администрирование, метки: ,

Дело было вечером, делать было много чего. И почти все — в 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.188

U3
10.0.2.15
192.168.13.29
192.168.56.101

XP
192.168.56.102
10.0.2.15

Скрипт проверен на используемых Windows / OS X. Полностью лишен красоты и наполнен суровой практичностью. Если будет спрос — будет дополняться.

Автор: DenisO

Источник

Поделиться