From 184cd2574d4ab208ff87c5313bb84ec27ed146d8 Mon Sep 17 00:00:00 2001 From: Bastian de Byl Date: Thu, 1 Feb 2024 15:35:11 -0500 Subject: [PATCH] noticket - reorganized podman --- ansible/deploy_home.yml | 1 + ansible/roles/podman/defaults/main.yml | 2 + .../podman/tasks/container-sshpass-cron.yml | 62 ----------------- .../base/awsddns.yml} | 4 +- .../base/conf-nginx-http.yml} | 0 .../base/conf-nginx-https.yml} | 0 .../base/conf-nginx-modsec.yml} | 0 .../base/conf-nginx.yml} | 6 +- .../base/nginx.yml} | 0 .../debyltech/fulfillr.yml} | 0 .../games/factorio.yml} | 0 .../tasks/containers/games/palworld.yml | 56 ++++++++++++++++ .../home/cloud.yml} | 0 .../home/drone.yml} | 0 .../home/graylog.yml} | 0 .../home/hass.yml} | 0 .../home/nosql.yml} | 0 .../home/partkeepr.yml} | 0 .../home/photos.yml} | 0 .../skudak/cloud.yml} | 0 .../skudak/wiki.yml} | 0 ansible/roles/podman/tasks/firewall.yml | 6 ++ ansible/roles/podman/tasks/main.yml | 63 +++++++++--------- .../podman/tasks/{ => podman}/podman.yml | 0 ansible/vars/vault.yml | Bin 12365 -> 13077 bytes 25 files changed, 102 insertions(+), 98 deletions(-) delete mode 100644 ansible/roles/podman/tasks/container-sshpass-cron.yml rename ansible/roles/podman/tasks/{container-awsddns.yml => containers/base/awsddns.yml} (95%) rename ansible/roles/podman/tasks/{configuration-nginx-http.yml => containers/base/conf-nginx-http.yml} (100%) rename ansible/roles/podman/tasks/{configuration-nginx-https.yml => containers/base/conf-nginx-https.yml} (100%) rename ansible/roles/podman/tasks/{configuration-nginx-modsec.yml => containers/base/conf-nginx-modsec.yml} (100%) rename ansible/roles/podman/tasks/{configuration-nginx.yml => containers/base/conf-nginx.yml} (72%) rename ansible/roles/podman/tasks/{container-nginx.yml => containers/base/nginx.yml} (100%) rename ansible/roles/podman/tasks/{container-fulfillr.yml => containers/debyltech/fulfillr.yml} (100%) rename ansible/roles/podman/tasks/{container-factorio.yml => containers/games/factorio.yml} (100%) create mode 100644 ansible/roles/podman/tasks/containers/games/palworld.yml rename ansible/roles/podman/tasks/{container-cloud.yml => containers/home/cloud.yml} (100%) rename ansible/roles/podman/tasks/{container-drone.yml => containers/home/drone.yml} (100%) rename ansible/roles/podman/tasks/{container-graylog.yml => containers/home/graylog.yml} (100%) rename ansible/roles/podman/tasks/{container-hass.yml => containers/home/hass.yml} (100%) rename ansible/roles/podman/tasks/{container-nosql.yml => containers/home/nosql.yml} (100%) rename ansible/roles/podman/tasks/{container-partkeepr.yml => containers/home/partkeepr.yml} (100%) rename ansible/roles/podman/tasks/{container-photos.yml => containers/home/photos.yml} (100%) rename ansible/roles/podman/tasks/{container-cloud-skudak.yml => containers/skudak/cloud.yml} (100%) rename ansible/roles/podman/tasks/{container-bookstack.yml => containers/skudak/wiki.yml} (100%) rename ansible/roles/podman/tasks/{ => podman}/podman.yml (100%) diff --git a/ansible/deploy_home.yml b/ansible/deploy_home.yml index 0f7aefb..b12b6b1 100644 --- a/ansible/deploy_home.yml +++ b/ansible/deploy_home.yml @@ -1,3 +1,4 @@ +--- - hosts: all vars_files: - vars/vault.yml diff --git a/ansible/roles/podman/defaults/main.yml b/ansible/roles/podman/defaults/main.yml index 8c68086..523b06a 100644 --- a/ansible/roles/podman/defaults/main.yml +++ b/ansible/roles/podman/defaults/main.yml @@ -1,5 +1,6 @@ --- bookstack_path: "{{ podman_volumes }}/bookstack" +cam2ip_path: "{{ podman_volumes }}/cam2ip" cloud_path: "{{ podman_volumes }}/cloud" cloud_skudak_path: "{{ podman_volumes }}/skudakcloud" debyltech_path: "{{ podman_volumes }}/debyltech" @@ -14,6 +15,7 @@ partkeepr_path: "{{ podman_volumes }}/partkeepr" photos_path: "{{ podman_volumes }}/photos" pihole_path: "{{ podman_volumes }}/pihole" sshpass_cron_path: "{{ podman_volumes }}/sshpass_cron" +palworld_path: "{{ podman_volumes }}/palworld" drone_server_proto: "https" drone_runner_proto: "http" diff --git a/ansible/roles/podman/tasks/container-sshpass-cron.yml b/ansible/roles/podman/tasks/container-sshpass-cron.yml deleted file mode 100644 index 17051c5..0000000 --- a/ansible/roles/podman/tasks/container-sshpass-cron.yml +++ /dev/null @@ -1,62 +0,0 @@ ---- -- name: create sshpass_cron host directory volumes - become: true - ansible.builtin.file: - path: "{{ item }}" - state: directory - owner: "{{ podman_user }}" - group: "{{ podman_user }}" - mode: 0755 - notify: restorecon podman - loop: - - "{{ sshpass_cron_path }}" - -- name: copy sshpass_cron crontab - become: true - ansible.builtin.template: - src: "files/sshpass_cron/{{ item }}" - dest: "{{ sshpass_cron_path }}/{{ item }}" - owner: "{{ podman_user }}" - group: "{{ podman_user }}" - mode: 0644 - loop: - - crontab - notify: - - restorecon podman - -- name: create sshpass_cron password file - become: true - ansible.builtin.copy: - dest: "{{ sshpass_cron_path }}/unifi-pass" - content: "{{ unifi_ssh_password }}" - owner: "{{ podman_user }}" - group: "{{ podman_user }}" - mode: 0400 - notify: - - restorecon podman - -- name: flush handlers - ansible.builtin.meta: flush_handlers - -- import_tasks: podman/podman-check.yml - vars: - container_name: sshpass_cron - container_image: "{{ image }}" - -- name: create sshpass_cron container - become: true - become_user: "{{ podman_user }}" - containers.podman.podman_container: - name: sshpass_cron - image: "{{ image }}" - restart_policy: on-failure:3 - log_driver: journald - volumes: - - "{{ sshpass_cron_path }}:/mnt" - env: - TZ: "America/New_York" - -- name: create systemd startup job for sshpass_cron - include_tasks: podman/systemd-generate.yml - vars: - container_name: sshpass_cron diff --git a/ansible/roles/podman/tasks/container-awsddns.yml b/ansible/roles/podman/tasks/containers/base/awsddns.yml similarity index 95% rename from ansible/roles/podman/tasks/container-awsddns.yml rename to ansible/roles/podman/tasks/containers/base/awsddns.yml index 0377158..792e6ef 100644 --- a/ansible/roles/podman/tasks/container-awsddns.yml +++ b/ansible/roles/podman/tasks/containers/base/awsddns.yml @@ -71,8 +71,8 @@ AWS_ZONE_TTL: 60 AWS_ZONE_ID: "{{ fulfillr_zone_id }}" AWS_ZONE_HOSTNAME: "{{ fulfillr_server_name }}" - AWS_ACCESS_KEY_ID: "{{ fulfillr_access_key }}" - AWS_SECRET_ACCESS_KEY: "{{ fulfillr_secret_key }}" + AWS_ACCESS_KEY_ID: "{{ fulfillr_dns_access_key }}" + AWS_SECRET_ACCESS_KEY: "{{ fulfillr_dns_secret_key }}" AWS_DEFAULT_REGION: "{{ fulfillr_region }}" - name: create systemd startup job for awsddns-fulfillr diff --git a/ansible/roles/podman/tasks/configuration-nginx-http.yml b/ansible/roles/podman/tasks/containers/base/conf-nginx-http.yml similarity index 100% rename from ansible/roles/podman/tasks/configuration-nginx-http.yml rename to ansible/roles/podman/tasks/containers/base/conf-nginx-http.yml diff --git a/ansible/roles/podman/tasks/configuration-nginx-https.yml b/ansible/roles/podman/tasks/containers/base/conf-nginx-https.yml similarity index 100% rename from ansible/roles/podman/tasks/configuration-nginx-https.yml rename to ansible/roles/podman/tasks/containers/base/conf-nginx-https.yml diff --git a/ansible/roles/podman/tasks/configuration-nginx-modsec.yml b/ansible/roles/podman/tasks/containers/base/conf-nginx-modsec.yml similarity index 100% rename from ansible/roles/podman/tasks/configuration-nginx-modsec.yml rename to ansible/roles/podman/tasks/containers/base/conf-nginx-modsec.yml diff --git a/ansible/roles/podman/tasks/configuration-nginx.yml b/ansible/roles/podman/tasks/containers/base/conf-nginx.yml similarity index 72% rename from ansible/roles/podman/tasks/configuration-nginx.yml rename to ansible/roles/podman/tasks/containers/base/conf-nginx.yml index febecdd..afa0cb8 100644 --- a/ansible/roles/podman/tasks/configuration-nginx.yml +++ b/ansible/roles/podman/tasks/containers/base/conf-nginx.yml @@ -11,9 +11,9 @@ - ssl - https -- import_tasks: configuration-nginx-http.yml -- import_tasks: configuration-nginx-https.yml -- import_tasks: configuration-nginx-modsec.yml +- import_tasks: conf-nginx-http.yml +- import_tasks: conf-nginx-https.yml +- import_tasks: conf-nginx-modsec.yml - name: flush handlers ansible.builtin.meta: flush_handlers diff --git a/ansible/roles/podman/tasks/container-nginx.yml b/ansible/roles/podman/tasks/containers/base/nginx.yml similarity index 100% rename from ansible/roles/podman/tasks/container-nginx.yml rename to ansible/roles/podman/tasks/containers/base/nginx.yml diff --git a/ansible/roles/podman/tasks/container-fulfillr.yml b/ansible/roles/podman/tasks/containers/debyltech/fulfillr.yml similarity index 100% rename from ansible/roles/podman/tasks/container-fulfillr.yml rename to ansible/roles/podman/tasks/containers/debyltech/fulfillr.yml diff --git a/ansible/roles/podman/tasks/container-factorio.yml b/ansible/roles/podman/tasks/containers/games/factorio.yml similarity index 100% rename from ansible/roles/podman/tasks/container-factorio.yml rename to ansible/roles/podman/tasks/containers/games/factorio.yml diff --git a/ansible/roles/podman/tasks/containers/games/palworld.yml b/ansible/roles/podman/tasks/containers/games/palworld.yml new file mode 100644 index 0000000..01796d9 --- /dev/null +++ b/ansible/roles/podman/tasks/containers/games/palworld.yml @@ -0,0 +1,56 @@ +--- +- name: create palworld host directory volumes + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ podman_subuid.stdout }}" + group: "{{ podman_user }}" + mode: 0755 + notify: restorecon podman + loop: + - "{{ palworld_path }}" + +- name: unshare chown the palworld volumes + become: true + become_user: "{{ podman_user }}" + changed_when: false + ansible.builtin.command: | + podman unshare chown -R 1000:10000 {{ palworld_path }} + +- import_tasks: podman/podman-check.yml + vars: + container_name: palworld + container_image: "{{ image }}" + +- name: create palworld server container + become: true + become_user: "{{ podman_user }}" + containers.podman.podman_container: + name: palworld + image: "{{ image }}" + image_strict: true + restart_policy: unless-stopped + log_driver: journald + volumes: + - "{{ palworld_path }}:/palworld" + env: + ALWAYS_UPDATE_ON_START: "true" + MAX_PLAYERS: 32 + MULTITHREAD_ENABLED: "true" + COMMUNITY_SERVER: "false" + RCON_ENABLED: "true" + RCON_PORT: 25575 + PUBLIC_PORT: 8211 + SERVER_NAME: Bearbehr and Friends + SERVER_DESCRIPTION: Bearbehr's Dedicated Server for Friends + SERVER_PASSWORD: "" + ADMIN_PASSWORD: "{{ palworld_admin_password }}" + ports: + - 8211:8211/udp + - 25575:25575/udp + +- name: create systemd startup job for palworld + include_tasks: podman/systemd-generate.yml + vars: + container_name: palworld diff --git a/ansible/roles/podman/tasks/container-cloud.yml b/ansible/roles/podman/tasks/containers/home/cloud.yml similarity index 100% rename from ansible/roles/podman/tasks/container-cloud.yml rename to ansible/roles/podman/tasks/containers/home/cloud.yml diff --git a/ansible/roles/podman/tasks/container-drone.yml b/ansible/roles/podman/tasks/containers/home/drone.yml similarity index 100% rename from ansible/roles/podman/tasks/container-drone.yml rename to ansible/roles/podman/tasks/containers/home/drone.yml diff --git a/ansible/roles/podman/tasks/container-graylog.yml b/ansible/roles/podman/tasks/containers/home/graylog.yml similarity index 100% rename from ansible/roles/podman/tasks/container-graylog.yml rename to ansible/roles/podman/tasks/containers/home/graylog.yml diff --git a/ansible/roles/podman/tasks/container-hass.yml b/ansible/roles/podman/tasks/containers/home/hass.yml similarity index 100% rename from ansible/roles/podman/tasks/container-hass.yml rename to ansible/roles/podman/tasks/containers/home/hass.yml diff --git a/ansible/roles/podman/tasks/container-nosql.yml b/ansible/roles/podman/tasks/containers/home/nosql.yml similarity index 100% rename from ansible/roles/podman/tasks/container-nosql.yml rename to ansible/roles/podman/tasks/containers/home/nosql.yml diff --git a/ansible/roles/podman/tasks/container-partkeepr.yml b/ansible/roles/podman/tasks/containers/home/partkeepr.yml similarity index 100% rename from ansible/roles/podman/tasks/container-partkeepr.yml rename to ansible/roles/podman/tasks/containers/home/partkeepr.yml diff --git a/ansible/roles/podman/tasks/container-photos.yml b/ansible/roles/podman/tasks/containers/home/photos.yml similarity index 100% rename from ansible/roles/podman/tasks/container-photos.yml rename to ansible/roles/podman/tasks/containers/home/photos.yml diff --git a/ansible/roles/podman/tasks/container-cloud-skudak.yml b/ansible/roles/podman/tasks/containers/skudak/cloud.yml similarity index 100% rename from ansible/roles/podman/tasks/container-cloud-skudak.yml rename to ansible/roles/podman/tasks/containers/skudak/cloud.yml diff --git a/ansible/roles/podman/tasks/container-bookstack.yml b/ansible/roles/podman/tasks/containers/skudak/wiki.yml similarity index 100% rename from ansible/roles/podman/tasks/container-bookstack.yml rename to ansible/roles/podman/tasks/containers/skudak/wiki.yml diff --git a/ansible/roles/podman/tasks/firewall.yml b/ansible/roles/podman/tasks/firewall.yml index e52ee82..a7cfece 100644 --- a/ansible/roles/podman/tasks/firewall.yml +++ b/ansible/roles/podman/tasks/firewall.yml @@ -27,6 +27,9 @@ # Factorio - 27015/tcp - 34197/udp + # Palworld + - 8211/udp + - 25575/udp notify: restart firewalld tags: firewall @@ -48,5 +51,8 @@ - 9091/tcp - 9091/udp - 9092/udp + # cam2ip + - 56000/tcp + - 56000/udp notify: restart firewalld tags: firewall diff --git a/ansible/roles/podman/tasks/main.yml b/ansible/roles/podman/tasks/main.yml index 0ce13f1..fccad81 100644 --- a/ansible/roles/podman/tasks/main.yml +++ b/ansible/roles/podman/tasks/main.yml @@ -1,82 +1,83 @@ --- -- import_tasks: podman.yml - import_tasks: firewall.yml +- import_tasks: podman/podman.yml -- import_tasks: container-awsddns.yml +- import_tasks: containers/base/conf-nginx.yml +- import_tasks: containers/base/nginx.yml + vars: + image: docker.io/owasp/modsecurity:nginx + tags: nginx + + +- import_tasks: containers/base/awsddns.yml vars: image: docker.io/bdebyl/awsddns:1.0.34 tags: ddns -- import_tasks: container-drone.yml +- import_tasks: containers/home/drone.yml vars: runner_image: docker.io/drone/drone-runner-docker:1.8.3 image: docker.io/drone/drone:2.18.0 tags: drone -- import_tasks: container-hass.yml +- import_tasks: containers/home/hass.yml vars: image: ghcr.io/home-assistant/home-assistant:2023.11 tags: hass -- import_tasks: container-partkeepr.yml +- import_tasks: containers/home/partkeepr.yml vars: db_image: docker.io/library/mariadb:10.0 image: docker.io/bdebyl/partkeepr:0.1.10 tags: partkeepr -- import_tasks: container-graylog.yml +- import_tasks: containers/home/graylog.yml vars: db_image: docker.io/library/mongo:4.2 es_image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2 image: docker.io/graylog/graylog:4.3.11 tags: graylog -- import_tasks: container-bookstack.yml +- import_tasks: containers/skudak/wiki.yml vars: db_image: docker.io/library/mysql:5.7.21 - image: docker.io/solidnerd/bookstack:23.10 - tags: skuwiki + image: docker.io/solidnerd/bookstack:23.12 + tags: skudak, skudak-wiki -- import_tasks: container-photos.yml +- import_tasks: containers/home/photos.yml vars: db_image: docker.io/library/mariadb:10.8 image: docker.io/photoprism/photoprism:231021-ce tags: photos -- import_tasks: container-cloud.yml +- import_tasks: containers/home/cloud.yml vars: db_image: docker.io/library/mariadb:10.6 - image: docker.io/library/nextcloud:27.1.3-apache + image: docker.io/library/nextcloud:28.0.1-apache tags: cloud -- import_tasks: container-cloud-skudak.yml +- import_tasks: containers/skudak/cloud.yml vars: db_image: docker.io/library/mariadb:10.6 - image: docker.io/library/nextcloud:27.1.3-apache - tags: skucloud + image: docker.io/library/nextcloud:28.0.1-apache + tags: skudak, skudak-cloud -- import_tasks: container-fulfillr.yml +- import_tasks: containers/debyltech/fulfillr.yml vars: - image: "{{ aws_ecr_endpoint }}/fulfillr:20231113.1809" - tags: fulfillr + image: "{{ aws_ecr_endpoint }}/fulfillr:20240101.1715" + tags: debyltech, fulfillr -- import_tasks: configuration-nginx.yml -- import_tasks: container-nginx.yml - vars: - image: docker.io/owasp/modsecurity:nginx - tags: nginx - -- import_tasks: container-nosql.yml +- import_tasks: containers/home/nosql.yml vars: image: docker.io/redis:7.2.1-alpine tags: nosql -- import_tasks: container-sshpass-cron.yml - vars: - image: docker.io/bdebyl/sshpass-cron:1.0.11 - tags: sshpass_cron - -- import_tasks: container-factorio.yml +- import_tasks: containers/games/factorio.yml vars: image: docker.io/factoriotools/factorio:1.1.80 tags: factorio + +- import_tasks: containers/games/palworld.yml + vars: + image: docker.io/jammsen/palworld-dedicated-server:d2822bf + tags: palworld diff --git a/ansible/roles/podman/tasks/podman.yml b/ansible/roles/podman/tasks/podman/podman.yml similarity index 100% rename from ansible/roles/podman/tasks/podman.yml rename to ansible/roles/podman/tasks/podman/podman.yml diff --git a/ansible/vars/vault.yml b/ansible/vars/vault.yml index 550e241820a697032ca8d220262db186633fd35e..7d7355c25bfd238a345f46cec50eb92fa3d75660 100644 GIT binary patch literal 13077 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 QC->D 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