VIRTUALBOX per server linux con PYTHON

Utilizzare Virtualbox su server Linux non è mai stato cosi facile grazie a Python.

il
ICT - Manager, Collaboratore di IProgrammatori

Oggi vedremo come può esserci utile Python nell'automazione dei processi.

In un organizzazione di una rete infrastrutturale piccola, media o grande che sia un'amministratore di sistema si trova sempre nella condizione di dover garantire affidabilità, prestazione e sicurezza a livelli sempre più alti per tanti motivi

Basti pensare che la sola procedura di backup, potrebbe in alcuni casi, saturare le risorse di trasferimento della rete LAN dell'infrastruttura creando cosi un livello prestazionale basso pur rispettando i canoni di sicurezza che prevedono a prescindere procedure di backup sia di dati utente che di Work Copy, ovvero copie integrali di server e client presenti sulla stessa rete.

Ne scaturisce di conseguenza che anche l'affidabilità dell'intera infrastruttura ne risentirebbe perché appunto durante queste procedure indispensabili, come abbiamo detto prima, i vari servizi offerti sarebbero seriamente compromessi per mancanza di risorse disponibili.

Per far fronte a tali esigenze esistono svariate soluzioni e il principio fondamentale è che non esiste una soluzione unica che possa garantire a pieno i tre principi fondamentali di AFFIDABILITA - PRESTAZIONE - SICUREZZA. La scelta viene fatta valutando bene le esigenze dell'infrastruttura cercando di combinare a meglio le varie soluzioni disponibili.

Senza dubbio nella stragrande maggioranza dei casi, una scelta che sempre più spesso viene adottata dagli amministratori di sistema e di rete è la VIRTUALIZZAZIONE. I benefici di questa scelta sono molteplici sia in termini di sicurezza che di affidabilità e di prestazione. Avere un sistema virtualizzato che garantisce servizi all'intera rete infrastrutturale vuol dire per un amministratore avere sicuramente la possibilità di gestire i backup in modo più versatile e produttivo.

Infatti, a prescindere dalla scelta software che si possa fare per la virtualizzazione, una macchina virtuale ci da la possibilità di creare istantanee in modo molto rapido e affidabile cosi da evitare saturazioni della banda disponibile per il trasferimento dei dai o addirittura l'indisponibilità dei servizi che la stessa offre alla rete. Cosi come anche la procedura di restore di un'istantanea avviene in modo rapido ed efficace.

Ad oggi esistono diverse scelte disponibili per creare sistemi virtualizzati e la scelta può riguardare sia la disponibilità economica disponibile sia la necessita di alcune funzioni che possono offrire alcuni sistemi anziché altri. In questo articolo si farà riferimento al noto software di virtualizzazione open-source VIRTUALBOX ed in particolare alla gestione di macchine virtuali su server LINUX.

Virtualbox è un sistema di virtualizzazione open-source che nasce nel 2007 ed è distribuito da ORACLE. Il software ci da la possibilità di gestire le macchine virtuale sia tramite l'utilizzo di GUI che da linea di comando. Nel nostro caso, dovendo gestire la virtualizzazione su server LINUX, useremo i comandi da terminale ma nello specifico, utilizzeremo uno script realizzato in Python che rende la procedura da terminale un tantino piu user-friendly.

Lo script si chiama ViBo.py e prevede, come requisiti, l'installazione sul server linux, oltre che dell'interprete Python anche l'installazione di virtualBox e relativo service pack di virtualbox.

Quindi, per prima cosa stabiliamo una connessione ssh con il server

ssh -p (porta ssh) nome_utente@indirisso_ip_server

aggiorniamo quindi il sistema:

sudo apt-get update
sudo apt full-upgrade

installiamo quindi virtualbox sul nostro server, aggiungendo prima la chiave pubblica di autenticazione del repository di Virtualbox

wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -


Apriamo quindi il file source.list per inserire il repository

sudo gedit /etc/apt/sources.list

Per ubuntu server 18.04 incolliamo :

deb http://download.virtualbox.org/virtualbox/debian bionic contrib

Per ubuntu server 16.04 incolliamo:

deb http://download.virtualbox.org/virtualbox/debian xenial contrib

Quindi chiudiamo l'editor di testo salvando le modifiche e lanciamo il comando per l'installazione

sudo apt update && sudo apt install virtualbox-6.0

Installiamo anche extension pack di virtualbox che arricchisce di altre funzioni il programma. Il file da installare va prima scaricato dal sito principale di virtualbox e dopodiché da terminale lanciamo

VBoxManage extpack install nuovo_pack

Ora non ci resta che installare l'interprete python

sudo apt-get install python3

Bene a questo punto possiamo lanciare il nostro script e creare finalmente la nostra macchina virtuale. Ovviamente per la creazione di una macchina virtuale avremo bisogno del file immagine del sistema che si vorrà installare sulla macchina virtuale. Infatti durante l'utilizzo dello scritpt ci verrà  chiesto appunto il precorso e il nome del file ISO da utilizzare:

da terminale scriviamo

python3.7 ViBo.py

Ci troviamo cosi al menu principale:

Il menù ci permetterà di:

1. Visualizzare l'elenco delle macchine virtuali presenti nel sistema, cosi da conoscere il nome che è stato assegnato per poterla gestire

2. Creare una nuova macchina virtuale seguendo le indicazioni che ci verranno
richieste. In particolare ricordo di dover essere già in possesso del file ISO del sistema che si vorrà installare in una cartella specifica del sistema che successivamente dovremmo indicare nella procedura

3. Eliminare una macchina virtuale esistente nel sistema fatto salvo del file vdi, ovvero del file che identifica HDD della macchina virtuale. Questa scelta di non eliminare il file direttamente è stata fatta per motivi di sicurezza. Infatti l'utente potrà utilizzare lo stesso file per altre macchine virtuali oppure potrà successivamente con il comando rm da terminale, eliminare il file definitivamente

4. Avviare una macchina virtuale gia presente nel sistema

5. Spegnere una macchina virtuale gia avviata precedentemente

6. Ottenere le informazioni di sistema indispensabili per la creazione di una macchina virtuale

7. Modifica una macchina virtuale già esistente, cambiando il numero di core e la quantita di memoria RAM assegnata alla macchina virtuale

8. Gestione degli snapshot. Ovvero la possibilità di creare,ripristinare o cancellare un'istantanea della macchina virtuale.

Prima di procedere, il programma ci da la possibilità di conoscere alcune informazioni indispensabili per la creazione di una macchina virtuale. Indicare la scheda di rete è fondamentale in quanto è grazie a questa informazione che la nostra macchina virtuale potrà essere gestita sulla rete
dell'infrastruttura. Altro dato importante è il numero di CORE da voler assegnare alla macchina virtuale che ovviamente va scelto tenendo conto delle risorse disponibili.

In questa prima versione del software si prevede la creazione di una macchina virtuale con scheda di rete in modalità BRIDGE ovvero dovrà essere assegnato ad essa un'indirizzo ip appartenente alla stessa rete infrastrutturale già esistente. Procediamo quindi scrivendo s

A questo punto lo script ci chiederà le informazioni necessarie affinché possa essere creata correttamente la macchina virtuale. Le informazioni scelte in questo caso sono:

• Percorso della ISO da installare /home/root/prova.iso
• Nome macchina virtuale prova
• Memoria RAM 1000 Mb
• scheda di rete enp7s0
• Percorso file vdi /home/root/prova.vdi
• Grandezza del hdd 10000 Mb
• Porta per desktop remoto 5505 (questa porta è fondamentale per avere la possibilità di collegarsi in desktop remoto e quindi utilizzando il  protocollo RDP, per poter finalmente interagire con la nostra macchina virtuale)

Nel caso volessimo rivedere le impostazioni inserite basta scrivere s ed avremo il riepilogo della nostra macchina virtuale

Confermando in fine le informazioni la macchina verrà creata. Dopodiché nel menu principale visto in precedenza potremmo avviarla e  successivamente tramite connessione RDP gestirla.


La scelta nr 8 del menu principale, ci da la possibilità di gestire gli snapshot. Quindi potremo creare un'istantanea della nostra macchina virtuale e poterla gestire in futuro avviando la procedura di restore o se è il caso cancellarla, sempre tramite lo stesso sotto menu in questione. Altra possibilità
importante che il programma prevede in fase di creazione di uno snapshot è quella di compilare una descrizione utile come promemoria per lo stesso

Di seguito il codice sorgente Python del programma VIBO.py

# Con questo script si avrà la possibilità di creare una macchina virtuale utilizzando VIRTUAL BOX su un server Linux.'
# La procedura standard prevede una serie di comandi da terminale e quindi lo script agevolerà questi passaggi' \
# I requisiti per il corretto funzionamento dello script sono : l\'installazione di VIRTUAL BOX sul server Linux' \
# e la copia dell\'immagine ISO dal sistema da installare'
import os
os.system('clear')
x=2 # Questa variabile è usata per la gestione del ciclo WHILE del menu PRNICIPALE
y=2 # Questa variabile è usata per la gestione del ciclo WHILE del menu MODIFICA HARDWARE
z=2 # Questa variabile è usata per la gesyine del ciclo WHILE del menu GESTIONE SNAPSHOT
def elencoVM():
    os.system('clear')
    print('Queste sono le macchine virtuali presenti nel sistema\n')
    os.system('vboxmanage list vms')

# MENU PRINCIPALE
while x>1:
os.system('clear')
print('Questo script ti aiuterà nella gestione e creazione di una macchina virtuale su VIRTUALBOX')
print('\nSeleziona una scelta per procedere')
print('\n1 - Elenco delle macchine virtuali presenti nel sistema')
print('\n2 - Creare una macchina virtuale')
print('\n3 - Elimina macchina virtuale di cui si conosce il nome')
print('\n4 - Avvia una macchina virtuale')
print('\n5 - Spegnere una macchina virtuale')
print('\n6 - Informazioni di sistema per la creazione della Macchina Virtuale')
print('\n7 - Modifica macchina virtuale esistente')
print('\n8 . Gestione SNAPSHOT')
print('\ndigita exit per uscire dal programma')
scelta=input('\ninserisci la scelta.....')
if scelta=='exit':
x=0
if scelta =='1':
os.system('clear')
elencoVM()
exit = input('\nPremi 1 per tornare al menu principale ')
if exit == '1':
x = 2
if scelta =='2':
os.system('clear')
print('\n Hai scelto di creare una macchina virtuale')
print('\nPrima di proseguire devi conoscere le seguenti informazioni:')
print('\n - il nome che il sistema assegna alla scheda di rete usando il comando ifconfig da terminale')
print('\n - il numero di CORE disponibili nel sistema da poter assegnare alla macchina virtuale')
rete=input('\nSe non hai queste informazioni usa l\'opzione 6 dal menu principale. Continuare con la creazione della Macchina Virtuale s/n....?')
if rete == 's':
os.system('clear')
iso=input('\ninserisci il percorso e il nome del file ISO del sistema da installare sulla macchina virtuale. es /home/user/vm.iso ')
nomeMV=input('\niserisci il nome da assegnare alla macchina virtuale ')
ramVM=input('\ninserisci la quantità di memoria RAM in MegaByte ')
coreVM=input('\ninserisci il numero di CORE da destinare alla macchina virtuale ')
nicVM=input('\ninserisci il nome della scheda di rete ')
pathVM=input('\ninserisci il percorso e il nome dove verra salvata la Macchina virtuale es. /home/user/VM.vdi ')
sizeVM=input('\ninserisci la grandezza del hdd della macchina virtuale espressa in MegaByte ')
rdpVM=input('\ninserisci il numero della porta da utilizzare per la connessione tramite Desktop Remoto alla macchina virtuale ')
reportVM=input('\n\nVuoi vedere il riepilogo della tua macchina virtuale s/n? ')
if reportVM =='s':
os.system('clear')
print('Il nome della tua macchina virtuale è '+nomeMV)
print('L\'hardware della macchina virtuale è:\nMemoria RAM:'+ramVM+'Mb'+'\nHard Disk:'+sizeVM+'Mb'+'\nNome scheda di rete:'+nicVM+'\nFile iso:'+iso+'\nPercorso macchina virtuale:'+pathVM)
okVM=input('Confermi s/n ?')
if okVM =='s':
os.system('clear')
os.system('vboxmanage createvm --name \"'+nomeMV+'\" --register')
os.system('vboxmanage modifyvm \"'+nomeMV+'\" --memory '+ramVM+' --acpi on --boot1 dvd --nic1 bridged --bridgeadapter1 '+nicVM)
os.system('vboxmanage createhd --filename '+pathVM+' --size '+sizeVM)
os.system('vboxmanage storagectl \"'+nomeMV+'\" --name \"IDE controller\" --add ide')
os.system('vboxmanage storageattach \"'+nomeMV+'\" --storagectl \"IDE controller\" --port 0 --device 0 --type hdd --medium '+pathVM)
os.system('vboxmanage storageattach \"'+nomeMV+'\" --storagectl \"IDE controller\" --port 1 --device 0 --type dvddrive --medium '+iso)
os.system('vboxmanage modifyvm \"'+nomeMV+'\" --cpus '+coreVM)
os.system('vboxmanage modifyvm \"'+nomeMV+'\" --vrdeport '+rdpVM+' --vrde on')
exit = input('\nPremi 1 per tornare al menu principale.....')
if exit == '1':
x = 2
if okVM=='n':
x = 2
if scelta=="3":
os.system('clear')
print('\nQuete è l\'elenco delle macchine virtuali presenti sul sistema\n')
os.system('\nvboxmanage list vms'+'\n')
oldVM = input('\ninserisci il nome della macchina virtuale che vuoi ELIMINARE ')
startVM = input('\nVuoi procedere ad ELIMINARE la macchina virtuale ' + oldVM + ' s/n ')
if startVM=='s':
os.system('\nvboxmanage unregistervm '+oldVM+' --delete')
print('\nLa macchina virtuale '+oldVM+' è stata eliminata con successo. ')
print('\nDi seguito l\'elenco aggiornato delle macchina virtuali presenti sul sistema')
os.system('\nvboxmanage list vms')
exit=input('\nPremi 1 per tornare al menu principale....')
if exit=='1':
x=2
if scelta=='4':
os.system('clear')
print('Hai scelto di avviare una macchina virtual esistente. Di seguito l\'elenco delle macchine virtuali presenti\n')
os.system('\nvboxmanage list vms')
oldVM=input('\ninserisci il nome della macchina virtuale che vuoi avviare ')
startVM=input('\nVuoi procedere ad avviare la macchina virtuale '+oldVM+' s/n ')
if startVM=='s':
os.system('\nvboxmanage startvm '+oldVM+' --type headless')
print('\nLa macchina virtuale '+oldVM+' è stata avviata correttamente, puoi procedere alla connessione remota')
exit = input('\nPremi 1 per tornare al menu principale.... ')
if exit == '1':
x = 2
if scelta=='5':
os.system('clear')
print('\nHai scelto di spegnere una macchina virtuale. Per poter proseguire devi indicare il nome della macchina in questione')
print('\nQuesto è l\'elenco delle macchine virtuali presenti nel sistema \n')
os.system('\nvboxmanage list vms')
closeVM=input('\ninserisci il nome della macchina virtuale da spegnere ')
os.system('\nvboxmanage controlvm '+closeVM+' poweroff')
print('\nLa macchina virtuale '+closeVM+' è stata spenta correttamente')
exit = input('\nPremi 1 per tornare al menu principale....')
if exit == '1':
x = 2

# MENU MODIFICA HARDWARE
if scelta=='6':
while y>1:
os.system('clear')
print('\n 1 - Elenco schede di rete presenti nel sistema')
print('\n 2 - Numero di CORE disponibili nel sistema')
print('\n 3 - Torna al menu principale')
sceltaHW=input('\nDi quale informazioni hai bisogno? ')
if sceltaHW=='1':
os.system('clear')
os.system('ifconfig |grep flags')
infoNET=input('\nHai bisogno anche di conoscere il numero di CORE presenti nel sistema? s/n ')
if infoNET=='n':
y=0
x=2
if infoNET=='s':
print('\n')
os.system('lscpu |grep socket')
exitCORE=input('\nPremi un tasto per uscire.....')
y=2
if sceltaHW=='2':
os.system('clear')
os.system('lscpu |grep socket')
infoCORE=input('\nHai bisogno anche di conoscere il nome della scheda di rete? s/n ')
if infoCORE=='n':
y=0
x=2
if infoCORE=='s':
print('\n')
os.system('ifconfig |grep flags\n')
exitCORE=input('\nPremi un tasto per uscire.....')
y=2
if sceltaHW=='3':
y=0
x=2
if scelta == '7':
os.system('clear')
print('\nDi seguito l\'elenco delle macchine virtuali presenti nel sistema che possono essere modificate')
elencoVM()
modVM = input('\nInserisci il nome della macchina virtuale da modificare ')
os.system('clear')
print('Hai scelto di modificare le caratteristiche della macchina virtuale '+modVM)
print('\nNel caso non si voglia modificare un determinato valore si dovrà comunque confermare l\'attuale valore già impostato')
print('\nDi seguito verranno indicati i valori attualmente impostati per la Macchina virtuale scelta ')
print('\nLe modifiche richieste possono essere applicate se la VM è spenta.\n')
applyMOD = input('Hai bisogno di spegnere la VM per procedere con le modifiche? s/n ')
if applyMOD == 's':
os.system('clear')
os.system('vboxmanage controlvm ' + modVM + ' poweroff')
print('\nMemoria RAM attualmente impostata sulla VM '+modVM+'\n')
os.system('vboxmanage showvminfo '+modVM+'|grep Memory ')
modRAM=input('\nInserisci il valore della memoria RAM desiderato. ')
print('\nIl numero di CORE attualmente impostato sulla VM '+modVM+'\n')
os.system('vboxmanage showvminfo '+modVM+'|grep CPUs')
modCORE=input('\nInserisci il numero di CORE da assegnare alla macchina Virtuale ')
os.system('vboxmanage modifyvm \"'+modVM+'\" --cpus '+modCORE)
os.system('vboxmanage modifyvm '+modVM+' --memory '+modRAM)
print('\nLe modifiche sono state effettuate con successo. Usa l\'opzione 6 dal menu principale per verificare')
exit1=input('\nPremi 1 per tornare al menu principale..... ')
if exit1==1:
x=2
if applyMOD=='n':
os.system('clear')
os.system('vboxmanage controlvm ' + modVM + ' poweroff')
print('\nMemoria RAM attualmente impostata sulla VM ' + modVM + '\n')
os.system('vboxmanage showvminfo ' + modVM + '|grep Memory ')
modRAM = input('\nInserisci il valore della memoria RAM desiderato. ')
print('\nIl numero di CORE attualmente impostato sulla VM ' + modVM + '\n')
os.system('vboxmanage showvminfo ' + modVM + '|grep CPUs')
modCORE = input('\nInserisci il numero di CORE da assegnare alla macchina Virtuale ')
os.system('vboxmanage modifyvm \"' + modVM + '\" --cpus ' + modCORE)
os.system('vboxmanage modifyvm ' + modVM + ' --memory ' + modRAM)
print('\nLe modifiche sono state effettuate con successo. Usa l\'opzione 6 dal menu principale per verificare')
exit1 = input('\nPremi 1 per tornare al menu principale..... ')
if exit1 == 1:
x = 2
if scelta=='8':
z=2
while z>1:
os.system('clear')
print('\nIn questa sezione potrai gestire gli SNAPSHOT delle tue macchine virtuali')
print('\nDi seguito l\'elenco delle macchine virtuali presenti nel sistema\n')
os.system('vboxmanage list vms')
snapVM=input('\nInserisci il nome della VM su cui gestire gli SNAPSHOT o premi INVIO per tornare indietro')
if snapVM=="":
x=2
z=0
if snapVM !="":
os.system('clear')
print('\nHai scelto di gestire gli snapshot per la VM '+snapVM)
print('\n1 - VISUALIZZA l\'elenco degli snapshot esistenti')
print('\n2 - CREA uno snapshot ')
print('\n3 - RIPRISTINA uno snapshot')
print('\n4 - ELIMINA uno snapshot')
print('\n5 - TORNA al menu principale')
sceltaSH=input('\nScegli la voce del menu desiderata ')
if sceltaSH=='1':
os.system('clear')
os.system('vboxmanage snapshot '+snapVM+' list')
print('\n Questi sono gli snapshot disponibili per la VM '+snapVM)
listaSH=input('\nSe puoi scegliere uno snapshot, copiati il nome per utlilizzarlo in seguito. Ritorna al menu precedente) s/n ')
if listaSH=='s':
z=2
if listaSH=='n':
x=2
z=0
if sceltaSH=='2':
os.system('clear')
print('\nDi seguito l\'elenco delle VM presenti nel sistema')
elencoVM()
takeSH=input('\nInserisci di nuovo il nome della VM di cui fare uno snapshot ')
nameSH=input('\nInserisci il nome da assegnare allo snapshot ')
desSH=input('\nInserisci una descrizione per lo snapshot ')
os.system('vboxmanage snapshot '+takeSH+' take '+nameSH+' --description='+'\"'+desSH+'\"')
exitSH=input('\nOperazione conclusa con successo. Tornare al menu precedente? s/n ')
if exitSH=='s':
z=2
if exitSH=='n':
x=2
z=0
if sceltaSH=='3':
os.system('clear')
print('\nDi seguito l\'elenco delle VN presenti nel sistema')
elencoVM()
namevmSH=input('\nInserisci il nome della VM su cui ripristinare uno snapshot ')
nameripSH=input('\nInserisci il nome dello snapshot da ripristinare ')
closevmSH=input('\nPrima di ripristinare lo snapshot la VM selezionata verrà spenta. Confermi s/n ')
if closevmSH=='n':
x=2
z=0
if closevmSH=='s':
os.system('vboxmanage controlvm '+namevmSH+' poweroff')
os.system('vboxmanage snapshot '+namevmSH+' restore '+nameripSH)
exitSH = input('\nOperazione conclusa con successo. Tornare al menu precedente? s/n ')
if exitSH == 's':
z = 2
if exitSH == 'n':
x=2
z=0
if sceltaSH=='4':
os.system('clear')
print('\nDi seguito l\'elenco delle VM presenti nel sistema')
elencoVM()
namedelSH=input('\nInserisci dinuovo il nome della VM su cui eliminare uno snapshot ')
delSH=input('\nInserisci il nome dello snapshot da CANCELLARE')
os.system('vboxmanage snapshot '+namedelSH+' delete '+delSH)
exitSH = input('\nOperazione conclusa con successo. Tornare al menu precedente? s/n ')
if exitSH == 's':
z = 2
if exitSH == 'n':
x = 2
z = 0
if sceltaSH=='5':
x=2
z=0
if x==0:
exit = input('\nHai scelto di uscire dal programma......')