From 3b92e8714fc9a2e10cdbd73e36c05c838ba55852 Mon Sep 17 00:00:00 2001 From: Steven Dake Date: Wed, 7 Oct 2015 23:18:40 -0700 Subject: Move around the development environments THe top level dev directory is now used to store the heat and vagrant development environments. backport: liberty TrivialFix Change-Id: Ib0922b90eacaa8518aee09cdeb46f4ac0437e015 --- dev/vagrant/Vagrantfile | 168 +++++++++++++++++++++++++++++++++++++++++++++++ dev/vagrant/bootstrap.sh | 154 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 322 insertions(+) create mode 100644 dev/vagrant/Vagrantfile create mode 100644 dev/vagrant/bootstrap.sh (limited to 'dev/vagrant') 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 < ~/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 < ~vagrant/openrc <