Escenario Vagrant 1C: Cluster Web - Base de datos
Introdución
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.
Vagrantfile e provisioner
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.
#!/bin/bash
# Configurar caché de paquetes para acelerar instalación
#echo "-----------------"
#echo "Añadiendo apt-cacher"
#echo "Acquire::http { Proxy \"http://dir_IP_cache:puerto_cache\";};" > /etc/apt/apt.conf.d/01apt-cacher-ng
echo "-----------------"
echo "Actualizando repositorios y equipo"
apt update
apt full-upgrade -y
echo "-----------------"
echo "Instalando apache-php-mysql"
apt install net-tools apache2 php libapache2-mod-php php-common php-mbstring php-xmlrpc php-soap php-gd php-xml php-intl php-mysql php-cli php-zip php-curl mysql-client -y
echo "-----------------"
echo "Habilitando SSL"
a2enmod ssl
a2ensite default-ssl.conf
echo "-----------------"
echo "Creando index.php"
cat > /var/www/html/index.php << 'EOF'
<?php
echo "
<html>
<head>
<title>Sitio web en ${_SERVER["SERVER_ADDR"]}</title>
</head>
<body>
<h1>Mi Sitio Web</h1>
Estás en ${_SERVER["SERVER_ADDR"]}
</body>
</html>";
?>
EOF
echo "-----------------"
echo "Creando info.php"
cat > /var/www/html/info.php << 'EOF'
<?php
phpinfo();
?>
EOF
echo "-----------------"
echo "Borrando index.html"
rm /var/www/html/index.html
echo "-----------------"
echo "Preparando adminer.php"
wget -O /var/www/html/adminer.php https://www.adminer.org/latest.php
echo "-----------------"
echo "Reiniciando apache"
systemctl restart apache2.service
echo "------ FIN ------"
- 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.
#!/usr/bin/env bash
echo "-----------------"
## Configurar caché de paquetes para acelerar isntalación
#echo "-----------------"
#echo "Añadiendo apt-cacher"
#echo "Acquire::http { Proxy \"http://dir_IP_cache:puerto_cache\";};" > /etc/apt/apt.conf.d/01apt-cacher-ng
echo "Actualizando repositorios y equipo"
apt update
#apt full-upgrade -y
echo "-----------------"
echo "Instalando mysql"
echo "mysql-server mysql-server/root_password password Abc123.." | debconf-set-selections
echo "mysql-server mysql-server/root_password_again password Abc123.." | debconf-set-selections
apt install net-tools mysql-client mysql-server -y
echo "[mysqld]" >> /etc/mysql/my.cnf
echo "bind-address = 0.0.0.0" >> /etc/mysql/my.cnf
systemctl restart mysql.service
echo "------------------"
echo "Creando base datos"
mysql -uroot -pAbc123.. -h localhost -e "CREATE DATABASE wordpress;"
mysql -uroot -pAbc123.. -h localhost -e "CREATE USER 'wordpress'@'192.168.56.121' IDENTIFIED BY 'Abc123..';"
mysql -uroot -pAbc123.. -h localhost -e "GRANT ALL ON wordpress.* TO 'wordpress'@'192.168.56.121';"
echo "------ FIN ------"