Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: Vagrantfile

Issue 29367494: Issue 3065 - Introduce support for host-specific operating systems (Closed)
Patch Set: Created Dec. 14, 2016, 3:07 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | hiera/roles/default.yaml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Vagrantfile
diff --git a/Vagrantfile b/Vagrantfile
index 7290a77ea9de45f0080b8bb4880a4c087163ab52..9c22004e5d1cf7e35db0cea728d3e8d4a4714067 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -1,73 +1,119 @@
+# coding: utf-8
+# vi: set fenc=utf-8 ft=ruby ts=8 sw=2 sts=2 et:
+require 'shellwords'
require 'yaml'
-VAGRANTFILE_API_VERSION = "2"
-REPOSITORY_DIR = File.dirname(__FILE__)
-DEPENDENCY_SCRIPT = File.join(REPOSITORY_DIR, "ensure_dependencies.py")
-
-if !system("python", DEPENDENCY_SCRIPT)
- error = Vagrant::Errors::VagrantError
- error.error_message("Failed to ensure dependencies being up-to-date!")
- raise error
+# https://issues.adblockplus.org/ticket/170
+if !system('python', File.expand_path('../ensure_dependencies.py', __FILE__))
+ message = 'Failed to ensure dependencies being up-to-date!'
+ raise Vagrant::Errors::VagrantError, message
end
-def define_standard_vm(config, host_name, ip, role=nil)
- config.vm.define host_name do |config|
- config.vm.box = 'precise64'
- config.vm.box_url = 'http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box'
- config.vm.host_name = "#{host_name}.adblockplus.org"
- config.vm.network :private_network, ip: ip
- config.vm.provider :virtualbox do |vb|
- vb.customize ["modifyvm", :id, "--cpus", 1]
+# https://www.vagrantup.com/docs/vagrantfile/version.html
+Vagrant.configure('2') do |config|
+
+ # The repository location in the production system's puppet master
+ sync_path = '/etc/puppet/infrastructure'
+ sync_type = system('which', 'rsync', :out => File::NULL) ? 'rsync' : nil
+
+ # See also modules/adblockplus/manifests/host.pp
+ hosts_file = File.expand_path('../modules/private/hiera/hosts.yaml', __FILE__)
+ hosts_data = YAML.load_file(hosts_file)
+ hosts_data.fetch('adblockplus::hosts', {}).each_pair do |name, record|
+
+ # Formerly present hosts not destroyed yet require manual intervention
+ next if record['ensure'] == 'absent'
+
+ # https://docs.puppet.com/puppet/latest/man/apply.html
+ puppet_options = Shellwords.split ENV.fetch('PUPPET_OPTIONS', '--verbose')
+ puppet_options << '--debug' unless ENV.fetch('PUPPET_DEBUG', '').empty?
+ puppet_options << '--environment=development'
+ puppet_options << "--external_nodes=#{sync_path}/hiera/puppet_node_classifier.rb"
+ puppet_options << '--node_terminus=exec'
+
+ # https://www.vagrantup.com/docs/multi-machine/
+ config.vm.define name do |host|
+
+ if record.fetch('os', 'ubuntu-precise') == 'ubuntu-precise'
- # Work around https://www.virtualbox.org/ticket/11649
- vb.customize ['modifyvm', :id, '--natdnshostresolver1', 'on']
+ # http://cloud-images.ubuntu.com/vagrant/precise/current/
+ host.vm.box = 'precise64'
+ host.vm.box_url = 'http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box'
- setup_path = File.join(REPOSITORY_DIR, "hiera", "roles", "#{role}.yaml")
- setup = YAML.load_file(setup_path) rescue {}
- requirements = setup.fetch("requirements", {})
+ # https://www.vagrantup.com/docs/provisioning/shell.html
+ host.vm.provision :shell, :privileged => true, :inline => <<-end
+ python /etc/puppet/infrastructure/hiera/install_precise.py
+ end
- requirements.each do |key, value|
- vb.customize ['modifyvm', :id, "--#{key}", "#{value}"]
+ # https://www.vagrantup.com/docs/synced-folders/
+ host.vm.synced_folder '.', sync_path, type: sync_type
+
+ elsif record['os'] == 'debian-jessie'
+
+ # https://www.vagrantup.com/docs/boxes.html
+ host.vm.box = 'debian/contrib-jessie64'
+ host.vm.box_url = 'https://atlas.hashicorp.com/debian/boxes/contrib-jessie64'
+
+ # https://packages.debian.org/jessie/puppet
+ host.vm.provision :shell, :privileged => true, :inline => <<-end
+ set -e -- '#{sync_path}' /etc/puppet/hiera.yaml
+ if ! which puppet >/dev/null; then
+ apt-get -y update
+ apt-get -y install puppet
+ fi
+ test -e "$1" || ln -s /vagrant "$1"
+ test -e "$2" || ln -s infrastructure/hiera/hiera.yaml "$2"
+ puppet agent --enable
+ end
+
+ # https://docs.puppet.com/puppet/latest/configuration.html#hieraconfig
+ puppet_options << "--hiera_config=#{sync_path}/hiera/hiera.yaml"
+
+ else
+ message = "Unrecognized OS '#{record['os']}' for host '#{name}'"
+ raise Vagrant::Errors::VagrantError, message
end
- end
+ # https://www.vagrantup.com/docs/vagrantfile/machine_settings.html
+ host.vm.hostname = record.fetch('fqdn', "#{name}.test")
- # The repository location in the production system's puppet master
- if system('which', 'rsync', :out => File::NULL)
- config.vm.synced_folder '.', '/etc/puppet/infrastructure', type: 'rsync'
- else
- config.vm.synced_folder '.', '/etc/puppet/infrastructure'
- end
+ # https://www.vagrantup.com/docs/networking/
+ host.vm.network :private_network, ip: record['ips'][0]
+
+ # https://www.vagrantup.com/docs/virtualbox/configuration.html
+ host.vm.provider :virtualbox do |virtualbox|
+
+ # The GUI would be just annoying to pop up by default every time
+ virtualbox.gui = !ENV.fetch('VIRTUALBOX_GUI', '').empty?
+
+ # Individual box configuration may increase the number of CPUs
+ virtualbox.customize ['modifyvm', :id, '--cpus', 1]
+ # Work around https://www.virtualbox.org/ticket/11649
+ virtualbox.customize ['modifyvm', :id, '--natdnshostresolver1', 'on']
+
+ # Role-specific requirements, optional
+ role_name = record.fetch('role', 'default')
+ role_file = File.expand_path("../hiera/roles/#{role_name}.yaml", __FILE__)
+ role_data = File.exists?(role_file) ? YAML.load_file(role_file) : {}
+ role_data.fetch('requirements', {}).each do |key, value|
+ virtualbox.customize ['modifyvm', :id, "--#{key}", value.to_s]
+ end
+
+ end
+
+ # https://www.vagrantup.com/docs/provisioning/puppet_apply.html
+ host.vm.provision :puppet do |puppet|
+ puppet.manifests_path = 'manifests'
+ puppet.manifest_file = 'site.pp'
+ puppet.module_path = 'modules'
+ puppet.options = puppet_options
+ end
+
+ # https://github.com/mitchellh/vagrant/issues/1673
+ host.ssh.shell = "sh -c 'BASH_ENV=/etc/profile exec bash'"
- config.vm.provision :shell, :inline => '
- sudo /etc/puppet/infrastructure/hiera/install_precise.py
- '
-
- config.vm.provision :puppet do |puppet|
- puppet.options = [
- '--environment=development',
- '--external_nodes=/etc/puppet/infrastructure/hiera/puppet_node_classifier.rb',
- '--node_terminus=exec',
- '--verbose',
- '--debug',
- ]
- puppet.manifests_path = 'manifests'
- puppet.manifest_file = 'site.pp'
- puppet.module_path = 'modules'
end
- yield(config) if block_given?
end
-end
-Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
- config_path = File.join(REPOSITORY_DIR, "modules/private/hiera/hosts.yaml")
- config_data = YAML.load_file(config_path)
- servers = config_data["adblockplus::hosts"]
- servers.each do |server, items|
- next if items['ensure'] == 'absent'
- ip = items["ips"][0]
- role = items.fetch("role", "default")
- define_standard_vm(config, server, ip, role)
- end
end
« no previous file with comments | « no previous file | hiera/roles/default.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld