Created by Viktor Farcic for Technology Conversations
![]() |
![]() |
![]() |
![]() |
cd ansible-workshop
cat Vagrantfile
vagrant up
vagrant ssh cd
tree /vagrant/ansible/roles
cat /vagrant/ansible/hosts/prod
cat /vagrant/ansible/swarm.yml
Install the jq package
# roles/common/tasks/main.yml
- apt:
name: jq
Run the Ansible Playbook
ansible-playbook /vagrant/ansible/swarm.yml \
-i /vagrant/ansible/hosts/prod
curl https://api.github.com/repos/vfarcic/\
ansible-workshop/commits?per_page=5 \
| jq '.'
Create the following directories:
# roles/consul/tasks/main.yml
- file:
path: "{{ item }}"
state: directory
with_items:
- /data/consul/logs
- /data/consul/data
- /data/consul/config
Copy the following files:
# roles/consul/tasks/main.yml
- copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
mode: "{{ item.mode }}"
with_items:
- { src: "consul", dest: "/usr/local/bin/consul", mode: "0755" }
- { src: "ui", dest: "/data/consul", mode: "0644" }
Run the following command:
nohup consul agent [EXTRA] \
-ui-dir /data/consul/ui \
-data-dir /data/consul/data \
-config-dir /data/consul/config \
-node=[HOST_NAME] \
-bind=[IP] \
-client=0.0.0.0 \
>/data/consul/logs/consul.log 2>&1 &
# hosts/prod
[swarm]
10.100.192.200 consul_extra="-server -bootstrap-expect 1"
10.100.192.20[1:2] consul_extra=""
# roles/consul/tasks/main.yml
- shell: nohup consul agent {{ consul_extra }} \
-ui-dir /data/consul/ui \
-data-dir /data/consul/data \
-config-dir /data/consul/config \
-node={{ ansible_hostname }} \
-bind={{ facter_ipaddress_eth1 }} \
-client=0.0.0.0 \
>/data/consul/logs/consul.log 2>&1 &
Run the following command only if NOT the main server.
consul join [IP_OF_THE_MAIN_SERVER]
# hosts/prod
[swarm]
10.100.192.200
10.100.192.20[1:2] main_server_ip=10.100.192.200
# roles/consul/tasks/main.yml
- shell: consul join {{ main_server_ip }}
when: main_server_ip is defined
curl 10.100.192.200:8500/v1/catalog/nodes \
| jq '.'
Open http://10.100.192.200:8500/
Add Docker repository deb https://apt.dockerproject.org/repo ubuntu-trusty main and update cache.
# roles/docker/tasks/main.yml
- apt_repository:
repo: deb https://apt.dockerproject.org/repo ubuntu-trusty main
update_cache: yes
Install the following Debian packages:
# roles/docker/tasks/main.yml
- apt:
name: "{{ item }}"
force: yes
with_items:
- docker-engine
- python-pip
Install the docker-py PIP package version 0.4.0
# roles/docker/tasks/main.yml
- pip:
name: docker-py
version: 0.4.0
sudo docker --version
# hosts/prod
[swarm]
10.100.192.200 main_server=true
10.100.192.20[1:2]
# roles/swarm/tasks/main.yml
- copy:
src: docker.cfg
dest: /etc/default/docker
when: not main_server is defined
register: result
- service:
name: docker
state: restarted
when: result|changed
Run the Docker container called swarm
# roles/swarm/tasks/main.yml
- docker:
name: swarm
image: swarm
ports: 2375:2375
command: manage consul://{{ facter_ipaddress_eth1 }}:8500/swarm
when: main_server is defined
- docker:
name: swarm
image: swarm
command: join --advertise={{ facter_ipaddress_eth1 }}:2375 consul://{{ facter_ipaddress_eth1 }}:8500/swarm
when: not main_server is defined
ansible-playbook /vagrant/ansible/swarm.yml \
-i /vagrant/ansible/hosts/prod
export DOCKER_HOST=tcp://10.100.192.200:2375
docker info
docker run -d --name hello-world-1 \
ubuntu /bin/sh -c "while true; do echo hello world; sleep 5; done"
docker ps
docker logs -f hello-world-1
docker run -d --name hello-world-2 \
ubuntu /bin/sh -c "while true; do echo hello world; sleep 5; done"
docker ps
docker logs -f hello-world-2