Vagrant multinode deployment

Preparing Vagrant for multinode (and all-in-one as well)
Ansible deployment.

Change-Id: Ib2ddfe80159211363ec5e96ef904388d5870927d
Implements: blueprint vagrant
This commit is contained in:
Michal Rostecki 2016-01-05 22:04:37 +01:00
parent bc9b94f158
commit 10f8a02ae2
4 changed files with 161 additions and 42 deletions

1
.gitignore vendored
View File

@ -60,6 +60,7 @@ ChangeLog
# Vagrant
.vagrant
vagrant/Vagrantfile.custom
vagrant/vagrantkey*
# generated openrc
openrc

80
vagrant/Vagrantfile vendored
View File

@ -34,7 +34,7 @@ PROVIDER_DEFAULTS ||= {
MULTINODE = false unless self.class.const_defined?(:MULTINODE)
NUMBER_OF_MESOS_MASTER_NODES ||= 3
NUMBER_OF_MASTER_NODES ||= 3
NUMBER_OF_CONTROLLER_NODES ||= 3
NUMBER_OF_COMPUTE_NODES ||= 1
NUMBER_OF_STORAGE_NODES ||= 1
@ -44,7 +44,7 @@ NODE_SETTINGS ||= {
cpus: 4,
memory: 4096
},
mesos_master: {
master: {
cpus: 1,
memory: 1024
},
@ -62,6 +62,12 @@ NODE_SETTINGS ||= {
}
}
# 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][setting]
rescue
@ -82,18 +88,68 @@ Vagrant.configure(2) do |config|
config.vm.network "private_network", type: "dhcp"
config.vm.network "public_network", dev: get_default(:bridge_interface), bridge: get_default(:bridge_interface), mode: 'bridge', type: 'bridge'
if MULTINODE
# TODO(nihilifer): Implement multinode deployment.
raise KollaMesosNotImplemented,
"Multinode deployment is not implemented yet"
else
# All-in-one
config.vm.synced_folder "..", "/home/vagrant/kolla-mesos", type: get_default(:sync_method)
config.vm.provider PROVIDER do |vm|
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 = false
config.hostmanager.ip_resolver = proc do |vm, resolving_vm|
case PROVIDER
when "libvirt"
if vm.name
`virsh -c qemu:///system net-dhcp-leases default | awk -F'[ /]+' '/#{vm.name} / {print $6}'`.chop
end
when "virtualbox"
if vm.id
`VBoxManage guestproperty get #{vm.id} "/VirtualBox/GuestInfo/Net/2/V4/IP"`.split()[1]
end
end
end
config.hostmanager.manage_host = true
config.vm.define "operator" do |admin|
hostname = "operator"
admin.vm.hostname = "#{hostname}.local"
admin.vm.synced_folder "..", "/home/vagrant/kolla-mesos", type: get_default(:sync_method)
admin.vm.provider PROVIDER do |vm|
vm.cpus = get_setting(:aio, :cpus)
vm.memory = get_setting(:aio, :memory)
end
config.vm.provision :shell, path: "provision.sh"
config.vm.provision :shell, path: "../tools/bootstrap.sh", args: "start"
admin.vm.provision :hostmanager
admin.vm.provision :shell, path: "provision.sh", args: "operator #{MULTINODE ? 'multinode' : 'aio'}"
admin.hostmanager.aliases = hostname
end
if MULTINODE
['master', 'controller', 'compute'].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 :hostmanager
node.vm.provision :shell, path: "provision.sh", args: "#{hostname} multinode"
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

View File

@ -17,7 +17,7 @@
# MULTINODE = false
# NUMBER_OF_MESOS_MASTER_NODES = 3
# NUMBER_OF_MASTER_NODES = 3
# NUMBER_OF_CONTROLLER_NODES = 3
# NUMBER_OF_COMPUTE_NODES = 1
# NUMBER_OF_STORAGE_NODES = 1
@ -27,9 +27,9 @@
# cpus: 4,
# memory: 4096
# },
# mesos_master: {
# master: {
# cpus: 1,
# memory: 1024
# memory: 512
# },
# controller: {
# cpus: 2,

View File

@ -1,10 +1,39 @@
#!/bin/bash
# Disable SELinux
setenforce 0
VM=$1
MODE=$2
# Install system packages
cat >/etc/yum.repos.d/docker.repo <<-EOF
if [ "$MODE" = 'aio' ]; then
REGISTRY_PORT=4000
else
REGISTRY_PORT=5000
fi
REGISTRY=operator.local:${REGISTRY_PORT}
function configure_commons {
# Disable SELinux
setenforce 0
sed -i -r "s,^SELINUX=.+$,SELINUX=permissive," /etc/selinux/config
yum -y install \
epel-release \
git \
python-devel \
vim-enhanced
# Instal Development Tools
yum -y groupinstall "Development Tools"
# Install packages from EPEL
yum -y install \
python-pip
yum clean all
}
function configure_docker {
# Install Docker
cat >/etc/yum.repos.d/docker.repo <<-EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
@ -12,30 +41,63 @@ enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
yum -y install docker-engine epel-release git python-devel vim-enhanced
yum -y install python-pip
yum -y groupinstall "Development Tools"
yum clean
yum -y install \
docker-engine \
&& yum clean all
pip install docker-py
# Start services
systemctl enable docker
systemctl start docker
# Configure registry
sed -i -r "s,(ExecStart)=(.+),\1=/usr/bin/docker -d --insecure-registry ${REGISTRY} --registry-mirror=http://${REGISTRY}," /usr/lib/systemd/system/docker.service
# Fetch and install pip packages
pip install tox
sudo -u vagrant git clone https://github.com/openstack/kolla ~vagrant/kolla
pip install ~vagrant/kolla
pip install ~vagrant/kolla-mesos
# Start services
systemctl enable docker
systemctl start docker
}
# Generate and copy configuration
sudo -u vagrant bash -c "cd ~vagrant/kolla-mesos && tox -e genconfig"
mkdir -p /etc/kolla-mesos
cp -r ~vagrant/kolla/etc/kolla/ /etc/kolla
cp ~vagrant/kolla-mesos/etc/kolla-mesos.conf.sample /etc/kolla-mesos/kolla-mesos.conf
function configure_operator {
# Fetch and install pip packages
pip install ansible tox
sudo -u vagrant git clone https://github.com/openstack/kolla ~vagrant/kolla
pip install ~vagrant/kolla
pip install ~vagrant/kolla-mesos
# Change network settings
# TODO(nihilifer): Change kolla_internal_address when loadbalancing will be implemented.
HOST_IP=$(ip addr show eth1 | grep -Po 'inet \K[\d.]+')
sed -i -r "s,^[# ]*kolla_internal_address:.+$,kolla_internal_address: \"$HOST_IP\"," /etc/kolla/globals.yml
sed -i -r "s,^[# ]*network_interface:.+$,network_interface: \"eth1\"," /etc/kolla/globals.yml
sed -i -r "s,^[# ]*neutron_external_interface:.+$,neutron_external_interface: \"eth2\"," /etc/kolla/globals.yml
# Generate and copy configuration
sudo -u vagrant bash -c "cd ~vagrant/kolla-mesos && tox -e genconfig"
mkdir -p /etc/kolla-mesos
cp -r ~vagrant/kolla/etc/kolla/ /etc/kolla
cp ~vagrant/kolla-mesos/etc/kolla-mesos.conf.sample /etc/kolla-mesos/kolla-mesos.conf
cp ~vagrant/kolla-mesos/etc/globals.yml /etc/kolla-mesos/globals.yml
cp ~vagrant/kolla-mesos/etc/passwords.yml /etc/kolla-mesos/passwords.yml
# Change network settings
# TODO(nihilifer): Change kolla_internal_address when loadbalancing will be implemented.
HOST_IP=$(ip addr show eth1 | grep -Po 'inet \K[\d.]+')
if [ "$MODE" = "multinode" ]; then
sed -i -r "s,^[# ]*namespace.+$,namespace = ${REGISTRY}/kollaglue," /etc/kolla/kolla-build.conf
sed -i -r "s,^[# ]*push.+$,push = True," /etc/kolla/kolla-build.conf
else
sed -i -r "s,^[# ]*docker_registry.+$,docker_registry: \"\"," /etc/kolla-mesos/globals.yml
fi
sed -i -r "s,^[# ]*kolla_internal_address:.+$,kolla_internal_address: \"$HOST_IP\"," /etc/kolla/globals.yml
sed -i -r "s,^[# ]*network_interface:.+$,network_interface: \"eth1\"," /etc/kolla/globals.yml
sed -i -r "s,^[# ]*neutron_external_interface:.+$,neutron_external_interface: \"eth2\"," /etc/kolla/globals.yml
sed -i -r "s,^[# ]*registry.+$,registry = operator.local:${REGISTRY_PORT}," /etc/kolla-mesos/kolla-mesos.conf
# Run Docker Registry
if [[ ! $(docker ps -a -q -f name=registry) ]]; then
docker run -d \
--name=registry \
--restart=always \
-p ${REGISTRY_PORT}:5000 \
-e STORAGE_PATH=/var/lib/registry \
-v /data/host/registry-storage:/var/lib/registry \
distribution/registry
fi
}
configure_commons
configure_docker
if [ "$VM" = "operator" ]; then
configure_operator
fi