Cómo configurar hosts virtuales Apache en Ubuntu usando Terraform

Para alojar varios sitios web, los administradores suelen recurrir a la técnica del «alojamiento virtual». El alojamiento virtual aloja varios sitios web en una sola máquina. Se puede conseguir mediante un método «basado en IP» o un enfoque «basado en nombres». En el alojamiento «basado en IP» tenemos direcciones IP distintas para cada sitio web. En el caso del alojamiento «basado en nombres», tenemos varios nombres que se ejecutan en cada dirección IP.

Hoy en día existen muchas herramientas para automatizar la infraestructura basada en la nube. Terraform es una de esas herramientas que recientemente ha ganado una enorme popularidad en el mundo DevOps. Terraform es una herramienta de código abierto desarrollada y mantenida por HashiCorp. Utiliza su propio Lenguaje de Configuración Hashicorp- HCL para aprovisionar a múltiples proveedores de servicios en la nube. Básicamente, Terraform comparará la configuración actual de tu infraestructura con el estado deseado y sólo modificará aquellas partes de la infraestructura que sean necesarias para alcanzar el estado deseado.

¿Qué vamos a cubrir?

En este tutorial, veremos cómo podemos alojar dos hosts virtuales en un sistema Ubuntu 22.04 utilizando Terraform. Utilizaremos el servidor web Apache para realizar este laboratorio.

Comprobación previa al vuelo

Antes de continuar, comprueba los requisitos para realizar esta guía:

  1. Conceptos básicos de Terraform.
  2. Terraform debe estar instalado en tu sistema local.
  3. Cuenta AWS configurada en tu sistema local.
  4. Conceptos básicos de configuración de un host virtual utilizando el servidor web Apache.

Configuración del laboratorio

En nuestro servidor Ubuntu 22.04, procederemos instalando el servidor web Apache, luego configuraremos hosts virtuales con cada uno de ellos con un archivo index.html diferente: «Página Web de: Host Virtual 1.» para vhost1 y «Página Web de: Host Virtual 2.» para vhost2.

Además, para simplificar las cosas, hemos asignado el nombre de dominio de los dos vhosts (hosts virtuales) a la dirección IP del host local (127.0.0.1). Este laboratorio utiliza varios archivos para crear un entorno de trabajo claro. La descripción de los archivos es la siguiente

  1. userdata.sh: Es un script bash que configurará el servidor EC2 y configurará el servidor web para hosts virtuales.
  2. sec-grp.tf: Define un recurso para crear un grupo de seguridad.
  3. vhost-template.tf: El archivo que contiene la configuración real que se utilizará.
  4. main.tf: Aquí se declara el recurso del servidor web y el resto de la infraestructura.

También es posible fusionar varios archivos, pero eso complicará más la revisión del código. Pasemos ahora a los pasos principales:

Paso 1. Empecemos creando un directorio donde colocaremos todos los archivos del proyecto:

$ mkdir virtual-hosts-terraform

Paso 2. Para configurar la instancia EC2 para el alojamiento virtual, utilizaremos un script userdata. Esto también automatizará la configuración común de nuestro servidor:

$ vi userdata.sh
#!/bin/bash

sudo apt-get update

sudo apt-get upgrade -y

sudo apt-get install apache2 -y

sudo systemctl restart apache2

sudo sh -c «echo 127.0.0.1 www.vhost1.com >> /etc/hosts»

sudo sh -c «echo 127.0.0.1 www.vhost2.com >> /etc/hosts»

sudo mkdir -p /var/www/vhost_1/public_html

sudo mkdir -p /var/www/vhost_2/public_html

sudo chown -R $USER:$USER /var/www/vhost_1/public_html

sudo chown -R $USER:$USER /var/www/vhost_2/public_html

sudo chmod -R 755 /var/www

sudo echo «Webpage from: Virtual Host 1.» > /var/www/vhost_1/public_html/index.html

sudo echo «Webpage from: Virtual Host 2.» > /var/www/vhost_2/public_html/index.html

sudo cp /home/ubuntu/vhosts.conf /etc/apache2/sites-available/vhosts.conf

sudo a2ensite vhosts.conf

sudo a2dissite 000-default.conf

sudo systemctl restart apache2

Paso 3. A continuación, configuraremos un recurso de grupo de seguridad para establecer las reglas de tráfico entrante y saliente. Permitiremos el tráfico entrante SSH y HTTP desde todos los lados y el saliente hacia todas partes:

$ vi sec-grp.tf
resource "aws_security_group" "ec2-sg" {

name = «ec2-grp»

description = «Set Ingress and Egress Rules »

ingress {

from_port   = 80

to_port     = 80

protocol    = «tcp»

cidr_blocks = [«0.0.0.0/0»]

}

ingress {

from_port   = 22

to_port     = 22

protocol    = «tcp»

cidr_blocks = [«0.0.0.0/0»]

}

egress {

from_port   = 0

to_port     = 0

protocol    = «-1»

cidr_blocks = [«0.0.0.0/0»]

}

}

Paso 4. Este archivo contiene la configuración real para cada host virtual. La primera sección ‘<HostVirtual>’ contiene la entrada correspondiente a vhost1. Del mismo modo, la segunda corresponde a vhost2vhost2. Aquí puedes añadir más entradas de vhost:

$ vi vhost-template.conf
<VirtualHost *:80>

ServerAdmin [email protected]

ServerName vhost1

ServerAlias www.vhost1.com

DocumentRoot /var/www/vhost_1/public_html

ErrorLog ${APACHE_LOG_DIR}/error.log

</VirtualHost>

<VirtualHost *:80>

ServerAdmin [email protected]

ServerName vhost2

ServerAlias www.vhost2.com

DocumentRoot /var/www/vhost_2/public_html

ErrorLog ${APACHE_LOG_DIR}/error.log

</VirtualHost>

Paso 5. En el archivo main.tf, declara un recurso de servidor web y configura el resto de la infraestructura:

$ vi main.tf
provider "aws" {

region =»us-east-1″

}

resource «aws_instance» «webserver» {

ami =»ami-09d56f8956ab235b3″

instance_type = «t2.micro»

key_name = «Name-of-EC2-Key-Pair»

vpc_security_group_ids = [aws_security_group.demo-sg.id]

associate_public_ip_address = true

 

provisioner «file» {

source      = «vhost-template.conf»

destination = «/home/ubuntu/vhosts.conf»

 

connection {

type        = «ssh»

user        = «ubuntu»

private_key = «${file(«/Path/to/EC2-Key-Pair«)}»

host        = «${self.public_dns}»

}

}

user_data = «${file(«userdata.sh»)}»

 

tags = {

Name = «VirtualHostTutorial»

}

}

 

output «IPAddress» {

value = «${aws_instance.webserver.public_dns}»

}

El aprovisionador de archivos se utiliza para subir el archivo «vhost-template.conf» a la instancia EC2. El bloque de salida imprime el nombre dns público de la instancia. Del mismo modo, el comando ‘file’ ejecuta el script userdata.

Estructura de archivos

Paso 6. Ahora inicializa el directorio del proyecto con el comando «init» seguido del comando «apply»:

$ terraform init
$ terraform apply

Inicializar el directorio del proyecto

Aplicar la configuración de Terraform

Configuración completada con éxito

Probar la configuración

Ahora accede mediante SSH a tu instancia y ejecuta el comando:

$ curl www.vhost1.com

El comando anterior debería devolver el mensaje de la página de índice del host virtual1, del mismo modo, el comando siguiente debería mostrar el mensaje del host virtual2:

$ curl www.vhost2.com

Probar la configuración

Conclusión

Por fin lo hemos conseguido, nuestro alojamiento virtual funciona como esperábamos. También podemos realizar este tutorial utilizando Terraform, simplemente pruébalo.

También te podría gustar...