You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@couchdb.apache.org by ba...@apache.org on 2015/08/16 19:47:25 UTC

[08/23] couchdb-ci git commit: switch to Jenkins master-worker setup

switch to Jenkins master-worker setup

- create first Ubuntu 14.04 worker with latest Erlang
- also, replace master/slave with master/worker everywhere


Project: http://git-wip-us.apache.org/repos/asf/couchdb-ci/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-ci/commit/6515f486
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-ci/tree/6515f486
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-ci/diff/6515f486

Branch: refs/heads/master
Commit: 6515f48652c64d0e030c27cf620c52e1eeb35c50
Parents: bc8a055
Author: Bastian Krol <ba...@web.de>
Authored: Mon Jul 6 09:19:03 2015 +0200
Committer: Bastian Krol <ba...@web.de>
Committed: Mon Jul 6 10:15:53 2015 +0200

----------------------------------------------------------------------
 .../roles/jenkins-master/files/keys/.gitignore  |  1 +
 .../jenkins-master/files/keys/generate-key.sh   |  8 ++++
 ansible/roles/jenkins-master/tasks/main.yml     | 48 ++++++++++++++++++-
 .../templates/jenkins/credentials.xml           | 20 ++++++++
 .../templates/jenkins/jobs/build-couchdb.xml    | 31 +++++++++++++
 .../jenkins/nodes/ubuntu1404/config.xml         | 19 ++++++++
 .../templates/jobs/build-couchdb.xml            | 30 ------------
 .../files/keys/couchdb-ci-rsa.pub               |  1 +
 ansible/roles/jenkins-worker/tasks/main.yml     | 22 +++++++++
 ansible/roles/ubuntu/tasks/main.yml             | 12 ++++-
 ansible/site.yml                                | 20 +++++---
 readme.markdown                                 | 10 ++--
 vagrant/.gitignore                              |  1 +
 vagrant/Vagrantfile                             | 49 ++++++++++++++++++++
 vagrant/jenkins-master/.gitignore               |  1 -
 vagrant/jenkins-master/Vagrantfile              | 36 --------------
 vagrant/readme.markdown                         | 28 +++++++++--
 17 files changed, 254 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/jenkins-master/files/keys/.gitignore
----------------------------------------------------------------------
diff --git a/ansible/roles/jenkins-master/files/keys/.gitignore b/ansible/roles/jenkins-master/files/keys/.gitignore
new file mode 100644
index 0000000..240db6a
--- /dev/null
+++ b/ansible/roles/jenkins-master/files/keys/.gitignore
@@ -0,0 +1 @@
+couchdb-ci-rsa

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/jenkins-master/files/keys/generate-key.sh
----------------------------------------------------------------------
diff --git a/ansible/roles/jenkins-master/files/keys/generate-key.sh b/ansible/roles/jenkins-master/files/keys/generate-key.sh
new file mode 100755
index 0000000..f27c1d9
--- /dev/null
+++ b/ansible/roles/jenkins-master/files/keys/generate-key.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env sh
+
+# This script is not meant to be copied to the Jenkins master. It can be
+# executed locally on the provisioning machine to generate a new keypair for
+# Jenkins' master-worker communication. The public key is copied to the correct
+# location for provisioning the worker. Do not commit the private key go git.
+ssh-keygen -t rsa -N "" -b 4096 -q -f couchdb-ci-rsa
+mv couchdb-ci-rsa.pub ../../../jenkins-worker/files/keys

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/jenkins-master/tasks/main.yml
----------------------------------------------------------------------
diff --git a/ansible/roles/jenkins-master/tasks/main.yml b/ansible/roles/jenkins-master/tasks/main.yml
index 8703d75..f9c32d0 100644
--- a/ansible/roles/jenkins-master/tasks/main.yml
+++ b/ansible/roles/jenkins-master/tasks/main.yml
@@ -16,6 +16,29 @@
       name: jenkins
       state: present
       update_cache: yes # run apt-get update before apt-get install jenkins
+    # jenkins also installs a JDK 7 as its dependency
+
+  - name: make private key dir
+    file:
+      path: /var/lib/jenkins/.ssh
+      state: directory
+      owner: jenkins
+      group: jenkins
+      mode: 0700
+
+  # If this step fails, you are probably missing the private key for
+  # master-worker communication. Please put the key into
+  # ansible/roles/jenkins-master/files/keys/couchdb-ci-rsa before proceeding.
+  # ---
+  # TODO This should be improved! See http://stackoverflow.com/a/29399036, maybe we can use ansible vault.
+  # ---
+  - name: copy private key
+    copy:
+      src: keys/couchdb-ci-rsa
+      dest: /var/lib/jenkins/.ssh/id_rsa
+      owner: jenkins
+      group: jenkins
+      mode: 0600
 
   - name: create build job folder
     file:
@@ -26,7 +49,7 @@
 
   - name: create build job config
     template:
-      src: jobs/build-couchdb.xml
+      src: jenkins/jobs/build-couchdb.xml
       dest: /var/lib/jenkins/jobs/build-couchdb/config.xml
       owner: jenkins
       group: jenkins
@@ -40,6 +63,29 @@
       owner: jenkins
       group: jenkins
 
+  - name: create credentials config for master-worker communication
+    template:
+      src: jenkins/credentials.xml
+      dest: /var/lib/jenkins/credentials.xml
+      owner: jenkins
+      group: jenkins
+    notify: restart jenkins service
+
+  - name: create Ubuntu 14.04 worker folder
+    file:
+      path: /var/lib/jenkins/nodes/ubuntu1404
+      owner: jenkins
+      group: jenkins
+      state: directory
+
+  - name: create Ubuntu 14.04 worker node config
+    template:
+      src: jenkins/nodes/ubuntu1404/config.xml
+      dest: /var/lib/jenkins/nodes/ubuntu1404/config.xml
+      owner: jenkins
+      group: jenkins
+    notify: restart jenkins service
+
   - name: start jenkins service
     service:
       name: jenkins

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/jenkins-master/templates/jenkins/credentials.xml
----------------------------------------------------------------------
diff --git a/ansible/roles/jenkins-master/templates/jenkins/credentials.xml b/ansible/roles/jenkins-master/templates/jenkins/credentials.xml
new file mode 100644
index 0000000..e91d403
--- /dev/null
+++ b/ansible/roles/jenkins-master/templates/jenkins/credentials.xml
@@ -0,0 +1,20 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<com.cloudbees.plugins.credentials.SystemCredentialsProvider plugin="credentials@1.18">
+  <domainCredentialsMap class="hudson.util.CopyOnWriteMap$Hash">
+    <entry>
+      <com.cloudbees.plugins.credentials.domains.Domain>
+        <specifications/>
+      </com.cloudbees.plugins.credentials.domains.Domain>
+      <java.util.concurrent.CopyOnWriteArrayList>
+        <com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey plugin="ssh-credentials@1.10">
+          <scope>GLOBAL</scope>
+          <id>f5ea452c-8774-4f21-9e81-f833212a81c2</id>
+          <description></description>
+          <username>jenkins</username>
+          <passphrase>+uILM8qV9UhKJu4ygwvhXQ==</passphrase>
+          <privateKeySource class="com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$UsersPrivateKeySource"/>
+        </com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
+      </java.util.concurrent.CopyOnWriteArrayList>
+    </entry>
+  </domainCredentialsMap>
+</com.cloudbees.plugins.credentials.SystemCredentialsProvider>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/jenkins-master/templates/jenkins/jobs/build-couchdb.xml
----------------------------------------------------------------------
diff --git a/ansible/roles/jenkins-master/templates/jenkins/jobs/build-couchdb.xml b/ansible/roles/jenkins-master/templates/jenkins/jobs/build-couchdb.xml
new file mode 100644
index 0000000..c603054
--- /dev/null
+++ b/ansible/roles/jenkins-master/templates/jenkins/jobs/build-couchdb.xml
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<project>
+  <actions/>
+  <description></description>
+  <keepDependencies>false</keepDependencies>
+  <properties/>
+  <scm class="hudson.scm.NullSCM"/>
+  <assignedNode>ubuntu1404</assignedNode>
+  <canRoam>false</canRoam>
+  <disabled>false</disabled>
+  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
+  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
+  <triggers/>
+  <concurrentBuild>false</concurrentBuild>
+  <builders>
+    <hudson.tasks.Shell>
+      <command>set -x
+set -e
+
+# TODO: This should obviously pull the code from vcs
+wget http://apache.openmirror.de/couchdb/source/1.6.1/apache-couchdb-1.6.1.tar.gz
+tar xzf apache-couchdb-1.6.1.tar.gz
+cd apache-couchdb-1.6.1
+
+./configure
+make</command>
+    </hudson.tasks.Shell>
+  </builders>
+  <publishers/>
+  <buildWrappers/>
+</project>

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/jenkins-master/templates/jenkins/nodes/ubuntu1404/config.xml
----------------------------------------------------------------------
diff --git a/ansible/roles/jenkins-master/templates/jenkins/nodes/ubuntu1404/config.xml b/ansible/roles/jenkins-master/templates/jenkins/nodes/ubuntu1404/config.xml
new file mode 100644
index 0000000..2c2d190
--- /dev/null
+++ b/ansible/roles/jenkins-master/templates/jenkins/nodes/ubuntu1404/config.xml
@@ -0,0 +1,19 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<slave>
+  <name>ubuntu1404</name>
+  <description></description>
+  <remoteFS>/var/lib/jenkins</remoteFS>
+  <numExecutors>1</numExecutors>
+  <mode>NORMAL</mode>
+  <retentionStrategy class="hudson.slaves.RetentionStrategy$Always"/>
+  <launcher class="hudson.plugins.sshslaves.SSHLauncher" plugin="ssh-slaves@1.9">
+    <host>couchdb-ubuntu-14.04-worker</host>
+    <port>22</port>
+    <credentialsId>f5ea452c-8774-4f21-9e81-f833212a81c2</credentialsId>
+    <maxNumRetries>0</maxNumRetries>
+    <retryWaitTime>0</retryWaitTime>
+  </launcher>
+  <label>ubuntu1404 erlang-latest</label>
+  <nodeProperties/>
+  <userId>anonymous</userId>
+</slave>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/jenkins-master/templates/jobs/build-couchdb.xml
----------------------------------------------------------------------
diff --git a/ansible/roles/jenkins-master/templates/jobs/build-couchdb.xml b/ansible/roles/jenkins-master/templates/jobs/build-couchdb.xml
deleted file mode 100644
index 0892602..0000000
--- a/ansible/roles/jenkins-master/templates/jobs/build-couchdb.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<project>
-  <actions/>
-  <description></description>
-  <keepDependencies>false</keepDependencies>
-  <properties/>
-  <scm class="hudson.scm.NullSCM"/>
-  <canRoam>true</canRoam>
-  <disabled>false</disabled>
-  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
-  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
-  <triggers/>
-  <concurrentBuild>false</concurrentBuild>
-  <builders>
-    <hudson.tasks.Shell>
-      <command>set -x
-set -e
-
-# TODO: This should obviously pull the code from vcs
-wget http://apache.openmirror.de/couchdb/source/1.6.1/apache-couchdb-1.6.1.tar.gz
-tar xzf apache-couchdb-1.6.1.tar.gz
-cd apache-couchdb-1.6.1
-
-./configure
-make</command>
-    </hudson.tasks.Shell>
-  </builders>
-  <publishers/>
-  <buildWrappers/>
-</project>

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/jenkins-worker/files/keys/couchdb-ci-rsa.pub
----------------------------------------------------------------------
diff --git a/ansible/roles/jenkins-worker/files/keys/couchdb-ci-rsa.pub b/ansible/roles/jenkins-worker/files/keys/couchdb-ci-rsa.pub
new file mode 100644
index 0000000..09b8c16
--- /dev/null
+++ b/ansible/roles/jenkins-worker/files/keys/couchdb-ci-rsa.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCZ+XvtXx6vPybYue8bm6q84B44yWE7Fb8bJ2eO7AQIqLXYw8CHCft03w59fBdra6KfuqO3ziZbSJgeOAYBD42zthPSBnvzlLdiGyWc7l3RDuipGYyE/I5WElHJlZWGxeaG8NfByAvc9wvMfUh3IABcxAKQ3SLC6h3WxL1badhyEdUDXB5i5bb1abfaEL0ezkM6w0NlOrvU70zGIccflG4u4eg3hECJVMIo6x0ozACY7fMLrGQ96WWpJuSAxBfi/1E/ipWUhwEsylrccEtiJgBJRBn5NEKrhOZ2GScpxhGf7y1x4xREdglLFao/BU9XkMyOqTtaKdpsl1BzbJ56XrLQiy0uSzgHVzxJOfbg33hAYk/YEVE9UQHoNhpRkQQNBEgak5lPZKxo5ux9/yFh6pM3xr3LpupqHPRAxEc3fzcBODGYcFXxuM396RRNwcAq9HGLgie7tYHKCo7RjsQwIDQrZgBj2kpTqdT4Dv74dobx6Sfe1hpAD0eXyWZojcJeDlPGvsiWjJrFyVorp1Wmkggwthgp/lL6l4J8VTLBZMLDSFu6g0sXy/z8cczcXgJXhnL8QqLTRaFHa6bzGFqFvF7Kawo2mbT/fscf3RUn78gTvZxLjkZ8RmGCHEBsZErir6F4NETGQmos42NWW5fRJFXZc0b0qanIXlaAVo1x5mdoYQ== bastian@krol

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/jenkins-worker/tasks/main.yml
----------------------------------------------------------------------
diff --git a/ansible/roles/jenkins-worker/tasks/main.yml b/ansible/roles/jenkins-worker/tasks/main.yml
new file mode 100644
index 0000000..c67e6f4
--- /dev/null
+++ b/ansible/roles/jenkins-worker/tasks/main.yml
@@ -0,0 +1,22 @@
+---
+ - name: create jenkins group
+   group:
+     name: jenkins
+     gid: 112 # same gid as jenkins group on master
+     state: present
+     system: yes
+
+ - name: create jenkins user
+   user:
+     name: jenkins
+     uid: 106 # same uid as jenkins user on master
+     state: present
+     system: yes
+     group: jenkins
+     home: "/var/lib/jenkins"
+
+ - name: add public key
+   authorized_key:
+     user: jenkins
+     key: "{{ lookup('file', 'keys/couchdb-ci-rsa.pub') }}"
+     manage_dir: yes

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/roles/ubuntu/tasks/main.yml
----------------------------------------------------------------------
diff --git a/ansible/roles/ubuntu/tasks/main.yml b/ansible/roles/ubuntu/tasks/main.yml
index fa87799..be62db0 100644
--- a/ansible/roles/ubuntu/tasks/main.yml
+++ b/ansible/roles/ubuntu/tasks/main.yml
@@ -1,7 +1,15 @@
 ---
-  # TODO These packages are required to build Couch. Maybe a ubuntu-build-slave
+  # even though we do not need Java to build CouchDB, a Jenkins worker still
+  # needs an installed JDK or the Jenkins master yells at you when attempting to
+  # connect
+  - name: install jdk
+    apt:
+      name: openjdk-7-jdk
+      state: present
+
+  # TODO These packages are required to build Couch. Maybe a ubuntu-build-worker
   # role would make more sense in the long run. Jenkins master does not need
-  # this packages once we use a master slave setup.
+  # this packages once we use a master-worker setup.
   - name: install packages required to build CouchDB
     apt: name={{item}} state=present
     with_items:

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/ansible/site.yml
----------------------------------------------------------------------
diff --git a/ansible/site.yml b/ansible/site.yml
index 43d7d92..fc757a4 100644
--- a/ansible/site.yml
+++ b/ansible/site.yml
@@ -5,14 +5,22 @@
   roles:
   - common
 
-# Apply common configuration for all Ubuntu systems
-- hosts: ubuntu
-  remote_user: root
-  roles:
-  - ubuntu
-
 # Configure and deploy Jenkins master
 - hosts: jenkins-master
   remote_user: root
   roles:
   - jenkins-master
+
+# Configure and deploy Jenkins workers
+- hosts: jenkins-workers
+  remote_user: root
+  roles:
+  - jenkins-worker
+
+# Apply common configuration for all Ubuntu systems
+# TODO Currently this only contains packages needed on the workers, so rename
+# this role to ubuntu-worker
+- hosts: ubuntu
+  remote_user: root
+  roles:
+  - ubuntu

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/readme.markdown
----------------------------------------------------------------------
diff --git a/readme.markdown b/readme.markdown
index 6a5a828..fc69795 100644
--- a/readme.markdown
+++ b/readme.markdown
@@ -12,10 +12,14 @@ Current state:
 - [x] install bare Jenkins master with Ansible
 - [x] install and configure nginx
 - [x] create CouchDB build job in Jenkins via Ansible
+- [x] switch to master-worker Jenkins setup
+- [ ] use Ansible vault for key management?
+- [ ] use ntp server for master and workers
 - [ ] actually fetch CouchDB from VCS
-- [ ] switch to master slave Jenkins setup
 - [ ] optional: switch to Jenkins Job DSL plug-in for defining jobs?
 - [ ] all apt-get commands should pin a specific version, in the base box definition as well as in Ansible. How?
-- [ ] create an additional Ubuntu slave with an older Erlang version
-- [ ] create another base box (different linux distro) for a third slave
+- [ ] create an additional Ubuntu worker with an older Erlang version
+- [ ] create another base box (different linux distro) for a third worker
 - [ ] talk to Infra people
+
+*Remark: Throughout this repository we use the terms "master"/"worker" for the Jenkins build machines, whereas the Jenkins documentation uses the terms "master"/"slave".*

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/vagrant/.gitignore
----------------------------------------------------------------------
diff --git a/vagrant/.gitignore b/vagrant/.gitignore
new file mode 100644
index 0000000..8000dd9
--- /dev/null
+++ b/vagrant/.gitignore
@@ -0,0 +1 @@
+.vagrant

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/vagrant/Vagrantfile
----------------------------------------------------------------------
diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile
new file mode 100644
index 0000000..e42bd28
--- /dev/null
+++ b/vagrant/Vagrantfile
@@ -0,0 +1,49 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure
+# configures the configuration version (we support older styles for
+# backwards compatibility).
+Vagrant.configure(2) do |config|
+
+  # How much memory does the master need to test the setup? How much do the
+  # workers need? I have no clue.
+  config.vm.provider "virtualbox" do |vb|
+    vb.memory = "1024"
+    # vb.gui = true # enable this to start vbox with GUI to debug problems on startup
+  end
+
+  # The base boxes also have the Vagrant ssh key copied into root's
+  # authorized_keys so we can ssh into the box via root. This way, there is no
+  # mention of the user vagrant in the Ansible scripts.
+  config.ssh.username = "root"
+
+  config.vm.define "couchdb-jenkins-master" do |node|
+    node.vm.box = "couchdb-ci-ubuntu-14.04"
+    node.vm.hostname = "master"
+    node.vm.network "forwarded_port", guest:   80, host: 10080
+    node.vm.network "forwarded_port", guest: 8080, host: 18080
+    node.vm.network "private_network", ip: "10.20.1.2"
+    node.vm.provision :hosts
+  end
+
+  config.vm.define "couchdb-ubuntu-14.04-worker" do |node|
+    node.vm.box = "couchdb-ci-ubuntu-14.04"
+    node.vm.hostname = "ubuntu1404"
+    node.vm.network "private_network", ip: "10.20.1.3"
+    node.vm.provision :hosts
+  end
+
+
+  # Workaround for "stdin: is not a tty error" -- make Vagrants ssh shell a
+  # non-login one. See https://github.com/mitchellh/vagrant/issues/1673#issuecomment-28288042
+  config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"
+
+  config.vm.provision "ansible" do |ansible|
+    ansible.playbook = "../ansible/site.yml"
+    ansible.groups = {
+      "jenkins-master" => ["couchdb-jenkins-master"],
+      "jenkins-workers" => ["couchdb-ubuntu-14.04-worker"],
+      "ubuntu" => ["couchdb-ubuntu-14.04-worker"]
+    }
+  end
+
+end

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/vagrant/jenkins-master/.gitignore
----------------------------------------------------------------------
diff --git a/vagrant/jenkins-master/.gitignore b/vagrant/jenkins-master/.gitignore
deleted file mode 100644
index 8000dd9..0000000
--- a/vagrant/jenkins-master/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-.vagrant

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/vagrant/jenkins-master/Vagrantfile
----------------------------------------------------------------------
diff --git a/vagrant/jenkins-master/Vagrantfile b/vagrant/jenkins-master/Vagrantfile
deleted file mode 100644
index c24fdc6..0000000
--- a/vagrant/jenkins-master/Vagrantfile
+++ /dev/null
@@ -1,36 +0,0 @@
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-
-# All Vagrant configuration is done below. The "2" in Vagrant.configure
-# configures the configuration version (we support older styles for
-# backwards compatibility).
-Vagrant.configure(2) do |config|
-  config.vm.box = "couchdb-ci-ubuntu-14.04"
-
-  # How much memory do we need to test the setup? I have no clue.
-  config.vm.provider "virtualbox" do |vb|
-    vb.memory = "1024"
-  end
-
-  # The base box also copies the Vagrant ssh key into root's authorized_keys
-  # so we can ssh into the box via root. This way, there is no mention of the
-  # user vagrant in the Ansible scripts.
-  config.ssh.username = 'root'
-
-  config.vm.define "couchdb-jenkins-master"
-
-  # Workaround for "stdin: is not a tty error" -- make Vagrants ssh shell a
-  # non-login one. See https://github.com/mitchellh/vagrant/issues/1673#issuecomment-28288042
-  config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"
-
-  config.vm.provision "ansible" do |ansible|
-    ansible.playbook = "../../ansible/site.yml"
-    ansible.groups = {
-      "jenkins-master" => ["couchdb-jenkins-master"],
-      "ubuntu" => ["couchdb-jenkins-master"],
-    }
-  end
-
-  config.vm.network "forwarded_port", guest:   80, host: 10080
-  config.vm.network "forwarded_port", guest: 8080, host: 18080
-end

http://git-wip-us.apache.org/repos/asf/couchdb-ci/blob/6515f486/vagrant/readme.markdown
----------------------------------------------------------------------
diff --git a/vagrant/readme.markdown b/vagrant/readme.markdown
index 141127c..81a2992 100644
--- a/vagrant/readme.markdown
+++ b/vagrant/readme.markdown
@@ -1,15 +1,30 @@
 Vagrant Configuration for Testing the CouchDB CI Setup Locally
 ==============================================================
 
-Each sub folder in this directory contains the Vagrant configuration for one of the machines used in the CouchDB CI setup.
+This folder contains the multi machine Vagrant configuration for the machines used in the CouchDB CI setup.
 
 ## Prerequesites
 
 You need to have [Vagrant](https://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) installed.
 
+When Vagrant is installed you need to install an additional plug-in:
+```bash
+vagrant plugin install vagrant-hosts
+```
+
+Also, you might need to run
+```bash
+VBoxManage dhcpserver remove --netname HostInterfaceNetworking-vboxnet0
+```
+before doing
+```bash
+vagrant up
+```
+because of <https://github.com/mitchellh/vagrant/issues/3083>.
+
 ## Building and Registering the Base Box
 
-Each vagrant configuration requires its respective base box. For example, the configuration couchdb-jenkins-master requires the base box `couchdb-ci-ubuntu-14.04`. You can build the base boxes locally with veewee (see `../baseboxes/readme.markdown`). To make things easier we might upload the base boxes somewhere so people do not have to build them theirselves but can just download them but we are not there yet.
+Each vagrant configuration requires its respective base box. For example, the configuration jenkins-master requires the base box `couchdb-ci-ubuntu-14.04`. You can build the base boxes locally with veewee (see `../baseboxes/readme.markdown`). To make things easier we might upload the base boxes somewhere so people do not have to build them theirselves but can just download them but we are not there yet.
 
 Either way, you have to add the image to the vagrant base image registry with the following command:
 ```
@@ -20,6 +35,11 @@ When this has happened, `vagrant box list` should list the base box's name (`cou
 
 The base box built with veewee is just a fresh minimal install of the OS. All relevant packages and configurations are provisioned with Ansible. Vagrant is used to make creating, provisioning and destroying these virtual machines easier.
 
-## Launching and Provisioning the Box
+## Launching and Provisioning the Boxes
+
+Just execute `vagrant up`. This will start all the virtual machine and provision it using the scripts in `../ansible`. That's it :-)
 
-Just execute `vagrant up`. This will start the virtual machine and provision it using the scripts in `../ansible`. That's it :-)
+You can also selectively launch a single box, for example with
+```bash
+vagrant up couchdb-jenkins-master
+```