openaustralia/publicwhip

View on GitHub
Vagrantfile

Summary

Maintainability
Test Coverage
# frozen_string_literal: true

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.require_version ">= 2.2.0"

vm_hostname = "local-publicwhip.example.com"

Vagrant.configure("2") do |config|
  # provider-specific config
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 2048 # in MB
    vb.cpus = 2
    vb.linked_clone = false
    vb.name = vm_hostname
  end

  config.vm.hostname = vm_hostname
  config.vm.box_check_update = true

  # Use most recent Ubuntu LTS
  config.vm.box = "generic/ubuntu2004"

  # guest VM directories
  work_base_dir = "/opt"
  work_source_dir = "#{work_base_dir}/source"
  ansible_venv_dir = "#{work_base_dir}/ansible-venv"

  # synchronised directory
  rsync_exclude = %w[.vagrant/ .vscode/ .idea/]
  config.vm.synced_folder "./", work_source_dir, type: "rsync", rsync__exclude: rsync_exclude, group: "vagrant", owner: "vagrant", create: true

  # Set this to a local ubuntu mirror to speed up the apt package installations.
  # Find your local mirrors here: https://launchpad.net/ubuntu/+archivemirrors
  old_apt_url = "http://us.archive.ubuntu.com/ubuntu"
  new_apt_url = "https://mirror.internet.asn.au/pub/ubuntu/archive"
  ubuntu_release = "focal"

  # install ansible
  config.vm.provision "install_ansible", type: "shell", inline: <<-SHELL
    # vagrant might require a /vagrant directory
    if [[ ! -d "/vagrant" ]]; then
      sudo mkdir -p /vagrant
      sudo chown vagrant:vagrant /vagrant
    fi

    # always update apt packages
    sudo DEBIAN_FRONTEND=noninteractive apt-get -yq update

    # ensure ca-certificates is up to date so that https connections will work
    sudo DEBIAN_FRONTEND=noninteractive apt-get -yq install ca-certificates

    # update apt source to a local mirror to speed up the first apt update
    if [[ -f /etc/apt/sources.list && $(grep "#{old_apt_url}" /etc/apt/sources.list) ]]; then
      sudo sed -i 's;#{old_apt_url};#{new_apt_url};g' '/etc/apt/sources.list'
      sudo DEBIAN_FRONTEND=noninteractive apt-get -yq update
    fi
    if [[ -f /etc/apt/sources.list.save && $(grep "#{old_apt_url}" /etc/apt/sources.list.save) ]]; then
      sudo sed -i 's;#{old_apt_url};#{new_apt_url};g' '/etc/apt/sources.list.save'
    fi

    # provide Python 3.9
    if [ ! -f "/etc/apt/sources.list.d/deadsnakes-ubuntu-ppa-#{ubuntu_release}.list" ]; then
      sudo DEBIAN_FRONTEND=noninteractive apt-get -yq upgrade
      sudo DEBIAN_FRONTEND=noninteractive apt-get -yq install software-properties-common python3-apt python-apt-common python3-packaging apt-transport-https
      sudo DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:deadsnakes/ppa
    fi

    # create a Python virtual env for ansible
    if [ ! -d "#{ansible_venv_dir}" ]; then
      sudo DEBIAN_FRONTEND=noninteractive apt-get -yq update
      sudo DEBIAN_FRONTEND=noninteractive apt-get -yq upgrade
      sudo DEBIAN_FRONTEND=noninteractive apt-get -yq install python3.9 python3.9-dev python3.9-venv python3.9-distutils
      sudo DEBIAN_FRONTEND=noninteractive apt-get -yq install libxml2-dev libxslt-dev zlib1g-dev libffi-dev
      sudo python3.9 -m venv #{ansible_venv_dir}
      sudo chown -R vagrant:vagrant #{ansible_venv_dir}
    fi

    sudo DEBIAN_FRONTEND=noninteractive apt-get -yq upgrade
    sudo DEBIAN_FRONTEND=noninteractive apt-get -yq autoremove
    sudo DEBIAN_FRONTEND=noninteractive apt-get -yq autoclean

    #{ansible_venv_dir}/bin/python -m pip install -U pip
    #{ansible_venv_dir}/bin/pip install -U setuptools wheel
    #{ansible_venv_dir}/bin/pip install -U lxml
    #{ansible_venv_dir}/bin/pip install -U ansible

    #{ansible_venv_dir}/bin/ansible-galaxy collection install --upgrade community.general
  SHELL

  # port specifications
  port_mysql = 3306
  port_adminer = 8888
  port_elasticsearch_http = 9200
  port_elasticsearch_nodes = 9300
  port_dejavu = 1358
  port_http_rails = 3000
  port_http_mail = 1080
  port_http_reload = 35729

  # run ansible
  config.vm.provision "run_ansible", type: "ansible_local" do |ans|
    ans.compatibility_mode = "2.0"
    ans.verbose = false
    ans.install = false
    ans.playbook_command = "#{ansible_venv_dir}/bin/ansible-playbook"
    ans.config_file = "#{work_source_dir}/local_dev/ansible.cfg"
    ans.playbook = "#{work_source_dir}/local_dev/playbook.yml"
    ans.extra_vars = {
      work_base_dir: work_base_dir,
      work_source_dir: work_source_dir,

      # forwarded ports
      port_mysql: port_mysql,
      port_adminer: port_adminer,
      port_elasticsearch_http: port_elasticsearch_http,
      port_elasticsearch_nodes: port_elasticsearch_nodes,
      port_dejavu: port_dejavu,
      port_http_rails: port_http_rails,
      port_http_mail: port_http_mail,
      port_http_reload: port_http_reload,

      # set the time zone
      time_zone: "Australia/Sydney",

      # hard-coded passwords / secrets
      # WARING: These passwords and secrets are hard-coded because this should be fine in a development environment.
      # Change these before running `vagrant up` if you want to use your own local, secure, settings.
      mysql_root_password: "INSECURE-PASSWORD-IsztHxGhtcCy4Ebo-m0up97BL3ZIGsE34WkfMu4u",
      rails_dev_secret_key_base: "aa0277cec08c6369786be25e1a2e96929e724528ea30ca0a73d53e490a5bf9e3334efa23edb091c4edcd8c02737af6ec7ae3d5a2709993d55226c6db2f1bd1a3",
      rails_dev_secret_key: "ed7a1cc2576daf4a432030839f0b974a21e1a9c5dd2b6d0bca27738b3485b93a79a1f60be7cdf3dd96e656a655802d3f9a72079882bd28b6a5aecf55db40ecf7",
      rails_test_secret_key_base: "17c7e185df60114a89a54cdb1b57cc651152d98b452e30d9614a87ac99ce8994c1fd5d8d3c8ac93e20493415d1f45a04c4fa1a1cc3d023257fc25c96c24b9c81",
      rails_test_secret_key: "68f2b4836d6583f92df486fd6b106decb9c3253e42dbe8d16444c8854236e39e053876bf33e30576a91eb3687ae8803cb467dbd1e697b69025566d77389a6be1"
    }
  end

  # forwarded ports
  config.vm.network "forwarded_port", guest: port_mysql, host: port_mysql
  config.vm.network "forwarded_port", guest: port_adminer, host: port_adminer
  config.vm.network "forwarded_port", guest: port_elasticsearch_http, host: port_elasticsearch_http
  config.vm.network "forwarded_port", guest: port_dejavu, host: port_dejavu
  config.vm.network "forwarded_port", guest: port_http_rails, host: port_http_rails
  config.vm.network "forwarded_port", guest: port_http_mail, host: port_http_mail
  config.vm.network "forwarded_port", guest: port_http_reload, host: port_http_reload
end