diff --git a/README.md b/README.md index c7e8ba0..f32b4b3 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,24 @@ -# sd-workshop2 2022-1 +# sd-workshop2 2023-1 sd workshop2 -- Completar la lógica de la applicación de pagos de tal manera que al hacer un pago através del microservicio de pagos, el monto de las facturas sea correctamente debitado, es decir, actualmente si una factura debe 1000 y yo hago un pago por 400 a esa factura, el microservicio invoice me sobreescribe el 1000 por 400 en vez de mostrarme el saldo restante 1000-400=600. -- Completar la lógica de la aplicación de tal manera que haya 3 estados para las facturas. 0=debe 1=pagadoparcialmente 2=pagado -- Hacer que las applicaciones se puedan registrar con consul -- Debe ser un pull request a este repositorio sd-workshop2 +Montar un Sistema de Archivos Distribuido con Glusterfs entre 3 máquinas y automatizar su configuración a través del Vagrantfile, para que quede listo con tan solo hacer vagrat up. -Bonus: -- Subir las imagenes de la app a Docker hub -- Crear un script en bash que lance toda la aplicación. +# Entrega Juan Fernando Angulo +El montaje funciona de la siguien manera: +1. En el Vagranfile se definen 3 maquinas, cada una con un disco adjunto, y de las cuales una de ellas (maser) será dónde se cree el volumen compartido con las otras dos maquinas (node1 y node2). +2. Para hacer las configuraciones extras para que funcione el Sistema de Archivos Distribuido, se definieron las instrucciones necesarias a ejecutar en cada máquina dentro de un script de bash externo llamado post-provisioning.sh que se encuentra ubicado en la carpeta de scripts. +3. Puesto que estas configuraciones extras se deben ejecutar una vez que las tres máquinas han sido creadas y esten corriendo, para asegurar esto utilicé un trigger en el Vagrantfile que ejecuta el script post-provisioning.sh después de provisionar cada máquina, y dentro del script a través de un condicional, me aseguro de ejecutar el resto de instrucciones solo cuando las tres máquinas están corriendo. +![Trigger](https://github.com/Juanferas/sd-workshop2/blob/master/screenshots/Script_trigger.PNG "Trigger") +4. Para la ejecucción de las instrucciones, envío los comandos a cada máquina a través de ssh, proporcionando la llave privada de cada máquina para que me deje conectar. +![post-provisioning.sh](https://github.com/Juanferas/sd-workshop2/blob/master/screenshots/post-provisioning_script.png "post-provisioning.sh") +5. Y listo, el Sistema de Archivos Distribuido con Glusterfs ya se encuentra configurado para las trés máquinas y montado en la ruta /mnt. + +## Evidencias +A continuación se adjuntan evidencias del funcionamiento durante la ejecución del comando vagrant up y posterior a este: +- Al inicio las máquinas no se han creado y se ejecuta vagrant up. +![Estado inicial](https://github.com/Juanferas/sd-workshop2/blob/master/screenshots/Initial_status.png "Estado incial") +- Al final de la ejecución del vagrant up, justo después de terminar de provisionar la última máquina, se observa que se inicia la ejecución del post-provisioning.sh script y se ve el resultado de cada comando a través de la consola, para al final indicar que el montaje ha terminado exitosamente. +![Montaje exitoso](https://github.com/Juanferas/sd-workshop2/blob/master/screenshots/Glusterfs_mounted.png "Montaje exitoso") +- Para probar que el montaje efectivamente fue exitoso, entramos a la máquina master, revisamos que el punto de montaje se encuentra vacío y creamos unos cuantos archivos de prueba en él, revisamos que se crearon, entramos a las otras dos máquinas y revisamos también. +![Prueba funcionamiento](https://github.com/Juanferas/sd-workshop2/blob/master/screenshots/Working_test.png "Prueba funcionamiento") +Como se comprobó, el montaje se hizo correctamente y el Sistema de Archivos Distribuido funciona. diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..d03d351 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,59 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +firstDisk = "./firstDirk.vdi" +secondDisk = "./secondDirk.vdi" +thirdDisk = "./thirdDirk.vdi" + +Vagrant.configure("2") do |config| + + config.vm.define "node1" do |node1| + node1.vm.box = "centos/7" + node1.vm.hostname = "node-1" + node1.vm.network "private_network", ip: "192.168.56.12" + node1.vm.provider "virtualbox" do |vb| + vb.customize ["modifyvm", :id, "--memory", "512", "--cpus", "1", "--name", "node-1"] + unless File.exist?(secondDisk) + vb.customize ['createhd', '--filename', secondDisk, '--variant', 'Fixed', '--size', 5 * 1024] + end + vb.customize ['storageattach', :id, '--storagectl', 'IDE', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', secondDisk] + end + node1.vm.provision "shell", path: "scripts/glusterfs.sh" + node1.vm.provision "shell", path: "scripts/configuration.sh" + end + + config.vm.define "node2" do |node2| + node2.vm.box = "centos/7" + node2.vm.hostname = "node-2" + node2.vm.network "private_network", ip: "192.168.56.13" + node2.vm.provider "virtualbox" do |vb| + vb.customize ["modifyvm", :id, "--memory", "512", "--cpus", "1", "--name", "node-2"] + unless File.exist?(thirdDisk) + vb.customize ['createhd', '--filename', thirdDisk, '--variant', 'Fixed', '--size', 5 * 1024] + end + vb.customize ['storageattach', :id, '--storagectl', 'IDE', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', thirdDisk] + end + node2.vm.provision "shell", path: "scripts/glusterfs.sh" + node2.vm.provision "shell", path: "scripts/configuration.sh" + end + + config.vm.define "master" do |server| + server.vm.box = "centos/7" + server.vm.network "private_network", ip: "192.168.56.11" + server.vm.provider "virtualbox" do |vb| + vb.customize ["modifyvm", :id, "--memory", "512", "--cpus", "1", "--name", "master-node"] + unless File.exist?(firstDisk) + vb.customize ["createhd", "--filename", firstDisk, "--variant", "Fixed", "--size", 5*1024] + end + vb.customize ["storageattach", :id, "--storagectl", "IDE", "--port", 1, "--device", 0, "--type", "hdd", '--medium', firstDisk] + end + server.vm.provision "shell", path: "scripts/glusterfs.sh" + server.vm.provision "shell", path: "scripts/configuration.sh" + end + + # Ejecución de script de post-provisionamiento + config.trigger.after :up do |trigger| + trigger.run = {path: "scripts/post-provisioning.sh"} + end + +end diff --git a/screenshots/Glusterfs_mounted.png b/screenshots/Glusterfs_mounted.png new file mode 100644 index 0000000..9783405 Binary files /dev/null and b/screenshots/Glusterfs_mounted.png differ diff --git a/screenshots/Initial_status.png b/screenshots/Initial_status.png new file mode 100644 index 0000000..c17f705 Binary files /dev/null and b/screenshots/Initial_status.png differ diff --git a/screenshots/Script_trigger.PNG b/screenshots/Script_trigger.PNG new file mode 100644 index 0000000..b44f892 Binary files /dev/null and b/screenshots/Script_trigger.PNG differ diff --git a/screenshots/Working_test.png b/screenshots/Working_test.png new file mode 100644 index 0000000..1244e9b Binary files /dev/null and b/screenshots/Working_test.png differ diff --git a/screenshots/post-provisioning_script.png b/screenshots/post-provisioning_script.png new file mode 100644 index 0000000..6f5280f Binary files /dev/null and b/screenshots/post-provisioning_script.png differ diff --git a/scripts/configuration.sh b/scripts/configuration.sh new file mode 100644 index 0000000..5dbf2f3 --- /dev/null +++ b/scripts/configuration.sh @@ -0,0 +1,3 @@ +echo "192.168.56.11 master" >> /etc/hosts +echo "192.168.56.12 node1" >> /etc/hosts +echo "192.168.56.13 node2" >> /etc/hosts diff --git a/scripts/glusterfs.sh b/scripts/glusterfs.sh new file mode 100644 index 0000000..52a0f84 --- /dev/null +++ b/scripts/glusterfs.sh @@ -0,0 +1,13 @@ +yum install -y centos-release-gluster +yum install -y glusterfs-server +yum install -y xfsprogs + +service glusterd start + +sfdisk /dev/sdb << EOF +; +EOF + +mkfs.xfs /dev/sdb1 +mkdir -p /gluster/data +mount /dev/sdb1 /gluster/data/ diff --git a/scripts/post-provisioning.sh b/scripts/post-provisioning.sh new file mode 100644 index 0000000..9814933 --- /dev/null +++ b/scripts/post-provisioning.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ $(vagrant status | grep "not created" | wc -l) -ge 1 ] +then + echo "[!] Aún no están corriendo ni han sido provisionadas todas la maquinas" +else + echo -e "[+] Todas las maquinas han sido provisionadas y están corriendo\n\nEjecutando configuraciones extras para el Sistema de Archivos Distribuido..." + # Extraer las llaves privadas para realizar la conexión SSH + master_private_key=$(vagrant ssh-config master | grep "IdentityFile" | sed 's/IdentityFile//' | xargs) + node1_private_key=$(echo $master_private_key | sed "s/master/node1/") + node2_private_key=$(echo $master_private_key | sed "s/master/node2/") + # Ejecutar los scripts de post-provisioning en cada máquina a través de SSH + ssh -i "$master_private_key" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -y vagrant@192.168.56.11 "sudo gluster peer probe node1; sudo gluster peer probe node2; sudo gluster pool list; sudo gluster volume create gv0 replica 3 master:/gluster/data/gv0 node1:/gluster/data/gv0 node2:/gluster/data/gv0; sudo gluster volume start gv0; sudo gluster volume status; sudo mount.glusterfs master:/gv0 /mnt" + ssh -i "$node1_private_key" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -y vagrant@192.168.56.12 "sudo mount.glusterfs localhost:/gv0 /mnt" + ssh -i "$node2_private_key" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -y vagrant@192.168.56.13 "sudo mount.glusterfs localhost:/gv0 /mnt" + echo -e "[+] Script de post-provisionamiento ejecutado correctamente :)\n\nEl punto de montaje es /mnt" +fi