Come configurare gli host virtuali Apache su Ubuntu utilizzando Terraform
Su questa pagina
- Di cosa parleremo?
- Controllo pre-volo
- Impostazione del laboratorio
- Testare l'installazione
- Conclusione
Per l'hosting di più siti Web, gli amministratori si affidano comunemente alla tecnica dell'hosting virtuale. L'hosting virtuale ospita più siti Web utilizzando una singola macchina. Può essere raggiunto con un metodo basato su IP o un approccio basato sul nome. Nell'hosting basato su IP abbiamo indirizzi IP distinti per ogni sito web. In caso di hosting basato sul nome, abbiamo più nomi in esecuzione su ciascun indirizzo IP.
Oggi sono disponibili molti strumenti per automatizzare l'infrastruttura basata su cloud. Terraform è uno di questi strumenti che ha recentemente guadagnato un'enorme popolarità nel mondo DevOps. Terraform è uno strumento open source sviluppato e gestito da HashiCorp. Utilizza il proprio linguaggio di configurazione Hashicorp - HCL per fornire più fornitori di servizi cloud. Fondamentalmente, Terraform confronterà la tua attuale configurazione dell'infrastruttura con lo stato desiderato e modificherà solo quelle parti dell'infrastruttura necessarie per raggiungere lo stato desiderato.
Cosa copriremo?
In questo tutorial vedremo come possiamo ospitare due host virtuali su un sistema Ubuntu 22.04 utilizzando Terraform. Useremo il web server Apache per eseguire questo lab.
Controllo pre-volo
Prima di procedere oltre, verifica i requisiti per l'esecuzione di questa guida:
- Nozioni di base di Terraform.
- Terraform dovrebbe essere installato sul tuo sistema locale.
- Account AWS configurato sul tuo sistema locale.
- Nozioni di base sulla configurazione di un host virtuale utilizzando il server Web Apache.
Allestimento del laboratorio
Sul nostro server Ubuntu 22.04, procederemo con l'installazione del server web Apache, quindi configureremo gli host virtuali con ciascuno con un diverso file index.html: \Webpage from: Virtual Host 1.\ per vhost1 e \Webpage from: Host virtuale 2.\ per vhost2.
Inoltre, per semplificare le cose, abbiamo mappato il nome di dominio per i due vhost (host virtuali) all'indirizzo IP dell'host locale (127.0.0.1). Questo laboratorio utilizza più file per creare un ambiente di lavoro chiaro. La descrizione dei file è come:
- userdata.sh: è uno script bash che imposterà il server EC2 e configurerà il server Web per gli host virtuali.
- sec-grp.tf: definisce una risorsa per la creazione di un gruppo di sicurezza.
- vhost-template.tf: il file contenente la configurazione effettiva da utilizzare.
- main.tf: qui vengono dichiarate la risorsa del server Web e il resto dell'infrastruttura.
È anche possibile unire più file, ma ciò causerà maggiori complicazioni nella revisione del codice. Passiamo ora ai passaggi principali:
Passaggio 1. Iniziamo con la creazione di una directory in cui posizioneremo tutti i file di progetto:
$ mkdir virtual-hosts-terraform
Passaggio 2. Per configurare l'istanza EC2 per l'hosting virtuale, utilizzeremo uno script userdata. Questo automatizzerà anche la nostra configurazione del server comune:
$ 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
Passaggio 3. Successivamente, configureremo una risorsa del gruppo di sicurezza per impostare le regole del traffico in entrata e in uscita. Consenti il traffico in entrata SSH e HTTP da tutti i lati e l'uscita (in uscita) ovunque:
$ 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"]
}
}
Passaggio 4. Questo file contiene la configurazione effettiva per ciascun host virtuale. La prima sezione
$ vi vhost-template.conf
<VirtualHost *:80>
ServerAdmin
ServerName vhost2
ServerAlias www.vhost2.com
DocumentRoot /var/www/vhost_2/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
</VirtualHost>
Passaggio 5. Nel file main.tf, dichiarare una risorsa del server Web e impostare il resto dell'infrastruttura:
$ 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}"
}
Il file provisioner viene utilizzato per caricare il file vhost-template.conf nell'istanza EC2. Il blocco di output stampa il nome DNS pubblico dell'istanza. Allo stesso modo, il comando file esegue lo script userdata.
Passo 6. Ora inizializza la directory del progetto con il comando init seguito dal comando apply:
$ terraform init
$ terraform apply
Testare l'installazione
Ora SSH alla tua istanza ed esegui il comando:
$ curl www.vhost1.com
Il comando precedente dovrebbe restituire il messaggio dalla pagina indice dell'host virtuale1, allo stesso modo il comando seguente dovrebbe visualizzare il messaggio dall'host virtuale2:
$ curl www.vhost2.com
Conclusione
Finalmente ce l'abbiamo fatta, il nostro hosting virtuale funziona come previsto. Possiamo anche eseguire questo tutorial utilizzando Terraform, basta provarlo.