From 3fb64d26616df9cecc24b655ed0d7d6de1895c7c Mon Sep 17 00:00:00 2001 From: Rene Mewissen Date: Thu, 6 Nov 2025 16:07:22 +0100 Subject: [PATCH] new role podman --- host_vars/podman01.universe.local | 0 hosts | 4 ++ local.yml | 8 +++ roles/podman/README.md | 60 +++++++++++++++++++++ roles/podman/defaults/main.yml | 18 +++++++ roles/podman/main.yml | 88 +++++++++++++++++++++++++++++++ 6 files changed, 178 insertions(+) create mode 100644 host_vars/podman01.universe.local create mode 100644 roles/podman/README.md create mode 100644 roles/podman/defaults/main.yml create mode 100644 roles/podman/main.yml diff --git a/host_vars/podman01.universe.local b/host_vars/podman01.universe.local new file mode 100644 index 0000000..e69de29 diff --git a/hosts b/hosts index 7d0c344..3ae9818 100644 --- a/hosts +++ b/hosts @@ -141,6 +141,10 @@ endor.universe.local endorvm.universe.local tuxedo-book-xp1511.universe.local +[podman_servers] +podman01.universe.local +podman02.universe.local + [printspooler] [proxyserver] diff --git a/local.yml b/local.yml index bdceb75..bd652ac 100644 --- a/local.yml +++ b/local.yml @@ -144,6 +144,14 @@ roles: - docker +- hosts: podman_servers + tags: server,podman + become: true + handlers: + - import_tasks: global_handlers/global_handlers.yml + roles: + - podman + - hosts: drone tags: server,docker,drone become: true diff --git a/roles/podman/README.md b/roles/podman/README.md new file mode 100644 index 0000000..c8c225a --- /dev/null +++ b/roles/podman/README.md @@ -0,0 +1,60 @@ +# Ansible Role: podman + +Diese Rolle installiert Podman und Portainer auf Debian-basierten Systemen. +Zusätzlich wird ein NFS-Share von einem TrueNAS-System gemountet, um persistente Daten für Podman-Container, einschließlich Portainer, zu speichern. + +## Anforderungen + +Diese Rolle wurde für Debian-basierte Systeme entwickelt und getestet. +Es wird davon ausgegangen, dass ein NFS-Share auf einem TrueNAS-System bereits konfiguriert und exportiert ist. + +## Rollenvariablen + +Die folgenden Variablen können angepasst werden, um das Verhalten der Rolle zu steuern. Die Standardwerte sind in `defaults/main.yml` definiert. + +| Variable | Standardwert | Beschreibung | +|---|---|---| +| `podman_nfs_server` | `"192.168.1.10"` | Die IP-Adresse des TrueNAS-Servers, der den NFS-Share bereitstellt. | +| `podman_nfs_share_path` | `"/mnt/pool/podman_data"` | Der Pfad zum NFS-Share auf dem TrueNAS-System. | +| `podman_data_mount_point` | `"/var/lib/podman_nfs"` | Der lokale Mount-Punkt auf dem Zielsystem für den NFS-Share. | +| `portainer_data_path` | `{{ podman_data_mount_point }}/portainer` | Der Pfad innerhalb des NFS-Mount-Punkts, wo Portainer seine persistenten Daten speichert. | +| `portainer_image` | `"portainer/portainer-ce:latest"` | Das Docker/Podman-Image für Portainer. | +| `portainer_name` | `"portainer"` | Der Name des Portainer-Containers. | +| `portainer_web_port` | `9443` | Der Port für die Portainer Web-Oberfläche (HTTPS). | +| `portainer_edge_agent_port` | `8000` | Der Port für den Portainer Edge Agent. | +| `portainer_legacy_port` | `9000` | Der alte Standard-Port für Portainer (HTTP), oft noch exponiert. | + +## Abhängigkeiten + +Diese Rolle hat keine Abhängigkeiten von anderen Ansible-Rollen. + +## Beispiel-Playbook + +So können Sie die Rolle in Ihr Playbook integrieren: + +```yaml +- hosts: podman_hosts + become: true + roles: + - podman +``` + +Um spezifische Variablen zu überschreiben, können Sie dies im Playbook oder in Ihren `group_vars` tun: + +```yaml +- hosts: podman_hosts + become: true + vars: + podman_nfs_server: "10.0.0.50" + podman_nfs_share_path: "/mnt/mainpool/apps/podman" + roles: + - podman +``` + +## Lizenz + +MIT + +## Autor + +Ihr Name \ No newline at end of file diff --git a/roles/podman/defaults/main.yml b/roles/podman/defaults/main.yml new file mode 100644 index 0000000..9bda539 --- /dev/null +++ b/roles/podman/defaults/main.yml @@ -0,0 +1,18 @@ +--- +# defaults file for roles/podman + +# NFS configuration for persistent Podman data +podman_nfs_server: "truenas.universe.local" # Ersetzen Sie dies durch die IP-Adresse Ihres TrueNAS-Servers +podman_nfs_share_path: "/mnt/data/podman" # Ersetzen Sie dies durch den Pfad Ihres NFS-Shares auf TrueNAS +podman_data_mount_point: "/opt/podman" # Lokaler Mount-Punkt für den NFS-Share + +# Portainer configuration +portainer_data_path: "{{ podman_data_mount_point }}/portainer" # Pfad für Portainers persistente Daten +portainer_image: "portainer/portainer-ce:latest" +portainer_name: "portainer" +portainer_web_port: 9443 # Port für die Portainer Web-Oberfläche (HTTPS) +portainer_edge_agent_port: 8000 # Port für den Portainer Edge Agent +portainer_legacy_port: 9000 # Portainer's alter Standard-Port (HTTP), oft noch exponiert + +# Hinweis: Stellen Sie sicher, dass der NFS-Share auf TrueNAS korrekt konfiguriert und exportiert ist +# und die entsprechenden Berechtigungen für den Zugriff vom Ansible-Zielsystem aus hat. \ No newline at end of file diff --git a/roles/podman/main.yml b/roles/podman/main.yml new file mode 100644 index 0000000..97ecb6b --- /dev/null +++ b/roles/podman/main.yml @@ -0,0 +1,88 @@ +--- +# tasks file for roles/podman + +- name: Ensure NFS client utilities are installed + ansible.builtin.apt: + name: nfs-common + state: present + update_cache: yes + +- name: Create local mount point for Podman NFS data + ansible.builtin.file: + path: "{{ podman_data_mount_point }}" + state: directory + mode: '0755' + owner: root + group: root + +- name: Add NFS mount entry to /etc/fstab + ansible.posix.mount: + src: "{{ podman_nfs_server }}:{{ podman_nfs_share_path }}" + path: "{{ podman_data_mount_point }}" + fstype: nfs + opts: defaults,hard,intr,noatime,nofail # 'nofail' verhindert, dass der Bootvorgang stoppt, wenn der NFS-Server nicht erreichbar ist. + state: present + +- name: Mount Podman NFS share + ansible.posix.mount: + path: "{{ podman_data_mount_point }}" + state: mounted + +- name: Install Podman and related tools + ansible.builtin.apt: + name: + - podman + - podman-docker # Bietet ein Docker-kompatibles CLI-Interface + - buildah # Tool zum Erstellen von OCI-Images + - skopeo # Tool zum Verschieben und Kopieren von Container-Images + - containers-common # Enthält allgemeine Konfigurationsdateien für Container + state: present + update_cache: yes + +- name: Ensure Podman systemd socket is enabled and running + ansible.builtin.systemd: + name: podman.socket + state: started + enabled: yes + # Dies stellt sicher, dass der Podman-Socket für die Kommunikation verfügbar ist, + # insbesondere für Tools wie Portainer, die sich mit dem Socket verbinden. + +- name: Create Portainer data directory on NFS share + ansible.builtin.file: + path: "{{ portainer_data_path }}" + state: directory + mode: '0755' + owner: root + group: root + +- name: Run Portainer container with Podman + ansible.builtin.command: + cmd: > + podman run -d + --name {{ portainer_name }} + --restart=always + -p {{ portainer_edge_agent_port }}:8000 + -p {{ portainer_web_port }}:9443 + -p {{ portainer_legacy_port }}:9000 + -v /run/podman/podman.sock:/var/run/docker.sock # Map Podman socket to Docker socket path for Portainer compatibility + -v {{ portainer_data_path }}:/data + {{ portainer_image }} + creates: "{{ portainer_data_path }}/portainer.db" # Prüft, ob die Portainer-Datenbankdatei existiert, um Idempotenz zu gewährleisten + args: + warn: false # Unterdrückt die Warnung, dass das 'command'-Modul für idempotente Operationen verwendet wird + # Verbesserungsvorschlag: Für eine robustere Container-Verwaltung könnte das Modul + # `community.general.podman_container` verwendet werden, falls die `community.general`-Collection installiert ist. + # Beispiel: + # - name: Run Portainer container with Podman (using podman_container module) + # community.general.podman_container: + # name: "{{ portainer_name }}" + # image: "{{ portainer_image }}" + # state: started + # restart_policy: always + # ports: + # - "{{ portainer_edge_agent_port }}:8000" + # - "{{ portainer_web_port }}:9443" + # - "{{ portainer_legacy_port }}:9000" + # volume: + # - "/run/podman/podman.sock:/var/run/docker.sock" + # - "{{ portainer_data_path }}:/data" \ No newline at end of file