initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.cache/
|
14
.gitlab-ci.yml
Normal file
14
.gitlab-ci.yml
Normal file
@ -0,0 +1,14 @@
|
||||
---
|
||||
stages:
|
||||
- validate
|
||||
|
||||
.template:
|
||||
interruptible: true
|
||||
stage: validate
|
||||
tags:
|
||||
- ansible
|
||||
|
||||
yamllint:
|
||||
extends: .template
|
||||
script:
|
||||
- yamllint -c .yamllint .
|
8
.yamllint
Normal file
8
.yamllint
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
extends: default
|
||||
|
||||
ignore: |
|
||||
.cache/
|
||||
|
||||
rules:
|
||||
line-length: disable
|
20
LICENSE
Normal file
20
LICENSE
Normal file
@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) NoxInmortus (Alban E.G.)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
101
README.md
Normal file
101
README.md
Normal file
@ -0,0 +1,101 @@
|
||||
# Ansible Role: Docker
|
||||
|
||||
An Ansible Role that installs [Docker](https://www.docker.com) for Debian. This role allows to add `docker` group to users, can also manage docker networks and containers.
|
||||
|
||||
## Role Variables
|
||||
|
||||
Available variables are listed below, along with default values (see `defaults/main.yml`):
|
||||
|
||||
### Docker package
|
||||
```yaml
|
||||
# Edition can be one of: 'ce' (Community Edition) or 'ee' (Enterprise Edition).
|
||||
docker_edition: 'ce'
|
||||
docker_package: "docker-{{ docker_edition }}"
|
||||
docker_package_state: present
|
||||
```
|
||||
|
||||
You can control whether the package is installed, uninstalled, or at the latest version by setting `docker_package_state` to `present`, `absent`, or `latest`, respectively. Note that the Docker daemon will be automatically restarted if the Docker package is updated. This is a side effect of flushing all handlers (running any of the handlers that have been notified by this and any other role up to this point in the play).
|
||||
|
||||
### Docker service state
|
||||
```yaml
|
||||
docker_service_state: started
|
||||
docker_service_enabled: true
|
||||
docker_restart_handler_state: restarted
|
||||
```
|
||||
|
||||
Variables to control the state of the `docker` service, and whether it should start on boot. If you're installing Docker inside a Docker container without systemd or sysvinit, you should set these to `stopped` and set the enabled variable to `no`.
|
||||
|
||||
### Docker installation
|
||||
```yaml
|
||||
docker_apt_release_channel: stable
|
||||
docker_apt_arch: amd64
|
||||
docker_apt_repository: "deb [arch={{ docker_apt_arch }}] https://download.docker.com/linux/{{ ansible_distribution|lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}"
|
||||
```
|
||||
|
||||
You can switch the channel to `edge` if you want to use the Edge release.
|
||||
|
||||
### Docker users
|
||||
```yaml
|
||||
docker_users:
|
||||
- user1
|
||||
- user2
|
||||
```
|
||||
|
||||
A list of system users to be added to the `docker` group (so they can use Docker on the server).
|
||||
|
||||
### Docker networks
|
||||
See official documentation for `docker_network` module for more informations.
|
||||
|
||||
```yaml
|
||||
docker_networks:
|
||||
- name: network1
|
||||
- name: network2
|
||||
state: absent
|
||||
```
|
||||
|
||||
A list of docker networks to manage.
|
||||
|
||||
### Docker containers
|
||||
See official documentation for `docker_container` module for more informations.
|
||||
```yaml
|
||||
docker_containers:
|
||||
- name: postgres
|
||||
image: postgres:9.6
|
||||
state: started
|
||||
restart_policy: unless-stopped
|
||||
env:
|
||||
POSTGRES_USER: foo
|
||||
POSTGRES_PASSWORD: bar
|
||||
POSTGRES_DB: baz
|
||||
- name: memcached
|
||||
image: memcached:alpine
|
||||
state: started
|
||||
restart_policy: unless-stopped
|
||||
- name: elasticsearch
|
||||
image: docker.elastic.co/elasticsearch/elasticsearch:5.6.13
|
||||
state: started
|
||||
restart_policy: unless-stopped
|
||||
memory: 1g
|
||||
ulimits:
|
||||
- memlock:-1:-1 # <type>:<soft>:<hard>
|
||||
```
|
||||
|
||||
### Tags
|
||||
|
||||
| Tag | DESCRIPTION |
|
||||
|-----------------------|-------------------------|
|
||||
| docker | Global tag |
|
||||
| docker_asserts | Asserts tasks |
|
||||
| docker_install | Install docker |
|
||||
| docker_users | Configure docker users |
|
||||
| docker_networks | Configure docker networks |
|
||||
| docker_containers | Deploy docker containers |
|
||||
|
||||
## License
|
||||
MIT view [LICENSE](LICENSE)
|
||||
|
||||
## Sources
|
||||
- https://github.com/geerlingguy/ansible-role-docker
|
||||
- https://github.com/manala/ansible-roles/tree/master/manala.docker
|
||||
- https://docs.ansible.com/ansible/latest/modules/docker_container_module.html
|
||||
- https://github.com/atosatto/ansible-dockerswarm/
|
35
defaults/main.yml
Normal file
35
defaults/main.yml
Normal file
@ -0,0 +1,35 @@
|
||||
---
|
||||
# Edition can be one of: 'ce' (Community Edition) or 'ee' (Enterprise Edition).
|
||||
docker_edition: 'ce'
|
||||
docker_package: "docker-{{ docker_edition }}"
|
||||
docker_package_state: present
|
||||
|
||||
# Packages dependencies
|
||||
docker_apt_dependencies:
|
||||
- ca-certificates
|
||||
- curl
|
||||
docker_pip_dependencies:
|
||||
- docker
|
||||
|
||||
# Service options.
|
||||
docker_service_state: started
|
||||
docker_service_enabled: true
|
||||
docker_restart_handler_state: restarted
|
||||
|
||||
# Switch 'stable' to 'edge' if needed.
|
||||
docker_apt_release_channel: stable
|
||||
docker_apt_arch: amd64
|
||||
docker_apt_repository: "deb [arch={{ docker_apt_arch }} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/{{ ansible_distribution|lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}"
|
||||
|
||||
# Swarm options
|
||||
docker_swarm_enable: false
|
||||
# Docker swarm network can be define in order to be sure that
|
||||
# swarm cluster doesn't overlap with you infrastructure
|
||||
# docker_swarm_network: 10.10.8.0/24
|
||||
|
||||
# You can set any interface, that is listened by docker engine.
|
||||
# e.g. docker_swarm_interface: "eth1"
|
||||
docker_swarm_interface: "{{ ansible_default_ipv4['interface'] }}"
|
||||
docker_swarm_addr: "{{ hostvars[inventory_hostname]['ansible_' + docker_swarm_interface]['ipv4']['address'] }}"
|
||||
docker_swarm_master: "{{ groups['docker_swarm_manager'][0] }}"
|
||||
docker_swarm_port: 2377
|
5
handlers/main.yml
Normal file
5
handlers/main.yml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- name: restart_docker
|
||||
service:
|
||||
name: docker
|
||||
state: "{{ docker_restart_handler_state }}"
|
2
meta/.galaxy_install_info
Normal file
2
meta/.galaxy_install_info
Normal file
@ -0,0 +1,2 @@
|
||||
install_date: 'Sun 16 Jun 2024 04:56:38 PM '
|
||||
version: ''
|
13
meta/main.yml
Normal file
13
meta/main.yml
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
galaxy_info:
|
||||
author: Alban E.
|
||||
description: Docker for Linux.
|
||||
company: Imperium
|
||||
license: MIT
|
||||
min_ansible_version: 2.4
|
||||
platforms:
|
||||
- name: Debian
|
||||
versions:
|
||||
- jessie
|
||||
- stretch
|
||||
- buster
|
60
tasks/install.yml
Normal file
60
tasks/install.yml
Normal file
@ -0,0 +1,60 @@
|
||||
---
|
||||
- include_vars: python2.yml
|
||||
when: ansible_python_version[:1] == '2'
|
||||
tags:
|
||||
- docker
|
||||
- docker_install
|
||||
|
||||
- include_vars: python3.yml
|
||||
when: ansible_python_version[:1] == '3'
|
||||
tags:
|
||||
- docker
|
||||
- docker_install
|
||||
|
||||
- name: Docker install | Add Docker apt key
|
||||
get_url:
|
||||
url: https://download.docker.com/linux/debian/gpg
|
||||
dest: /etc/apt/keyrings/docker.asc
|
||||
checksum: sha256:1500c1f56fa9e26b9b8f42452a553675796ade0807cdce11975eb98170b3a570
|
||||
tags:
|
||||
- docker
|
||||
- docker_install
|
||||
|
||||
- name: Docker install | Add Docker repository
|
||||
apt_repository:
|
||||
repo: '{{ docker_apt_repository }}'
|
||||
update_cache: true
|
||||
tags:
|
||||
- docker
|
||||
- docker_install
|
||||
|
||||
- name: Docker install | Install apt packages
|
||||
package:
|
||||
name: '{{ item }}'
|
||||
state: '{{ docker_package_state }}'
|
||||
with_items:
|
||||
- '{{ docker_package }}'
|
||||
- '{{ docker_apt_dependencies }}'
|
||||
- '{{ docker_apt_python_dependencies }}'
|
||||
tags:
|
||||
- docker
|
||||
- docker_install
|
||||
|
||||
- name: Docker install | Install Docker Python library
|
||||
pip:
|
||||
name: '{{ docker_pip_dependencies }}'
|
||||
state: '{{ docker_package_state }}'
|
||||
executable: '{{ docker_pip_executable }}'
|
||||
tags:
|
||||
- docker
|
||||
- docker_install
|
||||
when: ansible_python_version[:1] == '2'
|
||||
|
||||
- name: Docker install | Ensure Docker is started and enabled at boot
|
||||
service:
|
||||
name: docker
|
||||
state: '{{ docker_service_state }}'
|
||||
enabled: '{{ docker_service_enabled }}'
|
||||
tags:
|
||||
- docker
|
||||
- docker_install
|
77
tasks/main.yml
Normal file
77
tasks/main.yml
Normal file
@ -0,0 +1,77 @@
|
||||
---
|
||||
- name: Docker | Check if ansible version >= 2.4
|
||||
assert:
|
||||
that: "ansible_version.full is version_compare(2.4, '>=')"
|
||||
msg: "Ansible 2.4 or superior version is required."
|
||||
tags:
|
||||
- docker
|
||||
- docker_asserts
|
||||
- docker_install
|
||||
- docker_users
|
||||
- docker_networks
|
||||
- docker_containers
|
||||
|
||||
- include_tasks: install.yml
|
||||
tags:
|
||||
- docker
|
||||
- docker_install
|
||||
|
||||
- name: Docker | Ensure docker users are added to the docker group
|
||||
user:
|
||||
name: "{{ item }}"
|
||||
groups: docker
|
||||
append: true
|
||||
with_items: "{{ docker_users|default([]) }}"
|
||||
when: docker_users
|
||||
tags:
|
||||
- docker
|
||||
- docker_users
|
||||
|
||||
- include_tasks: swarm.yml
|
||||
when: docker_swarm_enable
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_init
|
||||
|
||||
- name: Assign default labels to swarm nodes
|
||||
docker_node:
|
||||
debug: '{{ docker_node.debug|default(omit) }}'
|
||||
hostname: '{{ docker_node.hostname|default(inventory_hostname) }}'
|
||||
labels: '{{ docker_node.labels|default(omit) }}'
|
||||
role: '{{ docker_node.role|default(omit) }}'
|
||||
availability: '{{ docker_node.availability|default(omit) }}'
|
||||
labels_state: '{{ docker_node.labels_state|default(omit) }}'
|
||||
labels_to_remove: '{{ docker_node.labels_to_remove|default(omit) }}'
|
||||
delegate_to: "{{ groups['docker_swarm_manager'][0] }}"
|
||||
when: docker_swarm_enable
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_labels
|
||||
|
||||
- name: Docker | Create docker networks
|
||||
docker_network:
|
||||
"{{ item }}"
|
||||
loop: "{{ docker_networks|default([]) }}"
|
||||
tags:
|
||||
- docker
|
||||
- docker_networks
|
||||
|
||||
- name: Docker | Create docker containers
|
||||
docker_container:
|
||||
"{{ item }}"
|
||||
loop: "{{ docker_containers|default([]) }}"
|
||||
tags:
|
||||
- docker
|
||||
- docker_containers
|
||||
|
||||
- name: Docker | Create docker swarm services
|
||||
docker_swarm_service:
|
||||
"{{ item }}"
|
||||
loop: "{{ docker_swarm_services|default([]) }}"
|
||||
when: docker_swarm_enable
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_services
|
105
tasks/swarm.yml
Normal file
105
tasks/swarm.yml
Normal file
@ -0,0 +1,105 @@
|
||||
---
|
||||
- name: Create a custom Swarm network.
|
||||
docker_network:
|
||||
name: docker_gwbridge
|
||||
driver_options:
|
||||
com.docker.network.bridge.enable_icc: "false"
|
||||
com.docker.network.bridge.enable_ip_masquerade: "true"
|
||||
com.docker.network.bridge.name: docker_gwbridge
|
||||
ipam_options:
|
||||
subnet: "{{ docker_swarm_network }}"
|
||||
gateway: "{{ docker_swarm_network | ipaddr('net') | ipaddr('1') | ipaddr('ip') }}"
|
||||
when: docker_swarm_network is defined and docker_swarm_network | ipaddr('net')
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_init
|
||||
|
||||
- name: Check if "Swarm Mode" is enabled.
|
||||
shell: docker info
|
||||
changed_when: false
|
||||
check_mode: false
|
||||
register: docker_info
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_init
|
||||
|
||||
- name: Init "Swarm Mode" on the first manager.
|
||||
shell: docker swarm init
|
||||
--listen-addr {{ docker_swarm_addr }}:{{ docker_swarm_port }}
|
||||
--advertise-addr {{ docker_swarm_addr }}
|
||||
when: "docker_info.stdout.find('Swarm: active') == -1
|
||||
and inventory_hostname == groups['docker_swarm_manager'][0]"
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_init
|
||||
|
||||
- name: Get the worker join-token.
|
||||
shell: docker swarm join-token -q worker
|
||||
changed_when: false
|
||||
check_mode: false
|
||||
register: docker_worker_token
|
||||
delegate_to: "{{ groups['docker_swarm_manager'][0] }}"
|
||||
delegate_facts: true
|
||||
when: "'docker_swarm_worker' in group_names"
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_init
|
||||
|
||||
- name: Get the manager join-token.
|
||||
shell: docker swarm join-token -q manager
|
||||
changed_when: false
|
||||
check_mode: false
|
||||
register: docker_manager_token
|
||||
delegate_to: "{{ groups['docker_swarm_manager'][0] }}"
|
||||
delegate_facts: true
|
||||
when: "'docker_swarm_manager' in group_names
|
||||
and inventory_hostname != groups['docker_swarm_manager'][0]"
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_init
|
||||
|
||||
- name: Declare the address of the first Swarm manager as a fact.
|
||||
set_fact:
|
||||
docker_manager_address: "{{ groups['docker_swarm_manager'][0] }}:{{ docker_swarm_port }}"
|
||||
check_mode: false
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_init
|
||||
|
||||
- name: Join the pending Swarm worker nodes.
|
||||
shell: docker swarm join
|
||||
--listen-addr {{ docker_swarm_addr }}:{{ docker_swarm_port }}
|
||||
--advertise-addr {{ docker_swarm_addr }}
|
||||
--token "{{ docker_worker_token.stdout }}"
|
||||
{{ docker_manager_address }}
|
||||
changed_when: false
|
||||
when: "docker_info.stdout.find('Swarm: active') == -1
|
||||
and docker_info.stdout.find('Swarm: pending') == -1
|
||||
and 'docker_swarm_worker' in group_names
|
||||
and 'docker_swarm_manager' not in group_names"
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_init
|
||||
|
||||
- name: Join the pending Swarm manager nodes.
|
||||
shell: docker swarm join
|
||||
--listen-addr {{ docker_swarm_addr }}:{{ docker_swarm_port }}
|
||||
--advertise-addr {{ docker_swarm_addr }}
|
||||
--token "{{ docker_manager_token.stdout }}"
|
||||
{{ docker_manager_address }}
|
||||
changed_when: false
|
||||
when: "docker_info.stdout.find('Swarm: active') == -1
|
||||
and docker_info.stdout.find('Swarm: pending') == -1
|
||||
and 'docker_swarm_manager' in group_names
|
||||
and inventory_hostname != groups['docker_swarm_manager'][0]"
|
||||
tags:
|
||||
- docker
|
||||
- docker_swarm
|
||||
- docker_swarm_init
|
7
vars/python2.yml
Normal file
7
vars/python2.yml
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
docker_apt_python_dependencies:
|
||||
- python
|
||||
- python-pip
|
||||
- python-backports.ssl-match-hostname
|
||||
|
||||
docker_pip_executable: pip2
|
5
vars/python3.yml
Normal file
5
vars/python3.yml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
docker_apt_python_dependencies:
|
||||
- python3
|
||||
- python3-pip
|
||||
- python3-docker
|
Reference in New Issue
Block a user