Martin André 988ee296d6 Factor out definition of nodes in Vagrantfile
All the nodes, with the exception of the operator, are build the same
with maybe different specs. We can remove the duplication with a bit of
metaprogramming.

Also pass all expected arguments to the provisionning script,and get
rid of hardcoded path to it.

Closes-Bug: #1517476

Change-Id: I515ef1d529d7ec49038662001a3e5345a941fea7
2015-11-18 22:39:06 +09:00

172 lines
5.4 KiB
Ruby

# -*- mode: ruby -*-
# vi: set ft=ruby :
require "ipaddr"
# Either libvirt or virtualbox
PROVIDER = "libvirt"
# Either centos or ubuntu
DISTRO = "centos"
PROVIDER_DEFAULTS = {
libvirt: {
centos: {
base_image: "centos/7",
bridge_interface: "virbr0",
vagrant_shared_folder: "/home/vagrant/sync",
sync_method: "nfs",
provision_script: "bootstrap.sh",
kolla_path: "/home/vagrant/kolla"
}
},
virtualbox: {
centos: {
base_image: "puppetlabs/centos-7.0-64-puppet",
bridge_interface: "wlp3s0b1",
vagrant_shared_folder: "/vagrant",
sync_method: "virtualbox",
provision_script: "bootstrap.sh",
kolla_path: "/home/vagrant/kolla"
},
ubuntu: {
base_image: "ubuntu/vivid64",
bridge_interface: "wlp3s0b1",
vagrant_shared_folder: "/home/vagrant/sync",
sync_method: "nfs",
provision_script: "ubuntu-bootstrap.sh",
kolla_path: "/usr/local/kolla"
}
}
}
# Whether to do Multi-node or All-in-One deployment
MULTINODE=false
# The following is only used when deploying in Multi-nodes
NUMBER_OF_CONTROL_NODES=3
NUMBER_OF_COMPUTE_NODES=1
NUMBER_OF_STORAGE_NODES=1
NUMBER_OF_NETWORK_NODES=1
NODE_SETTINGS = {
aio: {
cpus: 4,
memory: 4096
},
operator: {
cpus: 1,
memory: 1024
},
control: {
cpus: 1,
memory: 2048
},
compute: {
cpus: 1,
memory: 1024
},
storage: {
cpus: 1,
memory: 1024
},
network: {
cpus: 1,
memory: 1024
}
}
# Configure a new SSH key and config so the operator is able to connect with
# the other cluster nodes.
unless File.file?("./vagrantkey")
system("ssh-keygen -f ./vagrantkey -N '' -C this-is-vagrant")
end
def get_default(setting)
PROVIDER_DEFAULTS[PROVIDER.to_sym][DISTRO.to_sym][setting]
end
def get_setting(node, setting)
NODE_SETTINGS[node][setting]
end
Vagrant.configure(2) do |config|
config.vm.box = get_default(:base_image)
# Next to the hostonly NAT-network there is a host-only network with all
# nodes attached. Plus, each node receives a 3rd adapter connected to the
# outside public network.
config.vm.network "private_network", type: "dhcp"
config.vm.network "public_network", dev: get_default(:bridge_interface), mode: 'bridge', type: 'bridge'
my_privatekey = File.read(File.join(File.dirname(__FILE__), "vagrantkey"))
my_publickey = File.read(File.join(File.dirname(__FILE__), "vagrantkey.pub"))
config.vm.provision :shell, inline: <<-EOS
mkdir -p /root/.ssh
echo '#{my_privatekey}' > /root/.ssh/id_rsa
chmod 600 /root/.ssh/id_rsa
echo '#{my_publickey}' > /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
echo '#{my_publickey}' > /root/.ssh/id_rsa.pub
chmod 644 /root/.ssh/id_rsa.pub
mkdir -p /home/vagrant/.ssh
echo '#{my_privatekey}' >> /home/vagrant/.ssh/id_rsa
chmod 600 /home/vagrant/.ssh/*
echo 'Host *' > ~vagrant/.ssh/config
echo StrictHostKeyChecking no >> ~vagrant/.ssh/config
chown -R vagrant: /home/vagrant/.ssh
EOS
config.hostmanager.enabled = true
# Make sure hostmanager picks IP address of eth1
config.hostmanager.ip_resolver = proc do |vm, resolving_vm|
case PROVIDER
when "libvirt"
if vm.name
`virsh -c qemu:///system net-dhcp-leases vagrant-private-dhcp | awk -F'[ /]+' '/#{vm.name} / {print $6}'`.chop
end
when "virtualbox_ubuntu"
when "virtualbox_centos"
if vm.id
`VBoxManage guestproperty get #{vm.id} "/VirtualBox/GuestInfo/Net/1/V4/IP"`.split()[1]
end
end
end
# The operator controls the deployment
config.vm.define "operator" do |admin|
admin.vm.hostname = "operator.local"
admin.vm.provision :shell, path: get_default(:provision_script), args: "operator #{MULTINODE ? 'multinode' : 'aio'} #{get_default(:kolla_path)}"
admin.vm.synced_folder "../..", get_default(:kolla_path), create:"True", type: get_default(:sync_method)
admin.vm.synced_folder "storage/operator/", "/data/host", create:"True", type: get_default(:sync_method)
admin.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
admin.vm.synced_folder ".", get_default(:vagrant_shared_folder), disabled: true
admin.vm.provider PROVIDER do |vm|
vm.memory = MULTINODE ? get_setting(:operator, :memory) : get_setting(:aio, :memory)
vm.cpus = MULTINODE ? get_setting(:operator, :cpus) : get_setting(:aio, :cpus)
end
admin.hostmanager.aliases = "operator"
end
if MULTINODE
['compute', 'storage', 'network', 'control'].each do |node_type|
(1..self.class.const_get("NUMBER_OF_#{node_type.upcase}_NODES")).each do |i|
hostname = "#{node_type}0#{i}"
config.vm.define hostname do |node|
node.vm.hostname = "#{hostname}.local"
node.vm.provision :shell, path: get_default(:provision_script), args: "#{hostname} multinode #{get_default(:kolla_path)}"
node.vm.synced_folder "storage/#{node_type}/", "/data/host", create:"True", type: get_default(:sync_method)
node.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
node.vm.synced_folder ".", get_default(:vagrant_shared_folder), disabled: true
node.vm.provider PROVIDER do |vm|
vm.memory = get_setting(node_type.to_sym, :memory)
vm.cpus = get_setting(node_type.to_sym, :cpus)
end
node.hostmanager.aliases = hostname
end
end
end
end
end