# Create multiple virtual machines with Vagrant on Linux
# Author: Pekka Helenius (~Fincer), 2018

#######################################
# Basic Vagrantfile configuration

# Number of virtual machines
vbox_num = 2

# Virtual machine name prefix
vbox_prefix = "minion_"

# Allocated memory per virtual machine
# NOTE: Remember the RAM limits of your host machine!
vbox_mem = 512

# CPU's per virtual machine
vbox_cpu = 1

# Vagrant box template for virtual machines
#
# If you change this, remember to check for salt file locations &
# package manager commands used in this Vagrantfile
#
# For more templates, see: https://app.vagrantup.com/boxes/search
vbox_template = "bento/ubuntu-16.04"

#######################################
# Create a new array for virtual machines

vboxes = []

(1..vbox_num).each do |vbox|
  vboxes.push("#{vbox_prefix}#{vbox}")
end

#######################################
VAGRANT_API_VERSION = 2

#######################################
# This is for salt_install provision below

initial_setup = "
# Start of $initial_setup variable

apt-get update && \
apt-get -y install salt-minion && \
systemctl enable salt-minion

  if [ $? -ne 0 ]; then
    exit 1
  fi

# End of $initial_setup variable
"

#######################################
# Define Vagrant machine configuration here

Vagrant.configure(VAGRANT_API_VERSION) do |config|

  config.vm.box = "#{vbox_template}"
  config.vm.box_check_update = true
  config.vm.synced_folder ".", "/vagrant", disabled: true

  vboxes.each do |box|
    config.vm.define "#{box}" do |node|

      node.vm.provision "salt_install", run: "once", type: "shell" do |cmd_1|
        cmd_1.inline = "#{initial_setup}"
        cmd_1.privileged = "true"
      end

      node.vm.provision "salt_config", run: "once", type: "shell" do |cmd_2|
        cmd_2.inline = "echo 'master: #{`hostname`}id: #{box}' | tee -a /etc/salt/minion && systemctl restart salt-minion"
        cmd_2.privileged = "true"
      end

      node.vm.provider "virtualbox" do |v|
        v.memory = "#{vbox_mem}"
        v.cpus = "#{vbox_cpu}"
        v.name = "#{box}"
      end

    end
  end
end
