diff --git a/prepare-local/.gitignore b/prepare-local/.gitignore new file mode 100644 index 00000000..8000dd9d --- /dev/null +++ b/prepare-local/.gitignore @@ -0,0 +1 @@ +.vagrant diff --git a/prepare-local/README.md b/prepare-local/README.md new file mode 100644 index 00000000..639cee22 --- /dev/null +++ b/prepare-local/README.md @@ -0,0 +1,85 @@ +DOCKER ORCHESTRATION (local environment instructions) +===================================================== + +Instead of running this training on a cloud provider, you can simulate the +infrastructure locally. These instructions apply to the **PART ONE** of the +workshop. + + +## 1. Prerequisites + +Virtualbox, Vagrant and Ansible + +- Virtualbox: https://www.virtualbox.org/wiki/Downloads + +- Vagrant: https://www.vagrantup.com/downloads.html + +- Ansible: + - install Ansible's prerequisites: + + $ sudo pip install paramiko PyYAML Jinja2 httplib2 six + + - clone the Ansible repository and checkout to a stable version + (don't forget the `--recursive` argument when cloning!): + + $ git clone --recursive https://github.com/ansible/ansible.git + $ cd ansible + $ git checkout stable-2.0.0.1 + $ git submodule update + + - source the setup script to make Ansible available on this terminal session: + + $ source path/to/your-ansible-clone/hacking/env-setup + + - you need to repeat the last step everytime you open a new terminal session + and want to use any Ansible command (but you'll probably only need to run + it once). + + +## 2. Preparing the environment + +Run the following commands: + + $ vagrant up + $ ansible-playbook provisioning.yml + +And that's it! Now you should be able to ssh on `node1` using: + + $ ssh vagrant@10.10.10.10 -i private-key + +These are the default IP addresses for the nodes: + + 10.10.10.10 node1 + 10.10.10.20 node2 + 10.10.10.30 node3 + 10.10.10.40 node4 + 10.10.10.50 node5 + +The source code of this repo will be mounted at `~/orchestration-workshop` +(only on the `node1`), so you can edit the code externally and the changes +will reflect inside the instance. + + +## 3. Possible problems and solutions + +- Depending on the Vagrant version, `sudo apt-get install bsdtar` may be needed + +- If you get strange Ansible errors about dependencies, try to check your pip + version with `pip --version`. The current version is 8.1.1. If your pip is + older than this, upgrade it with `sudo pip install --upgrade pip`, restart + your terminal session and install the Ansible prerequisites again. + +- If the IP's `10.10.10.[10-50]` are already taken in your machine, you can + change them to other values in the `vagrant.yml` and `inventory` files in + this directory. Make sure you pick a set of IP's inside the same subnet. + +- If you suspend your computer, the simulated private network may stop to + work. This is a known problem of Virtualbox. To fix it, reload all the VM's + with `vagrant reload`. + +- If you get a ssh error saying `WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED` + it means that you already had in the past some other host using one of the + IP addresses we use here. To solve this, remove the old entry in your + `known_hosts` file with: + + $ ssh-keygen -f "~/.ssh/known_hosts" -R 10.10.10.10 -R 10.10.10.20 -R 10.10.10.30 -R 10.10.10.40 -R 10.10.10.50 diff --git a/prepare-local/Vagrantfile b/prepare-local/Vagrantfile new file mode 100644 index 00000000..af535089 --- /dev/null +++ b/prepare-local/Vagrantfile @@ -0,0 +1,78 @@ +# vim: set filetype=ruby: +require 'yaml' +require 'vagrant-vbguest' unless defined? VagrantVbguest::Config + +configuration_file = File.expand_path("vagrant.yml", File.dirname(__FILE__)) +configuration = YAML.load_file configuration_file +settings = configuration['vagrant'] +instances = configuration['instances'] + +$enable_serial_logging = false + +Vagrant.configure('2') do |config| + + def check_dependency(plugin_name) + unless Vagrant.has_plugin?(plugin_name) + puts "Vagrant [" + plugin_name + "] is required but is not installed\n" + + "please check if you have the plugin with the following command:\n" + + " $ vagrand plugin list\n" + + "If needed install the plugin:\n" + + " $ vagrant plugin install " + plugin_name + "\n" + abort "Missing [" + plugin_name + "] plugin\n\n" + end + end + + check_dependency 'vagrant-vbguest' + + config.vm.box = settings['default_box'] + config.vm.box_url = settings['default_box_url'] + config.ssh.forward_agent = true + config.ssh.insert_key = settings['ssh_insert_key'] + config.vm.box_check_update = true + config.vbguest.auto_update = false + + instances.each do |instance| + + next if instance.has_key? 'deactivated' and instance['deactivated'] + + config.vm.define instance['hostname'] do |guest| + + if instance.has_key? 'box' + guest.vm.box = instance['box'] + end + if instance.has_key? 'box_url' + guest.vm.box_url = instance['box_url'] + end + + if instance.has_key? 'private_ip' + guest.vm.network 'private_network', ip: instance['private_ip'] + end + + guest.vm.provider 'virtualbox' do |vb| + if instance.has_key? 'cpu_execution_cap' + vb.customize ["modifyvm", :id, "--cpuexecutioncap", instance['cpu_execution_cap'].to_s] + end + + vb.customize ["modifyvm", :id, "--nictype1", "virtio"] + vb.customize ["modifyvm", :id, "--nictype2", "virtio"] + + if instance.has_key? 'memory' + vb.memory = instance['memory'] + end + + if instance.has_key? 'cores' + vb.cpus = instance['cores'] + end + end + + if instance.has_key? 'mounts' + instance['mounts'].each do |mount| + guest.vm.synced_folder mount['host_path'], mount['guest_path'], owner: mount['owner'], group: mount['group'] + end + end + + end + + end + +end diff --git a/prepare-local/ansible.cfg b/prepare-local/ansible.cfg new file mode 100644 index 00000000..d10694f4 --- /dev/null +++ b/prepare-local/ansible.cfg @@ -0,0 +1,10 @@ +[defaults] +nocows = True +inventory = inventory +remote_user = vagrant +private_key_file = private-key +host_key_checking = False +deprecation_warnings = False + +[ssh_connection] +ssh_args = -o StrictHostKeyChecking=no diff --git a/prepare-local/inventory b/prepare-local/inventory new file mode 100644 index 00000000..e3cb5444 --- /dev/null +++ b/prepare-local/inventory @@ -0,0 +1,11 @@ +node1 ansible_ssh_host=10.10.10.10 +node2 ansible_ssh_host=10.10.10.20 +node3 ansible_ssh_host=10.10.10.30 +node4 ansible_ssh_host=10.10.10.40 +node5 ansible_ssh_host=10.10.10.50 + +[nodes] +node[1:5] + +[all:children] +nodes diff --git a/prepare-local/private-key b/prepare-local/private-key new file mode 100644 index 00000000..7d6a0839 --- /dev/null +++ b/prepare-local/private-key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzI +w+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoP +kcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2 +hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NO +Td0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcW +yLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQIBIwKCAQEA4iqWPJXtzZA68mKd +ELs4jJsdyky+ewdZeNds5tjcnHU5zUYE25K+ffJED9qUWICcLZDc81TGWjHyAqD1 +Bw7XpgUwFgeUJwUlzQurAv+/ySnxiwuaGJfhFM1CaQHzfXphgVml+fZUvnJUTvzf +TK2Lg6EdbUE9TarUlBf/xPfuEhMSlIE5keb/Zz3/LUlRg8yDqz5w+QWVJ4utnKnK +iqwZN0mwpwU7YSyJhlT4YV1F3n4YjLswM5wJs2oqm0jssQu/BT0tyEXNDYBLEF4A +sClaWuSJ2kjq7KhrrYXzagqhnSei9ODYFShJu8UWVec3Ihb5ZXlzO6vdNQ1J9Xsf +4m+2ywKBgQD6qFxx/Rv9CNN96l/4rb14HKirC2o/orApiHmHDsURs5rUKDx0f9iP +cXN7S1uePXuJRK/5hsubaOCx3Owd2u9gD6Oq0CsMkE4CUSiJcYrMANtx54cGH7Rk +EjFZxK8xAv1ldELEyxrFqkbE4BKd8QOt414qjvTGyAK+OLD3M2QdCQKBgQDtx8pN +CAxR7yhHbIWT1AH66+XWN8bXq7l3RO/ukeaci98JfkbkxURZhtxV/HHuvUhnPLdX +3TwygPBYZFNo4pzVEhzWoTtnEtrFueKxyc3+LjZpuo+mBlQ6ORtfgkr9gBVphXZG +YEzkCD3lVdl8L4cw9BVpKrJCs1c5taGjDgdInQKBgHm/fVvv96bJxc9x1tffXAcj +3OVdUN0UgXNCSaf/3A/phbeBQe9xS+3mpc4r6qvx+iy69mNBeNZ0xOitIjpjBo2+ +dBEjSBwLk5q5tJqHmy/jKMJL4n9ROlx93XS+njxgibTvU6Fp9w+NOFD/HvxB3Tcz +6+jJF85D5BNAG3DBMKBjAoGBAOAxZvgsKN+JuENXsST7F89Tck2iTcQIT8g5rwWC +P9Vt74yboe2kDT531w8+egz7nAmRBKNM751U/95P9t88EDacDI/Z2OwnuFQHCPDF +llYOUI+SpLJ6/vURRbHSnnn8a/XG+nzedGH5JGqEJNQsz+xT2axM0/W/CRknmGaJ +kda/AoGANWrLCz708y7VYgAtW2Uf1DPOIYMdvo6fxIB5i9ZfISgcJ/bbCUkFrhoH ++vq/5CIWxCPp0f85R4qxxQ5ihxJ0YDQT9Jpx4TMss4PSavPaBH3RXow5Ohe+bYoQ +NE5OgEXk2wVfZczCZpigBKbKZHNYcelXtTt/nP3rsCuGcM4h53s= +-----END RSA PRIVATE KEY----- diff --git a/prepare-local/provisioning.yml b/prepare-local/provisioning.yml new file mode 100644 index 00000000..28654450 --- /dev/null +++ b/prepare-local/provisioning.yml @@ -0,0 +1,142 @@ +--- +- hosts: nodes + sudo: true + vars_files: + - vagrant.yml + tasks: + + - name: clean up the home folder + file: + path: /home/vagrant/{{ item }} + state: absent + with_items: + - base.sh + - chef.sh + - cleanup.sh + - cleanup-virtualbox.sh + - puppetlabs-release-wheezy.deb + - puppet.sh + - ruby.sh + - vagrant.sh + - virtualbox.sh + - zerodisk.sh + + - name: installing dependencies + apt: + name: apt-transport-https,ca-certificates,python-pip,tmux + state: present + update_cache: true + + - name: fetching docker repo key + apt_key: + keyserver: hkp://p80.pool.sks-keyservers.net:80 + id: 58118E89F3A912897C070ADBF76221572C52609D + + - name: adding package repos + apt_repository: + repo: "{{ item }}" + state: present + with_items: + - deb http://http.debian.net/debian wheezy-backports main + - deb https://apt.dockerproject.org/repo {{ ansible_lsb.id|lower }}-{{ ansible_lsb.codename }} main + + - name: installing docker + apt: + name: docker-engine + state: present + update_cache: true + + - name: adding user vagrant to group docker + user: + name: vagrant + groups: docker + append: yes + + - name: making docker daemon listen to port 55555 + lineinfile: + dest: /etc/default/docker + line: DOCKER_OPTS="--host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:55555" + regexp: '^#?DOCKER_OPTS=.*$' + state: present + register: docker_opts + + - name: restarting docker daemon, if needed + service: + name: docker + state: restarted + when: docker_opts is defined and docker_opts.changed + + - name: performing pip autoupgrade + pip: + name: pip + state: latest + + - name: installing virtualenv + pip: + name: virtualenv + state: latest + + - name: creating docker-compose folder + file: + path: /opt/docker-compose + state: directory + register: docker_compose_folder + + - name: creating virtualenv for docker-compose + shell: virtualenv /opt/docker-compose + when: docker_compose_folder is defined and docker_compose_folder.changed + + - name: installing docker-compose + pip: + name: docker-compose + state: latest + virtualenv: /opt/docker-compose + + - name: making the docker-compose command available to user + lineinfile: + dest: .bashrc + line: "alias docker-compose='/opt/docker-compose/bin/docker-compose'" + state: present + regexp: '^alias docker-compose=.*$' + + - name: building the /etc/hosts file with all nodes + lineinfile: + dest: /etc/hosts + line: "{{ item.private_ip }} {{ item.hostname }}" + regexp: "^{{ item.private_ip }} {{ item.hostname }}$" + state: present + with_items: instances + + - name: copying the ssh key to the nodes + copy: + src: private-key + dest: /home/vagrant/private-key + mode: 0600 + group: root + owner: vagrant + + - name: copying ssh configuration + copy: + src: ssh-config + dest: /home/vagrant/.ssh/config + mode: 0600 + group: root + owner: vagrant + + - name: fixing the hostname + hostname: + name: "{{ inventory_hostname }}" + + - name: adjusting the /etc/hosts to the new hostname + lineinfile: + dest: /etc/hosts + regexp: "{{ item.regexp }}" + line: "{{ item.line }}" + owner: root + group: root + mode: 0644 + with_items: + - regexp: '^127\.0\.0\.1' + line: "127.0.0.1 localhost {{ inventory_hostname }}" + - regexp: '^127\.0\.1\.1' + line: "127.0.1.1 {{ inventory_hostname }}" diff --git a/prepare-local/ssh-config b/prepare-local/ssh-config new file mode 100644 index 00000000..3fa9086b --- /dev/null +++ b/prepare-local/ssh-config @@ -0,0 +1,3 @@ +Host node* + IdentityFile ~/private-key + StrictHostKeyChecking no diff --git a/prepare-local/vagrant.yml b/prepare-local/vagrant.yml new file mode 100644 index 00000000..544aead7 --- /dev/null +++ b/prepare-local/vagrant.yml @@ -0,0 +1,41 @@ +--- +vagrant: + + default_box: debian-7.2.0 + default_box_url: https://dl.dropboxusercontent.com/u/197673519/debian-7.2.0.box + default_box_check_update: true + ssh_insert_key: false + min_memory: 256 + min_cores: 1 + +instances: + + - hostname: node1 + private_ip: 10.10.10.10 + memory: 512 + cores: 1 + mounts: + - host_path: ../ + guest_path: /home/vagrant/orchestration-workshop + owner: vagrant + group: vagrant + + - hostname: node2 + private_ip: 10.10.10.20 + memory: 512 + cores: 1 + + - hostname: node3 + private_ip: 10.10.10.30 + memory: 512 + cores: 1 + + - hostname: node4 + private_ip: 10.10.10.40 + memory: 512 + cores: 1 + + - hostname: node5 + private_ip: 10.10.10.50 + memory: 512 + cores: 1