Setup a Docker Swarm cluster on RHEL/CentOS and Debian/Ubuntu servers using the new Docker Engine's "Swarm Mode" (https://docs.docker.com/engine/swarm/).
None.
Available variables are listed below, along with default values (see defaults/main.yml):
docker_repo: main
# docker_repo: testing
# docker_repo: experimental
The repo from which install Docker. Override the default to install testing or experimental docker builds.
docker_dependencies: "{{ default_docker_dependencies }}"
Extra packages that have to installed together with Docker.
The value of default_docker_dependencies
depends on the target OS family.
NB: If you are installing Docker on a Raspberry running Raspbian or any other Debian-like OS make sure to set
docker_dependencies: [ ]
otherwise Ansible will fail because thelinux-image-extra-virtual
package is not available for thearm
architecture (see issue #4).
docker_swarm_interface: "{{ ansible_default_ipv4['alias'] }}"
Setting docker_swarm_interface
allows you to define which network interface will be used for cluster inter-communication.
docker_swarm_addr: "{{ hostvars[inventory_hostname]['ansible_' + docker_swarm_interface]['ipv4']['address'] }}"
By default, the ip address for raft API will be taken from desired interface.
You can setup listening address where the raft APIs will be exposed, overriding
the docker_swarm_addr
variable value in your playbook.
docker_swarm_port: 2377
Listening port where the raft APIs will be exposed.
docker_admin_users:
- "{{ ansible_user }}"
The list of users that has to be added to the docker_group
to interact with the Docker daemon.
NB: The users must already exist in the system.
skip_engine: False
skip_group: False
skip_swarm: False
skip_docker_py: False
Setting skip_engine: True
will make the role skip the installation of docker-engine
.
If you want to use this role to just install docker-engine
without enabling swarm-mode
set skip_swarm: True
.
To skip the tasks adding the docker_admin_users
to the docker_group
set skip_group: True
.
Finally, the docker-py
installation task can be skipped setting skip_docker_py
to True
.
Node labels provide a
flexible method of node organization. You can also use node labels in service constraints.
Apply constraints when you create a service to limit the nodes where the scheduler assigns tasks for the service.
You can define labels by swarm_labels
variable, e.g:
$ cat inventory
...
[docker_swarm_manager]
swarm-01 swarm_labels=deploy
[docker_swarm_worker]
swarm-02 swarm_labels='["libvirt", "docker", "foo", "bar"]'
swarm-03
...
In this case:
$ docker inspect --format '{{json .Spec.Labels}}' swarm-02 | jq
{
"bar": "true",
"docker": "true",
"for": "true",
"libvirt": "true",
}
You can assign labels to cluster running playbook with --tags=swarm_labels
NB: Please note, all labels that are not defined in inventory will be removed
None.
$ cat inventory
swarm-01 ansible_ssh_host=172.10.10.1
swarm-02 ansible_ssh_host=172.10.10.2
swarm-03 ansible_ssh_host=172.10.10.3
[docker_engine]
swarm-01
swarm-02
swarm-03
[docker_swarm_manager]
swarm-01 swarm_labels=deploy
[docker_swarm_worker]
swarm-02 swarm_labels='["libvirt", "docker", "foo", "bar"]'
swarm-03
$ cat playbook.yml
- name: "Provision Docker Swarm Cluster"
hosts: all
roles:
- { role: atosatto.docker-swarm }
MIT
Andrea Tosatto (@_hilbert_)