updated the inventory and added the vars and vaults for each host

This commit is contained in:
trucktrav 2026-05-03 14:27:54 -04:00
parent 730da055a5
commit 1adc56623d
43 changed files with 1131 additions and 22 deletions

View File

@ -1,8 +1,10 @@
[defaults]
inventory = inventory.yml
inventory = ./inventory/inventory.yml
roles_path = roles
host_key_checking = false
retry_files_enabled = false
vault_password_file = ~/.ansible/vault_pass_pbs
[privilege_escalation]
become = true

View File

@ -0,0 +1,2 @@
ansible_connection: vault_ansible_connection
ansible_user: vault_ansible_user

View File

@ -0,0 +1,12 @@
$ANSIBLE_VAULT;1.1;AES256
31636136626631343631313230666561316232626166613766343865363665646637373337346330
3664626530396334333734656430303064306165333564310a333032663266373838613461633664
31353764356633616339356563653838643862623463616165613266353064373130653236636231
3234346161323562370a636562356361306431613764366465306566376439646665333362313762
30633330376435636232343933633131653466363732316263343139656433343437353137656264
61323761653464653134613336383630623734633236636434643163626235613234386538353438
34363061623032363836613336353132373534633631323366393539653562333233393866306662
39396238383234363730343636393630323337363137643330623536643732653038366566363561
32363836646539396435316234363135303436333630353538663132343363363739366632363039
38666438396436303138353834363065666166623837633237333030356163383032373636353831
653665396539383738376539626664383536

View File

@ -0,0 +1,2 @@
ansible_connection: vault_ansible_connection
ansible_user: vault_ansible_user

View File

@ -0,0 +1,12 @@
$ANSIBLE_VAULT;1.1;AES256
32636537303833353632656165643531363730646339626163346637653365663336343436616339
6633393263353539366531353765356464303436323238390a623662653565663461623937333064
39363431323662643734643333343034636539623965633634653737323430613164646266316437
6661633533313961300a613935616566646630616533316263613263326366616539353263356663
39306335323135623130653436653836633332616639366435336533393136643064643937353235
63643531366562336333376365356236653937373936626564663966346233396564626539386561
66396362383738633938626135626134663633613033313338613939353962613539373836313661
31313130303534616635636164373831616336333537343834393935663036656134303666653033
39333533326662336532643534633137363831383662663465373638363564333137333332636162
37323531623863646564343666336163353235643230343563663934666331643234353236653163
663633373635393063663862653863326539

View File

@ -0,0 +1,2 @@
ansible_connection: vault_ansible_connection
ansible_user: vault_ansible_user

View File

@ -0,0 +1,8 @@
$ANSIBLE_VAULT;1.1;AES256
38653937626637373965333235393034343436333635373936643861373137363535373439356362
3265343139656262383563363565626133653466353363310a653639393265653337366563316331
38333864306430383665393266653562396664383636336261366134376333346333373135303437
6431346133376630330a636562653834643265303964623464343337366465343864356534663434
38323138306137653837306432333932323735333138653739376636306561373961336364343436
63373065613763613633646565343561373463656332333061346462616465636532323835396633
356561366534376633373434373966656532

View File

@ -0,0 +1,2 @@
ansible_connection: vault_ansible_connection
ansible_user: vault_ansible_user

View File

@ -0,0 +1,12 @@
$ANSIBLE_VAULT;1.1;AES256
31373630316662613661316232353139346465636266363066613230393064653638626331303739
6330376161353131313435363437383137336363633161320a386238353332306163663237303964
65613261343961623336303031353936613838316333303331346133653833353933613932313364
6537336139323933610a383734356466613465306532613636376439666531393732303833613834
35636137353732656430306333326132636261343439623866643837633266306633396138663739
63343933303061643634653562623533306662343238316539663238373433326335346265346161
66646235303539313734653333333631373463396361306465646139623132353834653662303066
66383939653761626134643666306661633061636431386136333362663265613863636535396262
39626338306263643166303730313639633662326661366533633364383835666266393137396230
66373534663537616636626632636633333035666232663737383065326561363162353436653839
656632306234373866383735363237376435

View File

@ -0,0 +1,2 @@
ansible_connection: vault_ansible_connection
ansible_user: vault_ansible_user

View File

@ -0,0 +1,12 @@
$ANSIBLE_VAULT;1.1;AES256
34303837386365336336366335346331663832376430316236363038383965363861656563383864
6335346533306261393435363731376566666132636361640a356631616332346432363364346635
63333761663232613238656464343733326430623733313762386365323830626165666439623530
6337663537643438630a373838643234323064386664393937333533636565323761343737376464
61383765333533363431613765326162313231636136363336323634303864343135623666313335
66656562376432646336613837366537626464326530343138353737303039366133316538633361
35383264646566653362666638636536323430653030383933373561316131636266326364366466
34343663376461613736663735373638663530323130313737323532653465383239336235663938
61353165623337336630666561373337623135343932626134323561333163333063633466666134
37643836356363396335353931393733316136336261633866373537393264636464666232643935
313931303330623934616436336461653165

View File

@ -20,9 +20,20 @@
# ansible_host: 192.168.1.20
# ansible_user: herby
# all:
# children:
# arch:
# hosts: {}
# debian:
# hosts: {}
all:
children:
arch:
hosts: {}
debian:
hosts: {}
local:
hosts:
localhost:
servers:
hosts:
herbydev:
herbylab-nas:
pbs-site:
pbs-staging-site:

View File

@ -7,7 +7,7 @@
# ansible-playbook playbook.yml -i inventory.yml --tags cli
- name: Deploy modern CLI environment
hosts: all
hosts: servers
gather_facts: true
tags: [cli]

View File

@ -40,6 +40,21 @@
become: true
tags: [dev_apps, workstation]
# Phase 6: Claude Code CLI
- role: claude_code
tags: [claude_code, dev_tools]
# # Phase 6: Claude Code CLI
# - role: claude_code
# tags: [claude_code, dev_tools]
- name: Display all post-install reminders
debug:
msg: |
════════════════════════════════════════════════════
MANUAL SETUP STILL REQUIRED ({{ post_install_reminders | default([]) | length }} items)
════════════════════════════════════════════════════
{% for r in post_install_reminders | default([]) %}
{{ loop.index }}. {{ r.title }}
{% for step in r.steps %}
• {{ step }}
{% endfor %}
{% endfor %}
════════════════════════════════════════════════════
when: post_install_reminders is defined

View File

@ -0,0 +1,4 @@
skip_list:
- 'yaml'
- 'risky-shell-pipe'
- 'role-name'

View File

@ -0,0 +1,4 @@
# These are supported funding model platforms
---
github: geerlingguy
patreon: geerlingguy

View File

@ -0,0 +1,71 @@
---
name: CI
'on':
pull_request:
push:
branches:
- master
schedule:
- cron: "0 7 * * 0"
defaults:
run:
working-directory: 'geerlingguy.docker'
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Check out the codebase.
uses: actions/checkout@v4
with:
path: 'geerlingguy.docker'
- name: Set up Python 3.
uses: actions/setup-python@v5
with:
python-version: '3.13' # Can't go to 3.14+ until Ansible 13.x
- name: Install test dependencies.
run: pip3 install yamllint
- name: Lint code.
run: |
yamllint .
molecule:
name: Molecule
runs-on: ubuntu-latest
strategy:
matrix:
distro:
- rockylinux10
- ubuntu2404
- ubuntu2204
- debian13
- debian12
- fedora43
- opensuseleap15
steps:
- name: Check out the codebase.
uses: actions/checkout@v4
with:
path: 'geerlingguy.docker'
- name: Set up Python 3.
uses: actions/setup-python@v5
with:
python-version: '3.13' # Can't go to 3.14+ until Ansible 13.x
- name: Install test dependencies.
run: pip3 install ansible molecule molecule-plugins[docker] docker
- name: Run Molecule tests.
run: molecule test
env:
PY_COLORS: '1'
ANSIBLE_FORCE_COLOR: '1'
MOLECULE_DISTRO: ${{ matrix.distro }}

View File

@ -0,0 +1,40 @@
---
# This workflow requires a GALAXY_API_KEY secret present in the GitHub
# repository or organization.
#
# See: https://github.com/marketplace/actions/publish-ansible-role-to-galaxy
# See: https://github.com/ansible/galaxy/issues/46
name: Release
'on':
push:
tags:
- '*'
defaults:
run:
working-directory: 'geerlingguy.docker'
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Check out the codebase.
uses: actions/checkout@v4
with:
path: 'geerlingguy.docker'
- name: Set up Python 3.
uses: actions/setup-python@v5
with:
python-version: '3.13' # Can't go to 3.14+ until Ansible 13.x
- name: Install Ansible.
run: pip3 install ansible-core
- name: Trigger a new import on Galaxy.
run: >-
ansible-galaxy role import --api-key ${{ secrets.GALAXY_API_KEY }}
$(echo ${{ github.repository }} | cut -d/ -f1) $(echo ${{ github.repository }} | cut -d/ -f2)

View File

@ -0,0 +1,34 @@
---
name: Close inactive issues
'on':
schedule:
- cron: "55 6 * * 1" # semi-random time
jobs:
close-issues:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v8
with:
days-before-stale: 120
days-before-close: 60
exempt-issue-labels: bug,pinned,security,planned
exempt-pr-labels: bug,pinned,security,planned
stale-issue-label: "stale"
stale-pr-label: "stale"
stale-issue-message: |
This issue has been marked 'stale' due to lack of recent activity. If there is no further activity, the issue will be closed in another 30 days. Thank you for your contribution!
Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark issues as stale.
close-issue-message: |
This issue has been closed due to inactivity. If you feel this is in error, please reopen the issue or file a new issue with the relevant details.
stale-pr-message: |
This pr has been marked 'stale' due to lack of recent activity. If there is no further activity, the issue will be closed in another 30 days. Thank you for your contribution!
Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark issues as stale.
close-pr-message: |
This pr has been closed due to inactivity. If you feel this is in error, please reopen the issue or file a new issue with the relevant details.
repo-token: ${{ secrets.GITHUB_TOKEN }}

5
roles/geerlingguy.docker/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
*.retry
*/__pycache__
*.pyc
.cache

View File

@ -0,0 +1,10 @@
---
extends: default
rules:
line-length:
max: 200
level: warning
ignore: |
.github/workflows/stale.yml

View File

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2017 Jeff Geerling
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.

View File

@ -0,0 +1,172 @@
# Ansible Role: Docker
[![CI](https://github.com/geerlingguy/ansible-role-docker/actions/workflows/ci.yml/badge.svg)](https://github.com/geerlingguy/ansible-role-docker/actions/workflows/ci.yml)
An Ansible Role that installs [Docker](https://www.docker.com) on Linux.
## Requirements
None.
## Role Variables
Available variables are listed below, along with default values (see `defaults/main.yml`):
```yaml
# Edition can be one of: 'ce' (Community Edition) or 'ee' (Enterprise Edition).
docker_edition: 'ce'
docker_packages:
- "docker-{{ docker_edition }}"
- "docker-{{ docker_edition }}-cli"
- "docker-{{ docker_edition }}-rootless-extras"
docker_packages_state: present
```
The `docker_edition` should be either `ce` (Community Edition) or `ee` (Enterprise Edition).
You can also specify a specific version of Docker to install using the distribution-specific format:
Red Hat/CentOS: `docker-{{ docker_edition }}-<VERSION>` (Note: you have to add this to all packages);
Debian/Ubuntu: `docker-{{ docker_edition }}=<VERSION>` (Note: you have to add this to all packages).
You can control whether the package is installed, uninstalled, or at the latest version by setting `docker_packages_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).
```yaml
docker_obsolete_packages:
- docker
- docker.io
- docker-engine
- docker-doc
- docker-compose
- docker-compose-v2
- podman-docker
- containerd
- runc
```
`docker_obsolete_packages` for different os-family:
- [`RedHat.yaml`](./vars/RedHat.yml)
- [`Debian.yaml`](./vars/Debian.yml)
- [`Suse.yaml`](./vars/Suse.yml)
A list of packages to be uninstalled prior to running this role. See [Docker's installation instructions](https://docs.docker.com/engine/install/debian/#uninstall-old-versions) for an up-to-date list of old packages that should be removed.
```yaml
docker_service_manage: true
docker_service_state: started
docker_service_enabled: true
docker_service_start_command: ""
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 `docker_service_manage` to `false`.
```yaml
docker_install_compose_plugin: true
docker_compose_package: docker-compose-plugin
docker_compose_package_state: present
```
Docker Compose Plugin installation options. These differ from the below in that docker-compose is installed as a docker plugin (and used with `docker compose`) instead of a standalone binary.
```yaml
docker_install_compose: false
docker_compose_version: "v2.32.1"
docker_compose_arch: "{{ ansible_facts.architecture }}"
docker_compose_url: "https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-linux-{{ docker_compose_arch }}"
docker_compose_path: /usr/local/bin/docker-compose
```
Docker Compose installation options.
```yaml
docker_add_repo: true
```
Controls whether this role will add the official Docker repository. Set to `false` if you want to use the default docker packages for your system or manage the package repository on your own.
```yaml
docker_repo_url: https://download.docker.com/linux
```
The main Docker repo URL, common between Debian and RHEL systems.
```yaml
docker_apt_release_channel: stable
docker_apt_gpg_key: "{{ docker_repo_url }}/{{ ansible_facts.distribution | lower }}/gpg"
docker_apt_filename: "docker"
```
(Used only for Debian/Ubuntu.) You can switch the channel to `nightly` if you want to use the Nightly release.
You can change `docker_apt_gpg_key` to a different url if you are behind a firewall or provide a trustworthy mirror.
`docker_apt_filename` controls the name of the source list file created in `sources.list.d`. If you are upgrading from an older (<7.0.0) version of this role, you should change this to the name of the existing file (e.g. `download_docker_com_linux_debian` on Debian) to avoid conflicting lists.
```yaml
docker_yum_repo_url: "{{ docker_repo_url }}/{{ 'fedora' if ansible_facts.distribution == 'Fedora' else 'rhel' if ansible_facts.distribution == 'RedHat' else 'centos' }}/docker-{{ docker_edition }}.repo"
docker_yum_repo_enable_test: '0'
docker_yum_gpg_key: "{{ docker_repo_url }}/{{ 'fedora' if ansible_facts.distribution == 'Fedora' else 'rhel' if ansible_facts.distribution == 'RedHat' else 'centos' }}/gpg"
```
(Used only for RedHat/CentOS.) You can enable the Test repo by setting the respective vars to `1`.
You can change `docker_yum_gpg_key` to a different url if you are behind a firewall or provide a trustworthy mirror.
Usually in combination with changing `docker_yum_repository` as well.
```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).
```yaml
docker_daemon_options:
storage-driver: "overlay2"
log-opts:
max-size: "100m"
```
Custom `dockerd` options can be configured through this dictionary representing the json file `/etc/docker/daemon.json`.
## Use with Ansible (and `docker` Python library)
Many users of this role wish to also use Ansible to then _build_ Docker images and manage Docker containers on the server where Docker is installed. In this case, you can easily add in the `docker` Python library using the `geerlingguy.pip` role:
```yaml
- hosts: all
vars:
pip_install_packages:
- name: docker
roles:
- geerlingguy.pip
- geerlingguy.docker
```
## Dependencies
None.
## Example Playbook
```yaml
- hosts: all
roles:
- geerlingguy.docker
```
## License
MIT / BSD
## Sponsors
* [We Manage](https://we-manage.de): Helping start-ups and grown-ups scaling their infrastructure in a sustainable way.
The above sponsor(s) are supporting Jeff Geerling on [GitHub Sponsors](https://github.com/sponsors/geerlingguy). You can sponsor Jeff's work too, to help him continue improving these Ansible open source projects!
## Author Information
This role was created in 2017 by [Jeff Geerling](https://www.jeffgeerling.com/), author of [Ansible for DevOps](https://www.ansiblefordevops.com/).

View File

@ -0,0 +1,64 @@
---
# Edition can be one of: 'ce' (Community Edition) or 'ee' (Enterprise Edition).
docker_edition: 'ce'
docker_packages:
- "docker-{{ docker_edition }}"
- "docker-{{ docker_edition }}-cli"
- "docker-{{ docker_edition }}-rootless-extras"
- "containerd.io"
- docker-buildx-plugin
docker_packages_state: present
docker_obsolete_packages:
- docker
- docker.io
- docker-engine
- docker-doc
- docker-compose
- docker-compose-v2
- podman-docker
- containerd
- runc
# Service options.
docker_service_manage: true
docker_service_state: started
docker_service_enabled: true
docker_service_start_command: ""
docker_restart_handler_state: restarted
# Docker Compose Plugin options.
docker_install_compose_plugin: true
docker_compose_package: docker-compose-plugin
docker_compose_package_state: present
# Docker Compose options.
docker_install_compose: false
docker_compose_version: "v2.32.1"
docker_compose_arch: "{{ ansible_facts.architecture }}"
docker_compose_url: "https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-linux-{{ docker_compose_arch }}"
docker_compose_path: /usr/local/bin/docker-compose
# Enable repo setup
docker_add_repo: true
# Docker repo URL.
docker_repo_url: https://download.docker.com/linux
# Used only for Debian/Ubuntu/Pop!_OS/Linux Mint. Switch 'stable' to 'nightly' if needed.
docker_apt_release_channel: stable
# docker_apt_ansible_distribution is a workaround for Ubuntu variants which can't be identified as such by Ansible,
# and is only necessary until Docker officially supports them.
docker_apt_ansible_distribution: "{{ 'ubuntu' if ansible_facts.distribution in ['Pop!_OS', 'Linux Mint'] else ansible_facts.distribution }}"
docker_apt_gpg_key: "{{ docker_repo_url }}/{{ docker_apt_ansible_distribution | lower }}/gpg"
docker_apt_filename: "docker"
# Used only for RedHat/CentOS/Fedora.
docker_yum_repo_url: "{{ docker_repo_url }}/{{ 'fedora' if ansible_facts.distribution == 'Fedora' else 'rhel' if ansible_facts.distribution == 'RedHat' else 'centos' }}/docker-{{ docker_edition }}.repo"
docker_yum_repo_enable_test: '0'
docker_yum_gpg_key: "{{ docker_repo_url }}/{{ 'fedora' if ansible_facts.distribution == 'Fedora' else 'rhel' if ansible_facts.distribution == 'RedHat' else 'centos' }}/gpg"
# A list of users who will be added to the docker group.
docker_users: []
# Docker daemon options as a dict
docker_daemon_options: {}

View File

@ -0,0 +1,11 @@
---
- name: restart docker
ansible.builtin.service:
name: docker
state: "{{ docker_restart_handler_state }}"
ignore_errors: "{{ ansible_check_mode }}"
when: docker_service_manage | bool
- name: apt update
ansible.builtin.apt:
update_cache: true

View File

@ -0,0 +1,2 @@
install_date: 'Sat 02 May 2026 11:20:27 PM '
version: 8.0.0

View File

@ -0,0 +1,46 @@
---
dependencies: []
galaxy_info:
role_name: docker
author: geerlingguy
description: Docker for Linux.
company: "Midwestern Mac, LLC"
license: "license (BSD, MIT)"
min_ansible_version: 2.15.1
platforms:
- name: Fedora
versions:
- all
- name: Debian
versions:
- buster
- bullseye
- bookworm
- trixie
- name: Ubuntu
versions:
- bionic
- focal
- jammy
- noble
- name: Alpine
version:
- all
- name: ArchLinux
versions:
- all
- name: SLES
versions:
- all
- name: openSUSE
versions:
- all
galaxy_tags:
- web
- system
- containers
- docker
- orchestration
- compose
- server

View File

@ -0,0 +1,24 @@
---
- name: Converge
hosts: all
# become: true
pre_tasks:
- name: Update apt cache.
apt: update_cache=yes cache_valid_time=600
when: ansible_facts.os_family == 'Debian'
- name: Wait for systemd to complete initialization. # noqa 303
command: systemctl is-system-running
register: systemctl_status
until: >
'running' in systemctl_status.stdout or
'degraded' in systemctl_status.stdout
retries: 30
delay: 5
when: ansible_facts.service_mgr == 'systemd'
changed_when: false
failed_when: systemctl_status.rc > 1
roles:
- role: geerlingguy.docker

View File

@ -0,0 +1,21 @@
---
role_name_check: 1
dependency:
name: galaxy
options:
ignore-errors: true
driver:
name: docker
platforms:
- name: instance
image: "geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux9}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-""}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:rw
cgroupns_mode: host
privileged: true
pre_build_image: true
provisioner:
name: ansible
playbooks:
converge: ${MOLECULE_PLAYBOOK:-converge.yml}

View File

@ -0,0 +1,52 @@
---
- name: Verify Docker Role
hosts: all
tasks:
- name: Verify Docker binary is available
command: docker version
register: docker_version_result
changed_when: false
failed_when: docker_version_result.rc != 0
- name: Show Docker version details
debug:
msg: >
Docker Version Output:
{{ docker_version_result.stdout_lines | join('\n') }}
- name: Verify Docker service is running
command: systemctl is-active docker
register: docker_service_status
when: ansible_facts.service_mgr == 'systemd'
changed_when: false
failed_when: docker_service_status.stdout.strip() != "active"
- name: Display Docker service status
debug:
msg: "Docker service is {{ docker_service_status.stdout.strip() }}"
when: ansible_facts.service_mgr == 'systemd'
- name: Pull the 'hello-world' image
command: docker pull hello-world
register: docker_pull_result
changed_when: true
failed_when: docker_pull_result.rc != 0
- name: Show result of pulling the 'hello-world' image
debug:
msg: >
Pulling 'hello-world' completed with output:
{{ docker_pull_result.stdout_lines | join('\n') }}
# TODO: Currently breaks on GitHub Actions, due to Docker-in-Docker quirks.
# - name: Run a test container (hello-world)
# command: docker run --rm hello-world
# register: docker_run_result
# changed_when: true
# failed_when: docker_run_result.rc != 0
# - name: Display test container output
# debug:
# msg: >
# Running 'hello-world' container completed with output:
# {{ docker_run_result.stdout_lines | join('\n') }}

View File

@ -0,0 +1,31 @@
---
- name: Check current docker-compose version.
command: "{{ docker_compose_path }} --version"
register: docker_compose_vsn
check_mode: false
changed_when: false
failed_when: false
- set_fact:
docker_compose_current_version: "{{ docker_compose_vsn.stdout | regex_search('(\\d+(\\.\\d+)+)') }}"
when: >
docker_compose_vsn.stdout is defined
and (docker_compose_vsn.stdout | length > 0)
- name: Delete existing docker-compose version if it's different.
file:
path: "{{ docker_compose_path }}"
state: absent
when: >
docker_compose_current_version is defined
and (docker_compose_version | regex_replace('v', '')) not in docker_compose_current_version
- name: Install Docker Compose (if configured).
get_url:
url: "{{ docker_compose_url }}"
dest: "{{ docker_compose_path }}"
mode: 0755
when: >
(docker_compose_current_version is not defined)
or (docker_compose_current_version | length == 0)
or (docker_compose_current_version is version((docker_compose_version | regex_replace('v', '')), '<'))

View File

@ -0,0 +1,10 @@
---
- name: Ensure docker users are added to the docker group.
user:
name: "{{ item }}"
groups: docker
append: true
with_items: "{{ docker_users }}"
- name: Reset ssh connection to apply user changes.
meta: reset_connection

View File

@ -0,0 +1,122 @@
---
- name: Load OS-specific vars.
include_vars: "{{ lookup('first_found', params) }}"
vars:
params:
files:
- '{{ansible_facts.distribution}}.yml'
- '{{ansible_facts.os_family}}.yml'
- main.yml
paths:
- 'vars'
- include_tasks: setup-RedHat.yml
when: ansible_facts.os_family == 'RedHat'
- include_tasks: setup-Suse.yml
when: ansible_facts.os_family == 'Suse'
- include_tasks: setup-Debian.yml
when: ansible_facts.os_family == 'Debian'
- name: Install Docker packages.
package:
name: "{{ docker_packages }}"
state: "{{ docker_packages_state }}"
notify: restart docker
ignore_errors: "{{ ansible_check_mode }}"
when: "ansible_version.full is version_compare('2.12', '<') or ansible_facts.os_family not in ['RedHat', 'Debian']"
- name: Install Docker packages (with downgrade option).
package:
name: "{{ docker_packages }}"
state: "{{ docker_packages_state }}"
allow_downgrade: true
notify: restart docker
ignore_errors: "{{ ansible_check_mode }}"
when: "ansible_version.full is version_compare('2.12', '>=') and ansible_facts.os_family in ['RedHat', 'Debian']"
- name: Install docker-compose plugin.
package:
name: "{{ docker_compose_package }}"
state: "{{ docker_compose_package_state }}"
notify: restart docker
ignore_errors: "{{ ansible_check_mode }}"
when: "docker_install_compose_plugin | bool == true and (ansible_version.full is version_compare('2.12', '<') or ansible_facts.os_family not in ['RedHat', 'Debian', 'Suse'])"
- name: Install docker-compose-plugin (with downgrade option).
package:
name: "{{ docker_compose_package }}"
state: "{{ docker_compose_package_state }}"
allow_downgrade: true
notify: restart docker
ignore_errors: "{{ ansible_check_mode }}"
when: "docker_install_compose_plugin | bool == true and ansible_version.full is version_compare('2.12', '>=') and ansible_facts.os_family in ['RedHat', 'Debian']"
- name: Ensure /etc/docker/ directory exists.
file:
path: /etc/docker
state: directory
mode: 0755
when: docker_daemon_options.keys() | length > 0
- name: Configure Docker daemon options.
copy:
content: "{{ docker_daemon_options | to_nice_json }}"
dest: /etc/docker/daemon.json
mode: 0644
when: docker_daemon_options.keys() | length > 0
notify: restart docker
- name: Replace Docker service ExecStart command if configured.
when: docker_service_start_command != ""
notify: restart docker
block:
- name: Get Docker service status
ansible.builtin.systemd_service:
name: docker
register: docker_service_status
- name: Patch docker.service
ansible.builtin.replace:
path: "{{ docker_service_status.status['FragmentPath'] }}"
regexp: "^ExecStart=.*$"
replace: "ExecStart={{ docker_service_start_command }}"
register: docker_service_patch
- name: Reload systemd services
service:
daemon_reload: true
when: docker_service_patch is changed
- name: Ensure Docker is started and enabled at boot.
service:
name: docker
state: "{{ docker_service_state }}"
enabled: "{{ docker_service_enabled }}"
ignore_errors: "{{ ansible_check_mode }}"
when: docker_service_manage | bool
- name: Ensure handlers are notified now to avoid firewall conflicts.
meta: flush_handlers
- include_tasks: docker-compose.yml
when: docker_install_compose | bool
- name: Get docker group info using getent.
getent:
database: group
key: docker
split: ':'
when: docker_users | length > 0
- name: Check if there are any users to add to the docker group.
set_fact:
at_least_one_user_to_modify: true
when:
- docker_users | length > 0
- item not in ansible_facts.getent_group["docker"][2]
with_items: "{{ docker_users }}"
- include_tasks: docker-users.yml
when: at_least_one_user_to_modify is defined

View File

@ -0,0 +1,42 @@
---
- name: Ensure apt key is not present in trusted.gpg.d
ansible.builtin.file:
path: /etc/apt/trusted.gpg.d/docker.asc
state: absent
- name: Ensure old apt source list is not present in /etc/apt/sources.list.d
ansible.builtin.file:
path: "/etc/apt/sources.list.d/download_docker_com_linux_{{ docker_apt_ansible_distribution | lower }}.list"
state: absent
# See https://docs.docker.com/engine/install/debian/#uninstall-old-versions
- name: Ensure old versions of Docker are not installed.
ansible.builtin.package:
name: "{{ docker_obsolete_packages }}"
state: absent
- name: Ensure legacy repo file is not present.
ansible.builtin.file:
path: "/etc/apt/sources.list.d/docker.list"
state: absent
- name: Ensure dependencies are installed.
ansible.builtin.apt:
name:
- ca-certificates
- python3-debian
state: present
- name: Add or remove Docker repository.
ansible.builtin.deb822_repository:
name: "{{ docker_apt_filename }}"
types: deb
uris: "{{ docker_repo_url }}/{{ docker_apt_ansible_distribution | lower }}"
suites: "{{ ansible_facts.distribution_release }}"
components: "{{ docker_apt_release_channel }}"
signed_by: "{{ docker_apt_gpg_key }}"
state: "{{ 'present' if docker_add_repo | bool else 'absent' }}"
notify: apt update
- name: Ensure handlers are notified immediately to update the apt cache.
ansible.builtin.meta: flush_handlers

View File

@ -0,0 +1,55 @@
---
- name: Ensure old versions of Docker are not installed.
package:
name: "{{ docker_obsolete_packages }}"
state: absent
- name: Add Docker GPG key.
rpm_key:
key: "{{ docker_yum_gpg_key }}"
state: present
when: docker_add_repo | bool
- name: Add Docker repository.
get_url:
url: "{{ docker_yum_repo_url }}"
dest: "/etc/yum.repos.d/docker-{{ docker_edition }}.repo"
owner: root
group: root
mode: 0644
when: docker_add_repo | bool
- name: Remove Docker Nightly repo.
ini_file:
dest: "/etc/yum.repos.d/docker-{{ docker_edition }}.repo"
section: "docker-{{ docker_edition }}-nightly"
state: absent
when: docker_add_repo | bool
- name: Configure Docker Test repo.
ini_file:
dest: "/etc/yum.repos.d/docker-{{ docker_edition }}.repo"
section: "docker-{{ docker_edition }}-test"
option: enabled
value: "{{ docker_yum_repo_enable_test }}"
mode: 0644
no_extra_spaces: true
when: docker_add_repo | bool
- name: Configure containerd on RHEL 8.
block:
- name: Ensure runc is not installed.
package:
name: runc
state: absent
- name: Ensure container-selinux is installed.
package:
name: container-selinux
state: present
- name: Ensure containerd.io is installed.
package:
name: containerd.io
state: present
when: ansible_facts.distribution_major_version | int == 8

View File

@ -0,0 +1,39 @@
---
# Remove old or conflicting Docker packages
- name: Ensure old versions of Docker are not installed
package:
name: "{{ docker_obsolete_packages }}"
state: absent
check_mode: no
changed_when: false
# Add Docker repository (openSUSE / SLES)
- name: Add Docker repository
zypper_repository:
name: "docker-ce"
repo: "{{ docker_zypper_repo_url }}"
state: present
auto_import_keys: yes
when: docker_add_repo | bool
# Refresh zypper repositories only if the repo was added
- name: Refresh zypper repositories
command: zypper --non-interactive refresh
when: docker_add_repo | bool
register: zypper_refresh
changed_when: false # idempotent for Molecule
# Install Docker packages
- name: Ensure Docker packages are installed
ansible.legacy.zypper:
name: "{{ docker_packages }}"
state: present
changed_when: false # idempotent for Molecule
# Ensure Docker is started and enabled at boot
- name: Ensure Docker is started and enabled at boot
systemd:
name: docker
state: started
enabled: true
changed_when: false # idempotent for Molecule

View File

@ -0,0 +1,3 @@
---
docker_packages: "docker"
docker_compose_package: docker-cli-compose

View File

@ -0,0 +1,3 @@
---
docker_packages: "docker"
docker_compose_package: docker-compose

View File

@ -0,0 +1,14 @@
---
# Used only for Debian/Ubuntu (Debian OS-Family)
# https://docs.docker.com/engine/install/debian/#uninstall-old-versions
docker_obsolete_packages:
- docker
- docker.io
- docker-engine
- docker-doc
- docker-compose
- docker-compose-v2
- podman-docker
- containerd
- runc

View File

@ -0,0 +1,14 @@
---
# Used only for Fedora/Rocky (RedHat OS-Family)
# https://docs.docker.com/engine/install/fedora/#uninstall-old-versions
# https://docs.docker.com/engine/install/centos/#uninstall-old-versions
docker_obsolete_packages:
- docker
- docker-client
- docker-client-latest
- docker-common
- docker-latest
- docker-latest-logrotate
- docker-logrotate
- docker-engine

View File

@ -0,0 +1,41 @@
---
# Used only for openSUSE / SLES (SUSE OS-Family)
# https://en.opensuse.org/Docker
# https://docs.docker.com/engine/install/binaries/
# Packages to remove if present (old or conflicting Docker packages)
docker_obsolete_packages:
- docker-engine
- docker.io
- docker-ce
- docker-ce-cli
- docker-buildx-plugin
- docker-ce-rootless-extras
- containerd.io
- runc
# Packages to install on openSUSE / SLES
# Use 'runc' from repo, not 'docker-runc' (avoids conflicts on Leap 15.6)
docker_packages:
- docker
- containerd
- runc
# Map SUSE releases to Docker repository paths
docker_suse_release: >-
{% if ansible_facts.distribution_version is match('15\\.6') %}
openSUSE_Leap_15.6
{% elif ansible_facts.distribution_version is match('15\\.5') %}
openSUSE_Leap_15.5
{% elif ansible_facts.distribution_version is match('15\\.4') %}
openSUSE_Leap_15.4
{% else %}
openSUSE_Tumbleweed
{% endif %}
# Official Docker repo URL for openSUSE Leap
docker_zypper_repo_url: >-
https://download.opensuse.org/repositories/Virtualization:/containers/{{ docker_suse_release | trim }}/
# Control whether to add the Docker repository
docker_add_repo: true

View File

@ -0,0 +1,2 @@
---
# Empty file

View File

@ -134,48 +134,107 @@
failed_when: false
when: workstation_install_fonts
- name: Remove conflicting tldr (Python) before tealdeer install
community.general.pacman:
name: tldr
state: absent
become: true
# ── Productivity tools ──────────────────────────────────────────────────
- name: Install productivity tools
- name: Install official repo packages
community.general.pacman:
name:
- flameshot
- meld
- zeal
- btop
- ranger
- timeshift
- syncthing
- keepassxc
- zellij
- sshs
- dust
- duf
- procs
- fd
- lazygit
- delta
- gh
- git-delta
- github-cli
- tig
- tealdeer
- glow
- gum
- thunderbird
- keepassxc
- vlc
- spotify
- gimp
- flameshot
- tailscale
- gparted
- timeshift
- rclone
- zen-browser-bin
- chromium
- ghostty
state: present
when: workstation_install_productivity
become: true
# - name: Install AUR packages
# kewlfft.aur.aur:
# name:
# - zeal
# - sshs
# - spotify
# - timeshift
# - zen-browser-bin
# - devenv
# - ansible
# - ghostty
# use: yay
# state: present
# become_user: "{{ workstation_user }}"
- name: Register reminder — Ghostty Ctrl+Alt+T shortcut
set_fact:
post_install_reminders: "{{ post_install_reminders | default([]) + [reminder] }}"
vars:
reminder:
title: "Ghostty Ctrl+Alt+T shortcut"
steps:
- "System Settings → Shortcuts → Custom Shortcuts"
- "Add new → Global Shortcut → Command/URL"
- "Trigger: Ctrl+Alt+T"
- "Action: bash -c 'kdotool search --class ghostty windowactivate || ghostty'"
- name: Register reminder — Set Fish as default shell
set_fact:
post_install_reminders: "{{ post_install_reminders | default([]) + [reminder] }}"
vars:
reminder:
title: "Set Fish as default shell"
steps:
- "Run: chsh -s /usr/bin/fish"
- "Log out / back in"
- name: Register reminder — Install AUR packages manually
set_fact:
post_install_reminders: "{{ post_install_reminders | default([]) + [reminder] }}"
vars:
reminder:
title: "Install AUR packages manually"
steps:
- "Run: yay -S zeal sshs spotify timeshift zen-browser-bin devenv ansible ghostty"
- "Or one at a time if you want to review each PKGBUILD"
- name: Register reminder — Configure Timeshift
set_fact:
post_install_reminders: "{{ post_install_reminders | default([]) + [reminder] }}"
vars:
reminder:
title: "Configure Timeshift snapshots"
steps:
- "Run: sudo timeshift-gtk"
- "Select snapshot type (RSYNC for ext4, BTRFS if applicable)"
- "Choose snapshot location (separate disk recommended)"
- "Set schedule: Daily=5, Weekly=3, Monthly=2 (or your preference)"
- "Exclude /home from snapshots (system snapshots only)"
- "Run first manual snapshot to verify config"
# ── NVIDIA ──────────────────────────────────────────────────────────────
- name: Check for NVIDIA GPU