Escenario Vagrant 1C: Cluster Web - Base de datos
Escenario
Nesta ocasión imos ver como Vagrant pode usarse para levantar rápidamente infraestruturas máis complexas, o que é ideal para prácticas en clase polo aforro de tempo. Crearemos unha infraestrutura con dúas máquinas virtuais, unha que actuará como servidor web e outra como servidor de base de datos cos seguintes requisitos:
- Os servidores web01 e mysql01 poderán comunicarse entre si e terán comunicación directa con equipo anfitrión.
- O servizo web http/https que corre en web01 será accesible dende calquera equipo vía a dirección IP do equipo anfitrión; en cambio, o servizo de base de datos que corre en mysql01 non.
Polo tanto, no Vagrantfile haberá que:
- Definir as dúas máquinas virtuais.
- Meter os servidores nunha rede só-anfitrión para garantir as comunicacións directas entre elas e o anfitrión.
- Definir unha redirección de portos para facer accesible o servizo web http/https que corre en web01.
- Facer o aprovisionamento para instalar en web01 un servidor Apache con php e en mysql01 un servidor de base de datos Mariadb/MySQL que permita conexións dende web01.
A
Creamos unha carpeta para o novo proxecto e editamos o Vagrantfile:
~/Vagrant$ mkdir web_db ~/Vagrant$ cd web_db/ ~/Vagrant/web_db$ vagrant init --minimal ~/Vagrant/web_db$ mkdir www ~/Vagrant/web_db$ nano Vagrantfile
Vagrant.configure("2") do |config|
## config.vm.box = "bento/ubuntu-22.04"
# WEB
config.vm.define "web01" do |web01|
web01.vm.box = "bento/ubuntu-22.04"
web01.vm.hostname = "web01"
web01.vm.network "private_network", ip: "192.168.56.121", netmask: "255.255.255.0"
web01.vm.network "forwarded_port", guest: 80, host: 8080
web01.vm.network "forwarded_port", guest: 443, host: 4430
web01.vm.synced_folder "./www", "/var/www/html", owner: "root", group: "root", mount_options: ["dmode=755,fmode=644"]
web01.vm.provision "shell", path: "apache.sh"
web01.vm.provider "virtualbox" do |vb|
vb.name = "web01"
vb.memory = "1024"
vb.cpus = 1
vb.linked_clone = true
vb.customize ["modifyvm", :id, "--groups", "/Cluster"]
end
end
# DB
config.vm.define "mysql01" do |mysql01|
mysql01.vm.box = "bento/ubuntu-22.04"
mysql01.vm.hostname = "mysql01"
mysql01.vm.network "private_network", ip: "192.168.56.122", netmask: "255.255.255.0"
mysql01.vm.provision "shell", path: "mysql.sh"
mysql01.vm.provider "virtualbox" do |vb|
vb.name = "mysql01"
vb.memory = "1024"
vb.cpus = 2
vb.linked_clone = true
vb.customize ["modifyvm", :id, "--groups", "/Cluster"]
end
end
end
Analizando o Vagrantfile vemos que:
- Hai dúas seccións onde se definen as características particulares das máquinas da infraestrutura:
- config.vm.define "web01" do |web01|
- usada para definir o servidor web.
- config.vm.define "mysql01" do |mysql01|
- usada para definir o servidor de base de datos.
- No caso de usar a mesma imaxe para todas as máquinas, pódese colocar unha directiva config.vm.box = "bento/ubuntu-22.04" fóra das seccións de web01 e mysql01 polo que se aplica a todas as máquinas. Neste caso ambos servidores correrán un Ubuntu 22.04 creado a partir do box bento/ubuntu-22.04.
- Neste tipo de escenarios con varias máquinas, é posible usar box diferentes indicándoo na sección correspondente (web01.vm.box e mysql01.vm.box).
- Os dous servidores, ademais da interfaz en modo NAT que por defecto crea Vagrant, están conectados á rede só-anfitrión 192.168.56.0/24.
- Mediante as directivas web01.vm.network "forwarded_port" faise accesible o servicio http/https a través dos portos 8080/tcp e 4430/tcp do anfitrión.
- vb.customize ["modifyvm", :id, "--groups", "/Cluster"]
- permite agrupar as máquinas virtuais desta infraestrutura nun grupo chamado Cluster, visible na interfaz de Virtualbox. A través de customize podemos chamar á utilidade de configuracion VBoxManage de Virtualbox. Se temos aberta a xanela de Virtualbox antes de lanzar o vagrant up as máquinas aparecerán sen estar agrupadas; sen embargo, a próxima vez de que abra Virtualbox as máquinas xa aparecerán agrupadas.
- O script apache.sh encárgase da instalación do servidor web Apache, php, da creación dun index.php, info.php e descargar adminer.php para administrar vía web a base de datos.
- O script mysql.sh encárgase da instalación do servidor MySQL e de crear a modo de exemplo unha base de datos de nome wordpress e autorizar a un usuario chamado wordpress o control desta base de datos dende o equipo web01.