From be88a70d70f3429a60e5a5fc8b4d317d234f0b0c Mon Sep 17 00:00:00 2001
From: "Glenn Y. Rolland" <glenux@glenux.net>
Date: Mon, 30 May 2022 21:35:15 +0200
Subject: [PATCH] Add Vagrantfile

---
 Vagrantfile | 107 ++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 79 insertions(+), 28 deletions(-)

diff --git a/Vagrantfile b/Vagrantfile
index e702821..cbe1be0 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -3,50 +3,101 @@
 
 # frozen_string_literal: true
 
-SERVERS_COUNT=3
+# Setup & rules
+class Infra
+  GROUPS_COUNT = 1
+  REPLICAS_COUNT = 2
 
+  ## Utilities
+  def self.gateway_name(index)
+    "dev-gateway#{index}"
+  end
+
+  def self.mongo_name(index)
+    "dev-server#{index}"
+  end
+
+  def self.gateway_ip(index)
+    "192.168.50.#{250 - index * 5}"
+  end
+
+  def self.server_ip(index)
+    "192.168.50.#{5 + index * 5}"
+  end
+
+  def self.role_mongo
+    Infra::REPLICAS_COUNT.times.map { |i| mongo_name(i) }
+  end
+
+  def self.role_gateway
+    Infra::GROUPS_COUNT.times.map { |i| gateway_name(i) }
+  end
+end
+
+##
+## Vagrant configuration
+##
+
+# rubocop:disable Metrics/BlockLength
 Vagrant.configure('2') do |config|
-  # Common settings for virtual machines
+  ##
+  ## Common settings for virtual machines
+  ##
   config.vm.box = 'debian/bullseye64'
   config.vm.box_check_update = false
 
   ##
-  ## gateway: Guacamole proxy + entrypoint
+  ## Web frontends
   ##
-  config.vm.define 'gateway' do |machine|
-    machine.vm.hostname = 'gateway'
-    machine.vm.network 'private_network', ip: '192.168.50.250'
-    machine.vm.network 'forwarded_port', guest: 80, host: 1080
-    machine.vm.network 'forwarded_port', guest: 8080, host: 8080
-    machine.vm.provider 'virtualbox' do |vb|
-      vb.memory = '4000'
-      vb.gui = false
+  Infra::GROUPS_COUNT.times do |index|
+    config.vm.define Infra.gateway_name(index) do |machine|
+      machine.vm.hostname = Infra.gateway_name(index)
+      machine.vm.network 'private_network', ip: Infra.gateway_ip(index)
+      machine.vm.provider 'virtualbox' do |vb|
+        vb.memory = '4000'
+        vb.gui = false
+      end
+
+      next if index.positive? # strictly positive (not null)
+
+      # machine.vm.network 'forwarded_port', guest: 80, host: 1080
+      # machine.vm.network 'forwarded_port', guest: 8080, host: 8080
     end
   end
 
   ##
-  ## serverX : host servers with mongo, etc
+  ## Mongo servers
   ##
-  server_ip = ->(index) { "192.168.50.#{10 + index * 10}" }
-  SERVERS_COUNT.times do |index|
-    config.vm.define "server#{index}" do |machine|
-      machine.vm.hostname = "server#{index}"
-      machine.vm.network 'private_network', ip: server_ip.call(index)
+  (Infra::GROUPS_COUNT * Infra::REPLICAS_COUNT).times do |index|
+    config.vm.define Infra.mongo_name(index) do |machine|
+      machine.vm.hostname = Infra.mongo_name(index)
+      machine.vm.network 'private_network', ip: Infra.server_ip(index)
       machine.vm.provider 'virtualbox' do |vb|
         vb.memory = '3000'
         vb.gui = false
       end
+
+      next if (index + 1) < (Infra::GROUPS_COUNT * Infra::REPLICAS_COUNT)
+
+      machine.vm.provision 'ansible' do |ansible|
+        # ansible.verbose = true
+        ansible.playbook = 'ansible/playbook.yml'
+        ansible.config_file = 'ansible/ansible.cfg'
+        ansible.limit = 'all'
+        ansible.groups = {
+          'role_gateway' => Infra.role_gateway,
+          'role_mongo' => Infra.role_mongo,
+          'stage_development' => [Infra.role_mongo, Infra.role_gateway].flatten,
+          'stage_production' => [],
+          'stage_testing' => [],
+          'all_groups:children' => %w[role_gateway role_mongo],
+          'all:vars' => {
+            'mongo_groups_count' => Infra::GROUPS_COUNT,
+            'mongo_replicas_count' => Infra::REPLICAS_COUNT
+          }
+        }
+      end
     end
   end
-
-  config.vm.provision 'ansible' do |ansible|
-    ansible.playbook = 'ansible/playbook.yml'
-    # ansible.verbose = true
-    ansible.config_file = 'ansible/ansible.cfg'
-    ansible.groups = {
-      'app_sshwifty' => ['gateway'],
-      'app_mongo' => SERVERS_COUNT.times.map { |i| "server#{i}" },
-      'all_groups:children' => ['app_mongo']
-    }
-  end
 end
+# rubocop:enable Metrics/BlockLength