mirror of
https://github.com/jpetazzo/container.training.git
synced 2026-07-18 20:39:17 +00:00
Merge pull request #15 from schrodervictor/adds-local-environment
Adds local environment
This commit is contained in:
1
prepare-local/.gitignore
vendored
Normal file
1
prepare-local/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.vagrant
|
||||
85
prepare-local/README.md
Normal file
85
prepare-local/README.md
Normal file
@@ -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
|
||||
78
prepare-local/Vagrantfile
vendored
Normal file
78
prepare-local/Vagrantfile
vendored
Normal file
@@ -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
|
||||
10
prepare-local/ansible.cfg
Normal file
10
prepare-local/ansible.cfg
Normal file
@@ -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
|
||||
11
prepare-local/inventory
Normal file
11
prepare-local/inventory
Normal file
@@ -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
|
||||
27
prepare-local/private-key
Normal file
27
prepare-local/private-key
Normal file
@@ -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-----
|
||||
142
prepare-local/provisioning.yml
Normal file
142
prepare-local/provisioning.yml
Normal file
@@ -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 }}"
|
||||
3
prepare-local/ssh-config
Normal file
3
prepare-local/ssh-config
Normal file
@@ -0,0 +1,3 @@
|
||||
Host node*
|
||||
IdentityFile ~/private-key
|
||||
StrictHostKeyChecking no
|
||||
41
prepare-local/vagrant.yml
Normal file
41
prepare-local/vagrant.yml
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user