aboutsummaryrefslogtreecommitdiff
path: root/dev/vagrant
diff options
context:
space:
mode:
Diffstat (limited to 'dev/vagrant')
-rw-r--r--dev/vagrant/Vagrantfile168
-rw-r--r--dev/vagrant/bootstrap.sh154
2 files changed, 322 insertions, 0 deletions
diff --git a/dev/vagrant/Vagrantfile b/dev/vagrant/Vagrantfile
new file mode 100644
index 000000000..c2c1d7f68
--- /dev/null
+++ b/dev/vagrant/Vagrantfile
@@ -0,0 +1,168 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+require "ipaddr"
+
+# Either libvirt or virtualbox
+PROVIDER = "libvirt"
+
+PROVIDER_DEFAULTS = {
+ libvirt: {
+ base_image: "centos/7",
+ bridge_interface: "virbr0",
+ vagrant_shared_folder: "/home/vagrant/sync",
+ sync_method: "nfs",
+ },
+ virtualbox: {
+ base_image: "puppetlabs/centos-7.0-64-puppet",
+ bridge_interface: "wlp3s0b1",
+ vagrant_shared_folder: "/vagrant",
+ sync_method: "virtualbox",
+ },
+}
+
+# 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
+
+# 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][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"
+ 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: "bootstrap.sh", args: "operator #{MULTINODE ? 'multinode' : 'aio'}"
+ admin.vm.synced_folder "..", "/home/vagrant/kolla", 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 ? 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: get_default(:sync_method)
+ compute.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
+ compute.vm.synced_folder ".", get_default(:vagrant_shared_folder), 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", type: get_default(:sync_method)
+ storage.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
+ storage.vm.synced_folder ".", get_default(:vagrant_shared_folder), 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", type: get_default(:sync_method)
+ network.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
+ network.vm.synced_folder ".", get_default(:vagrant_shared_folder), 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: get_default(:sync_method)
+ control.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
+ control.vm.synced_folder ".", get_default(:vagrant_shared_folder), disabled: true
+ control.vm.provider PROVIDER do |vm|
+ vm.memory = 2048
+ end
+ control.hostmanager.aliases = "control0#{i}"
+ end
+ end
+ end
+
+end
diff --git a/dev/vagrant/bootstrap.sh b/dev/vagrant/bootstrap.sh
new file mode 100644
index 000000000..889942922
--- /dev/null
+++ b/dev/vagrant/bootstrap.sh
@@ -0,0 +1,154 @@
+#!/usr/bin/env bash
+#
+# Bootstrap script to configure all nodes.
+#
+
+export http_proxy=
+export https_proxy=
+
+if [ $2 = 'aio' ]; then
+ # Run registry on port 4000 since it may collide with keystone when doing AIO
+ REGISTRY_PORT=4000
+ SUPPORT_NODE=operator
+else
+ REGISTRY_PORT=5000
+ SUPPORT_NODE=support01
+fi
+REGISTRY=operator.local:${REGISTRY_PORT}
+
+# Install common packages and do some prepwork.
+function prep_work {
+ systemctl stop firewalld
+ systemctl disable firewalld
+
+ # This removes the fqdn from /etc/hosts's 127.0.0.1. This name.local will
+ # resolve to the public IP instead of localhost.
+ sed -i -r "s/^(127\.0\.0\.1\s+)(.*) `hostname` (.+)/\1 \3/" /etc/hosts
+
+ yum install -y http://mirror.nl.leaseweb.net/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
+ yum install -y MySQL-python vim-enhanced python-pip python-devel gcc openssl-devel libffi-devel libxml2-devel libxslt-devel && yum clean all
+ pip install --upgrade docker-py
+}
+
+# Install and configure a quick&dirty docker daemon.
+function install_docker {
+ # Allow for an externally supplied docker binary.
+ if [ -f "/data/docker" ]; then
+ cp /vagrant/docker /usr/bin/docker
+ chmod +x /usr/bin/docker
+ else
+ cat >/etc/yum.repos.d/docker.repo <<-EOF
+[dockerrepo]
+name=Docker Repository
+baseurl=https://yum.dockerproject.org/repo/main/centos/7
+enabled=1
+gpgcheck=1
+gpgkey=https://yum.dockerproject.org/gpg
+EOF
+ # Also upgrade device-mapper here because of:
+ # https://github.com/docker/docker/issues/12108
+ yum install -y docker-engine device-mapper
+
+ # Despite it shipping with /etc/sysconfig/docker, Docker is not configured to
+ # load it from it's service file.
+ sed -i -r "s,(ExecStart)=(.+),\1=/usr/bin/docker -d --insecure-registry ${REGISTRY} --registry-mirror=http://${REGISTRY}," /usr/lib/systemd/system/docker.service
+
+ systemctl daemon-reload
+ systemctl enable docker
+ systemctl start docker
+ fi
+
+ usermod -aG docker vagrant
+}
+
+function resize_partition {
+ fdisk /dev/vda <<EOF
+n
+p
+
+
+t
+
+8e
+w
+EOF
+ partprobe
+ pvcreate /dev/vda4
+ vgextend VolGroup00 /dev/vda4
+ lvextend /dev/VolGroup00/LogVol00 /dev/vda4
+ resize2fs /dev/VolGroup00/LogVol00
+}
+
+function configure_kolla {
+ # Use local docker registry
+ sed -i -r "s,^[# ]*namespace.+$,namespace = ${REGISTRY}/lokolla," /etc/kolla/kolla-build.conf
+ sed -i -r "s,^[# ]*docker_registry:.+$,docker_registry: \"${REGISTRY}\"," /etc/kolla/globals.yml
+ sed -i -r "s,^[# ]*docker_namespace:.+$,docker_namespace: \"lokolla\"," /etc/kolla/globals.yml
+ sed -i -r "s,^[# ]*docker_insecure_registry:.+$,docker_insecure_registry: \"True\"," /etc/kolla/globals.yml
+ # Set network interfaces
+ 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
+}
+
+# Configure the operator node and install some additional packages.
+function configure_operator {
+ yum install -y git mariadb && yum clean all
+ pip install --upgrade ansible python-openstackclient
+
+ pip install ~vagrant/kolla
+
+ # Note: this trickery requires a patched docker binary.
+ if [ "$http_proxy" = "" ]; then
+ su - vagrant sh -c "echo BUILDFLAGS=\\\"--build-env=http_proxy=$http_proxy --build-env=https_proxy=$https_proxy\\\" > ~/kolla/.buildconf"
+ fi
+
+ cp -r ~vagrant/kolla/etc/kolla/ /etc/kolla
+ mkdir -p /usr/share/kolla
+ chown -R vagrant: /etc/kolla /usr/share/kolla
+
+ configure_kolla
+
+ # Make sure Ansible uses scp.
+ cat > ~vagrant/.ansible.cfg <<EOF
+[defaults]
+forks=100
+
+[ssh_connection]
+scp_if_ssh=True
+EOF
+ chown vagrant: ~vagrant/.ansible.cfg
+
+ # The openrc file.
+ cat > ~vagrant/openrc <<EOF
+export OS_AUTH_URL="http://${SUPPORT_NODE}:35357/v2.0"
+export OS_USERNAME=admin
+export OS_PASSWORD=password
+export OS_TENANT_NAME=admin
+export OS_VOLUME_API_VERSION=2
+EOF
+ chown vagrant: ~vagrant/openrc
+
+
+ # Launch a local registry (and mirror) to speed up pulling images.
+ # 0.9.1 is actually the _latest_ tag.
+ if [[ ! $(docker ps -a -q -f name=registry) ]]; then
+ docker run -d \
+ --name registry \
+ --restart=always \
+ -p $REGISTRY_PORT:5000 \
+ -e STANDALONE=True \
+ -e MIRROR_SOURCE=https://registry-1.docker.io \
+ -e MIRROR_SOURCE_INDEX=https://index.docker.io \
+ -e STORAGE_PATH=/var/lib/registry \
+ -v /data/host/registry-storage:/var/lib/registry \
+ registry:0.9.1
+ fi
+}
+
+prep_work
+install_docker
+
+if [ "$1" = "operator" ]; then
+ resize_partition
+ configure_operator
+fi