diff --git a/.gitignore b/.gitignore index 29fea274..3683e584 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ ChangeLog # Vagrant .vagrant vagrant/Vagrantfile.custom +vagrant/vagrantkey* # generated openrc openrc diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index c38b469b..af29b240 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -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 diff --git a/vagrant/Vagrantfile.custom.example b/vagrant/Vagrantfile.custom.example index bed8ffac..28c2e1fd 100644 --- a/vagrant/Vagrantfile.custom.example +++ b/vagrant/Vagrantfile.custom.example @@ -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, diff --git a/vagrant/provision.sh b/vagrant/provision.sh index 74c27d9d..6f7dbd80 100644 --- a/vagrant/provision.sh +++ b/vagrant/provision.sh @@ -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