# -*- mode: ruby -*- # vi: set ft=ruby : # @param swap_size_mb [Integer] swap size in megabytes # @param swap_file [String] full path for swap file, default is /swapfile1 # @return [String] the script text for shell inline provisioning def create_swap(swap_size_mb, swap_file = "/swapfile1") <<-EOS if [ ! -f #{swap_file} ]; then echo "Creating #{swap_size_mb}mb swap file=#{swap_file}. This could take a while..." dd if=/dev/zero of=#{swap_file} bs=1024 count=#{swap_size_mb * 1024} mkswap #{swap_file} chmod 0600 #{swap_file} swapon #{swap_file} if ! grep -Fxq "#{swap_file} swap swap defaults 0 0" /etc/fstab then echo "#{swap_file} swap swap defaults 0 0" >> /etc/fstab fi fi EOS end # execute chef provisionning with environment specific configs # this is an attempt to DRY up the dev/prod provisionning # @param chef [Object] the chef provisionner, see Vagrant doc # @param env [Symbol] the environment symbol, :dev, :prod, etc def provision(chef, env) # provision = lambda do |chef| # chef.log_level = :debug chef.cookbooks_path = ["./cookbooks"] chef.roles_path = ["./roles"] chef.data_bags_path = ["./databags"] # setup users (from data_bags/users/*.json) chef.add_recipe "users::sysadmins" # creates users and sysadmin group chef.add_recipe "users::sysadmin_sudo" # adds %sysadmin group to sudoers chef.add_recipe "ohai" chef.add_recipe "apt" chef.add_recipe "build-essential" chef.add_recipe "git" chef.add_recipe "redisio::install" chef.add_recipe "redisio::enable" chef.add_recipe "runit" chef.add_recipe "java" chef.add_recipe "storm::singlenode" chef.json = { :java => { :oracle => { "accept_oracle_download_terms" => true }, :install_flavor => "openjdk", :jdk_version => "7", }, :storm => { :version => "0.9.1-incubating", :deploy => { :user => "storm", :group => "storm", }, }, } case env when :dev chef.json[:storm].merge!({ :nimbus => { :host => "localhost", :childopts => "-Xmx128m", }, :supervisor => { :hosts => ["localhost"], :childopts => "-Xmx128m", }, :worker => { :childopts => "-Xmx128m", }, :ui => { :childopts => "-Xmx128m", }, }) when :prod chef.json[:storm].merge!({ :nimbus => { :host => "localhost", :childopts => "-Xmx768m", }, :supervisor => { :hosts => ["localhost"], :childopts => "-Xmx256m", }, :worker => { :childopts => "-Xmx4096m -Xms4096m", }, :ui => { :childopts => "-Xmx768m", }, }) else raise("invalid env=#{env.inspect}") end end # use version 2 config object Vagrant.configure("2") do |config| config.ssh.forward_agent = true config.vm.define :prod do |prod| prod.vm.box = "dummy" prod.ssh.username = "ubuntu" prod.vm.provider :aws do |aws, override| aws.access_key_id = ENV["ACCESS_KEY_ID"] aws.secret_access_key = ENV["SECRET_ACCESS_KEY"] aws.keypair_name = ENV["KEYPAIR_NAME"] override.ssh.private_key_path = ENV["PRIVATE_KEY_PATH"] aws.ami = "ami-0cdf4965" # Ubuntu 12.10, us-east-1, 64bits, ebs root aws.instance_type = "m1.large" aws.region = "us-east-1" aws.tags = {"Name" => "redstorm_cluster"} aws.security_groups = ["storm", "ssh"] end # TODO on EC2, add swap on ephemeral device not ebs boot prod.vm.provision :shell, :inline => create_swap(1024, "/mnt/swapfile1") prod.vm.provision :chef_solo do |chef| provision(chef, :prod) end end config.vm.define :dev do |dev| dev.vm.box = "precise-amd64" dev.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box" # storm ui dev.vm.network :forwarded_port, :guest => 8080, :host => 8080 # storm numbus thrift dev.vm.network :forwarded_port, :guest => 6627, :host => 6627 # storm drpc dev.vm.network :forwarded_port, :guest => 3772, :host => 3772 # redis dev.vm.network :forwarded_port, :guest => 6379, :host => 6379 dev.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", 1536] end dev.vm.provision :shell, :inline => create_swap(256) dev.vm.provision :chef_solo do |chef| provision(chef, :dev) end end # vagrant-omnibus plugin: auto install/upgrate chef config.omnibus.chef_version = "10.18.2" end