Merge pull request #92 from lowescott/ubu-sw-mode

Add learning environment for running a local Docker Swarm mode cluster
This commit is contained in:
Scott S. Lowe 2017-09-14 07:17:33 -06:00 committed by GitHub
commit 99bdc12926
7 changed files with 273 additions and 0 deletions

View file

@ -0,0 +1,41 @@
# Running a Docker Swarm Mode Cluster Locally
These files were created to allow users to use Vagrant ([http://www.vagrantup.com](http://www.vagrantup.com)) and Ansible ([http://www.ansible.com](http://www.ansible.com)) to quickly and relatively easily spin up a Docker Swarm mode cluster.
## Contents
* **ansible.cfg**: This Ansible configuration file supplies configuration to Ansible to streamline integration with the Vagrant Ansible provisioner.
* **create-swarm.yml**: This Ansible playbook configures a group of VMs (created by Vagrant) to be a Docker Swarm cluster.
* **destroy-swarm.yml**: This Ansible playbook forcefully destroys the Docker Swarm mode cluster.
* **machines.yml**: This YAML file contains a list of VM definitions. It is referenced by `Vagrantfile` when Vagrant instantiates the VMs. Generally, the only change needed to this file is to specify the correct Vagrant box you will be used (see "Instructions" below). If necessary, you may need to edit the IP addresses supplied in this file to avoid IP addressing conflicts with other networks.
* **provision.yml**: This is the Ansible playbook that will perform a very light edit to the VMs, primarily for the purpose of creating the appropriate Ansible inventory file by the . No edits to this file should be necessary.
* **README.md**: This file you're currently reading.
* **Vagrantfile**: This file is used by Vagrant to spin up the virtual machines. This file is fairly extensively commented to help explain what's happening. You should be able to use this file unchanged; all the VM configuration options are stored outside this file.
## Instructions
These instructions assume you've already installed your virtualization provider (typically VirtualBox, VMware Fusion, or VMware Workstation), Vagrant, any necessary Vagrant plugins, and Ansible. Please refer to the documentation for those products for more information on installation or configuration.
1. Use `vagrant box add` to install an Ubuntu 14.04 x64 box for the vmware_fusion provider. The "bento/ubuntu-14.04" box is a good option here.
2. Place the files from the `docker/ubuntu-swarm-mode` directory of this GitHub repository into a directory on your local system. You can clone the entire "learning-tools" repository (using `git clone`) or just download the specific files from the the `docker/ubuntu-swarm-mode` folder.
3. Edit the `machines.yml` file to specify the box you will use (as specified in step 1). If necessary to avoid IP address conflicts with existing networks, you may also need to edit the IP addresses specified in this file. Generally, no other changes are needed, although (if you are comfortable with the settings) you can adjust the number of virtual CPUs and/or the amount of RAM assigned to each Vagrant VM in this file as well. Note that this environment _assumes_ the presence of an `eth1` in each Vagrant VM; therefore, do not remove the "ip_addr" value from `machines.yml`.
4. Once you have edited `machines.yml`, use `vagrant up` to bring up the systems that will serve as your Swarm mode cluster. As part of the process of running `vagrant up`, you'll see Ansible perform a quick task on each VM.
5. Once Vagrant has finished bringing up the VMs, run `ansible-playbook create-swarm.yml`. This will configure the VMs and get a Docker Swarm mode cluster up and running.
At this point, you have a functional Docker Swarm mode cluster. You should have IP connectivity to the hosts, and you can log into the manager and run `docker node ls` to see the nodes in the Swarm mode cluster.
Enjoy!
## License
This content is licensed under the MIT License.

74
docker/ubuntu-swarm-mode/Vagrantfile vendored Normal file
View file

@ -0,0 +1,74 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Specify minimum Vagrant version and Vagrant API version
Vagrant.require_version '>= 1.6.0'
VAGRANTFILE_API_VERSION = '2'
# Require 'yaml' module
require 'yaml'
# Read YAML file with VM details (box, CPU, RAM, IP addresses)
# Edit machines.yml to change VM configuration details
machines = YAML.load_file(File.join(File.dirname(__FILE__), 'machines.yml'))
# Create and configure the VMs
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Always use Vagrant's default insecure key
config.ssh.insert_key = false
# Iterate through entries in YAML file to create VMs
machines.each do |machine|
# Configure the VMs per details in machines.yml
config.vm.define machine['name'] do |srv|
# Don't check for box updates
srv.vm.box_check_update = false
# Specify the hostname of the VM
srv.vm.hostname = machine['name']
# Specify the Vagrant box to use (use VMware box by default)
srv.vm.box = machine['box']['vmw']
# Configure default synced folder (disable by default)
if machine['sync_disabled'] != nil
srv.vm.synced_folder '.', '/vagrant', disabled: machine['sync_disabled']
else
srv.vm.synced_folder '.', '/vagrant', disabled: true
end #if machine['sync_disabled']
# Iterate through networks as per settings in machines.yml
machine['nics'].each do |net|
if net['ip_addr'] == 'dhcp'
srv.vm.network net['type'], type: net['ip_addr']
else
srv.vm.network net['type'], ip: net['ip_addr']
end # if net['ip_addr']
end # machine['nics'].each
# Configure CPU & RAM per settings in machines.yml (Fusion)
srv.vm.provider 'vmware_fusion' do |vmw|
vmw.vmx['memsize'] = machine['ram']
vmw.vmx['numvcpus'] = machine['vcpu']
if machine['nested'] == true
vmw.vmx['vhv.enable'] = 'TRUE'
end #if machine['nested']
end # srv.vm.provider 'vmware_fusion'
# Configure CPU & RAM per settings in machines.yml (VirtualBox)
srv.vm.provider 'virtualbox' do |vb, override|
vb.memory = machine['ram']
vb.cpus = machine['vcpu']
override.vm.box = machine['box']['vb']
end # srv.vm.provider 'virtualbox'
end # config.vm.define
end # machines.each
# Run simple Ansible playbook
config.vm.provision 'ansible' do |ansible|
ansible.playbook = 'provision.yml'
end # config.vm.provision
end # Vagrant.configure

View file

@ -0,0 +1,8 @@
[defaults]
inventory = .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory
private_key_file = ~/.vagrant.d/insecure_private_key
remote_user = vagrant
host_key_checking = false
[ssh_connection]
ssh_args = -o IdentityFile=/home/slowe/.vagrant.d/insecure_private_key -o PubKeyAuthentication=yes -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=~/.ansible/cp/ansible-ssh-%h-%p-%r

View file

@ -0,0 +1,86 @@
---
- hosts: "all"
become: "yes"
remote_user: "vagrant"
tasks:
- name: "Install Pip"
apt:
name: "python-pip"
state: "present"
update_cache: "yes"
tags:
- manager
- worker
- name: "Install some Python modules"
pip:
name: "{{ item }}"
state: "present"
with_items:
- "urllib3"
- "pyopenssl"
- "ndg-httpsclient"
- "pyasn1"
tags:
- manager
- worker
- name: "Install Docker APT Key"
apt_key:
url: "https://download.docker.com/linux/ubuntu/gpg"
state: "present"
tags:
- manager
- worker
- name: "Add Docker repository"
apt_repository:
repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu trusty stable"
state: "present"
update_cache: "yes"
tags:
- manager
- worker
- name: "Install Docker CE"
package:
name: "docker-ce"
state: "present"
tags:
- manager
- worker
- name: "Add user to Docker group"
user:
name: "{{ ansible_ssh_user }}"
group: "docker"
append: "yes"
tags:
- manager
- worker
- name: "Initialize Docker Swarm from manager"
command: "docker swarm init --advertise-addr {{ ansible_eth1.ipv4.address }}"
when: ansible_hostname == 'manager'
tags:
- manager
- name: "Register Swarm join token"
command: "docker swarm join-token -q worker"
register: swarm_token
when: ansible_hostname == 'manager'
tags:
- manager
- name: "Establish Swarm join token as a host fact"
set_fact: swarmtoken="{{ swarm_token.stdout }}"
when: ansible_hostname == 'manager'
tags:
- manager
- name: "Join worker nodes to Swarm cluster"
command: "docker swarm join --advertise-addr {{ ansible_eth1.ipv4.address }} --token {{ hostvars['manager'].swarmtoken }} {{ hostvars['manager']['ansible_eth1']['ipv4']['address'] }}:2377"
when: ansible_hostname != 'manager'
tags:
- worker

View file

@ -0,0 +1,8 @@
---
- hosts: "all"
become: "yes"
remote_user: "vagrant"
tasks:
- name: "Leave Swarm cluster"
command: "docker swarm leave --force"

View file

@ -0,0 +1,46 @@
---
- box:
vmw: "bento/ubuntu-14.04"
vb: "bento/ubuntu-14.04"
name: "manager"
nics:
- type: "private_network"
ip_addr: "192.168.100.100"
ram: "512"
vcpu: "1"
- box:
vmw: "bento/ubuntu-14.04"
vb: "bento/ubuntu-14.04"
name: "worker-01"
nics:
- type: "private_network"
ip_addr: "192.168.100.101"
ram: "512"
vcpu: "1"
- box:
vmw: "bento/ubuntu-14.04"
vb: "bento/ubuntu-14.04"
name: "worker-02"
nics:
- type: "private_network"
ip_addr: "192.168.100.102"
ram: "512"
vcpu: "1"
- box:
vmw: "bento/ubuntu-14.04"
vb: "bento/ubuntu-14.04"
name: "worker-03"
nics:
- type: "private_network"
ip_addr: "192.168.100.103"
ram: "512"
vcpu: "1"
- box:
vmw: "bento/ubuntu-14.04"
vb: "bento/ubuntu-14.04"
name: "worker-04"
nics:
- type: "private_network"
ip_addr: "192.168.100.104"
ram: "512"
vcpu: "1"

View file

@ -0,0 +1,10 @@
---
- hosts: "all"
become: "yes"
remote_user: "vagrant"
tasks:
- name: "Install Pip"
package:
name: "python-pip"
state: "present"