1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
# -*- mode: ruby -*-
# vi: set ft=ruby :
require "ipaddr"
# The base image to use
BASE_IMAGE="centos/7"
# Either libvirt or virtualbox
PROVIDER="libvirt"
# 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
# Private IP address network
# Sadly, DHCP assignment on private network is buggy with libvirt provider
# see https://github.com/pradels/vagrant-libvirt/issues/427
PRIVATE_NETWORK="10.10.10.0/24"
# Bridge interface
BRIDGE_INTERFACE="virbr0"
# 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
# A poor's man DHCP server
# Note: this prevents safely running 'vagrant up' one VM at a time otherwise
# you're likely to have IP address conflicts. The shuffle is meant to reduce
# collisions. A safer way would be to make sure the host doesn't respond to
# pings.
# This should all go away once we find a way to make vagrant-libvirt work with
# private DHCP networks.
def pick_address
@available_addresses ||= IPAddr.new(PRIVATE_NETWORK).to_range.to_a.drop(2).shuffle
@available_addresses.shift.to_s
end
Vagrant.configure(2) do |config|
config.vm.box = 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", ip: pick_address
config.vm.network "public_network", dev: 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
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
# The operator controls the deployment
config.vm.define "operator" do |admin|
admin.vm.hostname = "operator.local"
admin.vm.provision :shell, path: "bootstrap.sh", args: "operator #{MULTINODE ? 'multinode' : 'aio'}"
admin.vm.synced_folder "..", "/home/vagrant/kolla", create:"True", type: 'nfs'
admin.vm.synced_folder "storage/operator/", "/data/host", create:"True", type: 'nfs'
admin.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: 'nfs'
admin.vm.synced_folder ".", "/home/vagrant/sync", disabled: true
admin.vm.provider PROVIDER do |vm|
vm.memory = MULTINODE ? 1024 : 4096
if PROVIDER == 'libvirt'
# This only works with libvirt provider.
# We should be able to do something similar for virtualbox
# http://askubuntu.com/questions/317338/how-can-i-increase-disk-size-on-a-vagrant-vm
vm.machine_virtual_size = 40
end
end
admin.hostmanager.aliases = "operator"
end
if MULTINODE
# Build compute nodes
(1..NUMBER_OF_COMPUTE_NODES).each do |i|
config.vm.define "compute0#{i}" do |compute|
compute.vm.hostname = "compute0#{i}.local"
compute.vm.provision :shell, path: "bootstrap.sh"
compute.vm.synced_folder "storage/compute/", "/data/host", create:"True", type: 'nfs'
compute.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: 'nfs'
compute.vm.synced_folder ".", "/home/vagrant/sync", disabled: true
compute.vm.provider PROVIDER do |vm|
vm.memory = 1024
end
compute.hostmanager.aliases = "compute0#{i}"
end
end
# Build storage nodes
(1..NUMBER_OF_STORAGE_NODES).each do |i|
config.vm.define "storage0#{i}" do |storage|
storage.vm.hostname = "storage0#{i}.local"
storage.vm.provision :shell, path: "bootstrap.sh"
storage.vm.synced_folder "storage/storage/", "/data/host", create:"True"
storage.vm.synced_folder "storage/shared/", "/data/shared", create:"True"
storage.vm.synced_folder ".", "/home/vagrant/sync", disabled: true
storage.vm.provider PROVIDER do |vm|
vm.memory = 1024
end
storage.hostmanager.aliases = "storage0#{i}"
end
end
# Build network nodes
(1..NUMBER_OF_NETWORK_NODES).each do |i|
config.vm.define "network0#{i}" do |network|
network.vm.hostname = "network0#{i}.local"
network.vm.provision :shell, path: "bootstrap.sh"
network.vm.synced_folder "storage/network/", "/data/host", create:"True"
network.vm.synced_folder "storage/shared/", "/data/shared", create:"True"
network.vm.synced_folder ".", "/home/vagrant/sync", disabled: true
network.vm.provider PROVIDER do |vm|
vm.memory = 1024
end
network.hostmanager.aliases = "network0#{i}"
end
end
# Build control nodes
(1..NUMBER_OF_CONTROL_NODES).each do |i|
config.vm.define "control0#{i}" do |control|
control.vm.hostname = "control0#{i}.local"
control.vm.provision :shell, path: "bootstrap.sh"
control.vm.synced_folder "storage/control/", "/data/host", create:"True", type: 'nfs'
control.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: 'nfs'
control.vm.synced_folder ".", "/home/vagrant/sync", disabled: true
control.vm.provider PROVIDER do |vm|
vm.memory = 2048
end
control.hostmanager.aliases = "control0#{i}"
end
end
end
end
|