Improve Docker baseline role
This commit is contained in:
parent
350a4ecc2c
commit
121095ebf4
5 changed files with 152 additions and 39 deletions
57
README.md
57
README.md
|
|
@ -1,2 +1,59 @@
|
||||||
# wulf-ansible
|
# wulf-ansible
|
||||||
|
|
||||||
|
Ansible playbooks used by Semaphore for Wulf infrastructure automation.
|
||||||
|
|
||||||
|
## Collection requirements
|
||||||
|
|
||||||
|
Install required Ansible collections before running playbooks locally or in a new Semaphore worker environment:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ansible-galaxy collection install -r collections/requirements.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
Currently required collections:
|
||||||
|
|
||||||
|
- `community.docker`
|
||||||
|
- `community.general`
|
||||||
|
- `ansible.posix`
|
||||||
|
|
||||||
|
## Docker baseline
|
||||||
|
|
||||||
|
Semaphore template: **Docker Baseline**
|
||||||
|
|
||||||
|
Playbook:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ansible-playbook playbooks/docker.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
The Docker role:
|
||||||
|
|
||||||
|
- supports Debian/Ubuntu apt-based hosts,
|
||||||
|
- removes conflicting distro/container packages,
|
||||||
|
- configures Docker's official apt repository,
|
||||||
|
- installs Docker Engine, Buildx, and Compose V2 plugin,
|
||||||
|
- configures Docker daemon log rotation and live-restore,
|
||||||
|
- enables Docker,
|
||||||
|
- adds the target Ansible user to the `docker` group,
|
||||||
|
- creates `/opt/stacks`,
|
||||||
|
- enables IPv4 forwarding,
|
||||||
|
- optionally disables IPv6,
|
||||||
|
- creates shared Docker networks such as `pangolin`,
|
||||||
|
- verifies `docker --version` and `docker compose version`.
|
||||||
|
|
||||||
|
### Docker role variables
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
docker_package_state: present # set to latest when intentionally upgrading Docker packages
|
||||||
|
docker_stacks_dir: /opt/stacks
|
||||||
|
docker_networks:
|
||||||
|
- pangolin
|
||||||
|
docker_disable_ipv6: false
|
||||||
|
docker_run_hello_world: false # optional runtime pull/run verification
|
||||||
|
```
|
||||||
|
|
||||||
|
To run a full runtime verification during provisioning:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
docker_run_hello_world: true
|
||||||
|
```
|
||||||
|
|
|
||||||
5
collections/requirements.yml
Normal file
5
collections/requirements.yml
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
collections:
|
||||||
|
- name: community.docker
|
||||||
|
- name: community.general
|
||||||
|
- name: ansible.posix
|
||||||
|
|
@ -5,9 +5,3 @@
|
||||||
|
|
||||||
roles:
|
roles:
|
||||||
- docker
|
- docker
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: Create shared network (Pangolin/Newt)
|
|
||||||
community.docker.docker_network:
|
|
||||||
name: pangolin
|
|
||||||
state: present
|
|
||||||
|
|
@ -1,4 +1,19 @@
|
||||||
---
|
---
|
||||||
|
docker_conflicting_packages:
|
||||||
|
- docker.io
|
||||||
|
- docker-doc
|
||||||
|
- docker-compose
|
||||||
|
- docker-compose-v2
|
||||||
|
- podman-docker
|
||||||
|
- containerd
|
||||||
|
- runc
|
||||||
|
|
||||||
|
docker_prereq_packages:
|
||||||
|
- ca-certificates
|
||||||
|
- curl
|
||||||
|
- gnupg
|
||||||
|
- python3-docker
|
||||||
|
|
||||||
docker_packages:
|
docker_packages:
|
||||||
- docker-ce
|
- docker-ce
|
||||||
- docker-ce-cli
|
- docker-ce-cli
|
||||||
|
|
@ -6,6 +21,8 @@ docker_packages:
|
||||||
- docker-buildx-plugin
|
- docker-buildx-plugin
|
||||||
- docker-compose-plugin
|
- docker-compose-plugin
|
||||||
|
|
||||||
|
docker_package_state: present
|
||||||
|
|
||||||
docker_daemon_config:
|
docker_daemon_config:
|
||||||
log-driver: json-file
|
log-driver: json-file
|
||||||
log-opts:
|
log-opts:
|
||||||
|
|
@ -16,3 +33,10 @@ docker_daemon_config:
|
||||||
live-restore: true
|
live-restore: true
|
||||||
|
|
||||||
docker_disable_ipv6: false
|
docker_disable_ipv6: false
|
||||||
|
|
||||||
|
docker_stacks_dir: /opt/stacks
|
||||||
|
|
||||||
|
docker_networks:
|
||||||
|
- pangolin
|
||||||
|
|
||||||
|
docker_run_hello_world: false
|
||||||
|
|
|
||||||
|
|
@ -1,59 +1,57 @@
|
||||||
---
|
---
|
||||||
# Remove conflicting packages
|
- name: Validate supported OS family
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- ansible_os_family == "Debian"
|
||||||
|
- ansible_distribution | lower in ["debian", "ubuntu"]
|
||||||
|
fail_msg: >-
|
||||||
|
Docker baseline currently supports Debian/Ubuntu apt-based hosts only.
|
||||||
|
Detected {{ ansible_distribution }} / {{ ansible_os_family }}.
|
||||||
|
|
||||||
- name: Remove conflicting Docker packages
|
- name: Remove conflicting Docker packages
|
||||||
apt:
|
apt:
|
||||||
name:
|
name: "{{ docker_conflicting_packages }}"
|
||||||
- docker.io
|
|
||||||
- docker-doc
|
|
||||||
- docker-compose
|
|
||||||
- docker-compose-v2
|
|
||||||
- podman-docker
|
|
||||||
- containerd
|
|
||||||
- runc
|
|
||||||
state: absent
|
state: absent
|
||||||
|
|
||||||
# Prerequisites
|
|
||||||
- name: Install Docker prerequisites
|
- name: Install Docker prerequisites
|
||||||
apt:
|
apt:
|
||||||
name:
|
name: "{{ docker_prereq_packages }}"
|
||||||
- ca-certificates
|
|
||||||
- curl
|
|
||||||
- gnupg
|
|
||||||
state: present
|
state: present
|
||||||
update_cache: true
|
update_cache: true
|
||||||
|
|
||||||
# Keyrings directory
|
|
||||||
- name: Create Docker APT keyrings directory
|
- name: Create Docker APT keyrings directory
|
||||||
file:
|
file:
|
||||||
path: /etc/apt/keyrings
|
path: /etc/apt/keyrings
|
||||||
state: directory
|
state: directory
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
# Docker GPG key
|
- name: Determine dpkg architecture
|
||||||
- name: Add Docker GPG key
|
command: dpkg --print-architecture
|
||||||
shell: |
|
register: docker_dpkg_arch
|
||||||
curl -fsSL https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
changed_when: false
|
||||||
args:
|
|
||||||
creates: /etc/apt/keyrings/docker.gpg
|
- name: Download Docker GPG key
|
||||||
|
get_url:
|
||||||
|
url: "https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg"
|
||||||
|
dest: /etc/apt/keyrings/docker.asc
|
||||||
|
mode: "0644"
|
||||||
|
force: true
|
||||||
|
|
||||||
# Docker repository
|
|
||||||
- name: Add Docker APT repository
|
- name: Add Docker APT repository
|
||||||
apt_repository:
|
apt_repository:
|
||||||
repo: >
|
repo: >
|
||||||
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg]
|
deb [arch={{ docker_dpkg_arch.stdout }} signed-by=/etc/apt/keyrings/docker.asc]
|
||||||
https://download.docker.com/linux/{{ ansible_distribution | lower }}
|
https://download.docker.com/linux/{{ ansible_distribution | lower }}
|
||||||
{{ ansible_distribution_release }} stable
|
{{ ansible_distribution_release }} stable
|
||||||
filename: docker
|
filename: docker
|
||||||
state: present
|
state: present
|
||||||
update_cache: true
|
update_cache: true
|
||||||
|
|
||||||
# Install Docker
|
|
||||||
- name: Install Docker Engine and plugins
|
- name: Install Docker Engine and plugins
|
||||||
apt:
|
apt:
|
||||||
name: "{{ docker_packages }}"
|
name: "{{ docker_packages }}"
|
||||||
state: present
|
state: "{{ docker_package_state }}"
|
||||||
|
|
||||||
# Docker daemon configuration
|
|
||||||
- name: Configure Docker daemon
|
- name: Configure Docker daemon
|
||||||
copy:
|
copy:
|
||||||
dest: /etc/docker/daemon.json
|
dest: /etc/docker/daemon.json
|
||||||
|
|
@ -63,31 +61,35 @@
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
notify: Restart Docker
|
notify: Restart Docker
|
||||||
|
|
||||||
# Enable Docker
|
|
||||||
- name: Enable and start Docker
|
- name: Enable and start Docker
|
||||||
systemd:
|
systemd:
|
||||||
name: docker
|
name: docker
|
||||||
enabled: true
|
enabled: true
|
||||||
state: started
|
state: started
|
||||||
|
|
||||||
# Non-root Docker usage
|
|
||||||
- name: Add user to docker group
|
- name: Add user to docker group
|
||||||
user:
|
user:
|
||||||
name: "{{ docker_manage_user | default(ansible_user) }}"
|
name: "{{ docker_manage_user | default(ansible_user) }}"
|
||||||
groups: docker
|
groups: docker
|
||||||
append: true
|
append: true
|
||||||
|
|
||||||
# Kernel forwarding
|
- name: Ensure standard Docker stack directory exists
|
||||||
|
file:
|
||||||
|
path: "{{ docker_stacks_dir }}"
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: docker
|
||||||
|
mode: "0775"
|
||||||
|
|
||||||
- name: Enable IP forwarding
|
- name: Enable IP forwarding
|
||||||
sysctl:
|
ansible.posix.sysctl:
|
||||||
name: net.ipv4.ip_forward
|
name: net.ipv4.ip_forward
|
||||||
value: "1"
|
value: "1"
|
||||||
state: present
|
state: present
|
||||||
reload: true
|
reload: true
|
||||||
|
|
||||||
# Optional IPv6 disable
|
|
||||||
- name: Disable IPv6
|
- name: Disable IPv6
|
||||||
sysctl:
|
ansible.posix.sysctl:
|
||||||
name: "{{ item }}"
|
name: "{{ item }}"
|
||||||
value: "1"
|
value: "1"
|
||||||
state: present
|
state: present
|
||||||
|
|
@ -95,4 +97,35 @@
|
||||||
loop:
|
loop:
|
||||||
- net.ipv6.conf.all.disable_ipv6
|
- net.ipv6.conf.all.disable_ipv6
|
||||||
- net.ipv6.conf.default.disable_ipv6
|
- net.ipv6.conf.default.disable_ipv6
|
||||||
when: docker_disable_ipv6
|
when: docker_disable_ipv6
|
||||||
|
|
||||||
|
- name: Create shared Docker networks
|
||||||
|
community.docker.docker_network:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: present
|
||||||
|
loop: "{{ docker_networks }}"
|
||||||
|
when: docker_networks | length > 0
|
||||||
|
|
||||||
|
- name: Check Docker version
|
||||||
|
command: docker --version
|
||||||
|
register: docker_version
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Check Docker Compose version
|
||||||
|
command: docker compose version
|
||||||
|
register: docker_compose_version
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Verify Docker can run containers
|
||||||
|
command: docker run --rm hello-world
|
||||||
|
register: docker_hello_world
|
||||||
|
changed_when: false
|
||||||
|
when: docker_run_hello_world
|
||||||
|
|
||||||
|
- name: Show Docker baseline summary
|
||||||
|
debug:
|
||||||
|
msg:
|
||||||
|
docker_version: "{{ docker_version.stdout }}"
|
||||||
|
docker_compose_version: "{{ docker_compose_version.stdout }}"
|
||||||
|
stacks_dir: "{{ docker_stacks_dir }}"
|
||||||
|
networks: "{{ docker_networks }}"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue