Si queremos levantar máquinas virtuales en un entorno Linux KVM que no disponga de entorno gráfico podemos levantar máquinas virtuales desde linea de comando usando una plantilla XML.
Este artículo explica como funciona internamente el despliegue que se realiza con Ansible-libvirt en https://www.disasterproject.com/index.php/2019/06/entorno-minimo-kvm-y-ansible/
Instalar Qemu-KVM y Libvirt
Primero debemos tener instalado libvirt y Qemu-KVM que en Ubuntu/Debian se instala con:
$ sudo apt-get install -y libvirt-daemon-system python-libvirt python-lxml
Y en CentOS/Redhat con:
$ sudo yum install -y libvirt-daemon-kvm python-lxml
Para iniciar el servicio haremos $ sudo systemctl enable libvirtd && sudo systemctl start libvirtd
Configurar una plantilla de red
Libvirt nos provee de una poderosa herramienta para gestión de las máquinas virtuales llamada ‘virsh’, la cual debemos de utilizar para poder gestionar las máquinas virtuales KVM desde la linea de comandos.
Para una máquina virtual necesitamos principalmente tres elementos, el primero es una configuración de red que entre otras cosas provea a las máquinas virtuales de IP vía DHCP. Para ello libvirt necesita de una plantilla XML como la siguiente (que llamaremos net.xml):
<network<nameNOMBRE_DE_RED</name<forward mode='nat'<nat<port start='1' end='65535'/</nat</forward<bridge name='NOMBRE_DEL_BRIDGE' stp='on' delay='0'/<ip address='IP_HOST' netmask='MASCARA_RED'<dhcp<range start='INICIO_RANGO_DHCP' end='FIN_RANGO_DHCP'/</dhcp</ip</network
Cuyos elementos principales son:
- NOMBRE_DE RED: Nombre descriptivo que vamos a dar a la red, por ejemplo red_pruebas o red_producción.
- NOMBRE_DEL_BRIDGE: Cada red crea una interfaz en el servidor anfitrión que servirá para dar salida y entrada a los paquetes de dicha red hacia el exterior. Aquí le asignamos un nombre descriptivo que nos permita identificar el interfaz.
- IP_HOST: La IP que dicho interfaz tendrá en el servidor anfitrión y que será la puerta de enlace de las máquinas virtuales
- MASCARA_RED: Depende de la red, habitualmente para pruebas y demos siempre una clase C (255.255.255.0)
- INICIO_RANGO_DHCP: Para asignar IPs a las máquinas virtuales libvirt usa un servidor DHCP interno (basado en dnsmasq), aquí definimos la primera IP que podemos servir a las máquinas virtuales.