e715856f52
To fetch the IP address from the interface other than eth0 for vagrant-hostmanager plugin, it must be fetched from the DHCP leases from libvirt network. The previously used one-liner, which was using virsh with awk, returns multiple addresses when VM was destroyed before expiration of its DHCP lease. This script solved this problem by getting only the newest DHCP lease and gives a possibility to destroy Vagrant environment and set up again without worrying about hosts resolving. Co-Authored-By: Michal Rostecki <mrostecki@mirantis.com> Partially-Implements: blueprint vagrant Related-Id: Ic469b46f4d02d873c27114cbd268b86521eef32b Related-Id: I81f07b7e4a202af68fd3cf9fdb308c3734c40a83 Change-Id: I408415e95483c1b8988d0f67c654212de63bece2
190 lines
6.2 KiB
Ruby
190 lines
6.2 KiB
Ruby
# -*- mode: ruby -*-
|
|
# vi: set ft=ruby :
|
|
|
|
require "ipaddr"
|
|
|
|
class VagrantConfigMissing < StandardError
|
|
end
|
|
|
|
vagrant_dir = File.expand_path(File.dirname(__FILE__))
|
|
|
|
# Vagrantfile.custom contains user customization for the Vagrantfile
|
|
# You shouldn't have to edit the Vagrantfile, ever.
|
|
if File.exists?(File.join(vagrant_dir, 'Vagrantfile.custom'))
|
|
eval(IO.read(File.join(vagrant_dir, 'Vagrantfile.custom')), binding)
|
|
end
|
|
|
|
# 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: "centos-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: "centos-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 unless self.class.const_defined?(:MULTINODE)
|
|
|
|
# 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?(File.join(vagrant_dir, 'vagrantkey'))
|
|
system("ssh-keygen -f #{File.join(vagrant_dir, 'vagrantkey')} -N '' -C this-is-vagrant")
|
|
end
|
|
|
|
def get_default(setting)
|
|
PROVIDER_DEFAULTS[PROVIDER.to_sym][DISTRO.to_sym][setting]
|
|
rescue
|
|
raise VagrantConfigMissing,
|
|
"Missing configuration for PROVIDER_DEFAULTS[#{PROVIDER}][#{DISTRO}][#{setting}]"
|
|
end
|
|
|
|
def get_setting(node, setting)
|
|
NODE_SETTINGS[node][setting]
|
|
rescue
|
|
raise VagrantConfigMissing,
|
|
"Missing configuration for 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(vagrant_dir, "vagrantkey"))
|
|
my_publickey = File.read(File.join(vagrant_dir, "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
|
|
`python newest_dhcp_lease.py #{vm.name}`.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 File.join(vagrant_dir, '..', '..'), get_default(:kolla_path), create:"True", type: get_default(:sync_method)
|
|
admin.vm.synced_folder File.join(vagrant_dir, 'storage', 'operator'), "/data/host", create:"True", type: get_default(:sync_method)
|
|
admin.vm.synced_folder File.join(vagrant_dir, '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 File.join(vagrant_dir, 'storage', node_type), "/data/host", create:"True", type: get_default(:sync_method)
|
|
node.vm.synced_folder File.join(vagrant_dir, '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
|