2026-09-11 01:34:44 -04:00
|
|
|
# code: language=ansible
|
|
|
|
|
|
|
|
|
|
- name: Install podman packages
|
|
|
|
|
community.general.pacman:
|
|
|
|
|
name:
|
|
|
|
|
- nginx
|
|
|
|
|
- podman
|
|
|
|
|
- passt
|
|
|
|
|
- podlet
|
|
|
|
|
- podman-compose
|
2026-09-11 18:25:20 -04:00
|
|
|
- fuse-overlayfs
|
2026-09-11 01:34:44 -04:00
|
|
|
state: present
|
|
|
|
|
update_cache: true
|
|
|
|
|
|
|
|
|
|
- name: Enable kernel.unprivileged_userns_clone
|
|
|
|
|
ansible.posix.sysctl:
|
|
|
|
|
name: kernel.unprivileged_userns_clone
|
|
|
|
|
reload: true
|
|
|
|
|
state: present
|
|
|
|
|
sysctl_set: true
|
|
|
|
|
value: 1
|
|
|
|
|
|
|
|
|
|
- name: Create an unprivileged user to run quadlet files as
|
|
|
|
|
ansible.builtin.user:
|
|
|
|
|
comment: Quadlet services user
|
2026-09-11 18:25:20 -04:00
|
|
|
create_home: true
|
|
|
|
|
home: /home/quadlet
|
2026-09-11 01:34:44 -04:00
|
|
|
name: quadlet
|
|
|
|
|
password: '!'
|
|
|
|
|
password_lock: true
|
2026-09-11 18:25:20 -04:00
|
|
|
shell: /usr/bin/bash
|
2026-09-11 01:34:44 -04:00
|
|
|
state: present
|
2026-09-11 18:25:20 -04:00
|
|
|
system: false # Can't be a system user or subuid/subgid entries don't get created
|
2026-09-11 01:34:44 -04:00
|
|
|
|
2026-09-11 18:25:20 -04:00
|
|
|
- name: Ensure graphroot location exists for unprivileged user
|
2026-09-11 01:34:44 -04:00
|
|
|
ansible.builtin.file:
|
2026-09-11 18:25:20 -04:00
|
|
|
group: quadlet
|
|
|
|
|
mode: '0750'
|
|
|
|
|
owner: quadlet
|
|
|
|
|
path: "/home/quadlet/.local/share/containers/storage"
|
2026-09-11 01:34:44 -04:00
|
|
|
state: directory
|
|
|
|
|
|
2026-09-11 18:25:20 -04:00
|
|
|
- name: Enable linger for unprivileged user
|
|
|
|
|
ansible.builtin.command:
|
|
|
|
|
cmd: loginctl enable-linger quadlet
|
|
|
|
|
creates: /var/lib/systemd/linger/quadlet
|
|
|
|
|
register: podman_enable_linger_result
|
|
|
|
|
|
|
|
|
|
- name: Reboot if enabling lingering caused a change # noqa: no-handler
|
|
|
|
|
when:
|
|
|
|
|
- podman_enable_linger_result is changed
|
|
|
|
|
ansible.builtin.reboot:
|
|
|
|
|
post_reboot_delay: 10
|
|
|
|
|
test_command: whoami
|
|
|
|
|
|
|
|
|
|
- name: Create directories for quadlet volumes
|
2026-09-11 01:34:44 -04:00
|
|
|
ansible.builtin.file:
|
|
|
|
|
group: quadlet
|
|
|
|
|
mode: '0775'
|
|
|
|
|
owner: quadlet
|
2026-09-11 18:25:20 -04:00
|
|
|
path: /quadlet/{{ item }}
|
|
|
|
|
state: directory
|
|
|
|
|
loop: "{{ podman_containers }}"
|
|
|
|
|
|
|
|
|
|
- name: Create quadlet systemd user directory
|
|
|
|
|
ansible.builtin.file:
|
|
|
|
|
group: root
|
|
|
|
|
mode: '0775'
|
|
|
|
|
owner: root
|
2026-09-11 01:34:44 -04:00
|
|
|
path: /etc/containers/systemd/users/quadlet
|
|
|
|
|
state: directory
|
|
|
|
|
|
|
|
|
|
- name: Create shared container image directory
|
|
|
|
|
ansible.builtin.file:
|
|
|
|
|
group: root
|
|
|
|
|
mode: '0755'
|
|
|
|
|
owner: root
|
|
|
|
|
path: /var/containers/images
|
|
|
|
|
state: directory
|
|
|
|
|
|
|
|
|
|
- name: Pull required container images into shared storage for all users
|
|
|
|
|
containers.podman.podman_image:
|
|
|
|
|
name: "{{ item }}"
|
|
|
|
|
platform: linux/amd64
|
|
|
|
|
pull: true
|
|
|
|
|
pull_extra_args: --imagestore=/var/containers/images
|
|
|
|
|
state: present
|
|
|
|
|
loop:
|
|
|
|
|
- "{{ podman_technitium_registry }}/{{ podman_technitium_repository }}:{{ podman_technitium_version }}"
|
|
|
|
|
- "{{ podman_distribution_registry }}/{{ podman_distribution_repository }}:{{ podman_distribution_version }}"
|
|
|
|
|
- "{{ podman_git_server_registry }}/{{ podman_git_server_repository }}:{{ podman_git_server_version }}"
|
|
|
|
|
|
|
|
|
|
- name: Recurse shared image storage and make contents readable for all users
|
|
|
|
|
ansible.builtin.command:
|
|
|
|
|
cmd: chmod -R u=rwX,g=rX,o=rX /var/containers/images
|
|
|
|
|
changed_when: true
|
|
|
|
|
|
|
|
|
|
- name: Add containers storage.conf file
|
|
|
|
|
ansible.builtin.copy:
|
|
|
|
|
dest: /etc/containers/storage.conf # Can NOT go in the drop in containers.conf.d directory
|
|
|
|
|
group: root
|
|
|
|
|
mode: '0644'
|
|
|
|
|
owner: root
|
|
|
|
|
src: "{{ role_path }}/files/storage.conf"
|
2026-09-11 18:25:20 -04:00
|
|
|
|
|
|
|
|
- name: Template out volume unit files
|
|
|
|
|
ansible.builtin.template:
|
|
|
|
|
dest: /etc/containers/systemd/users/quadlet/{{ item }}.volume
|
|
|
|
|
group: root
|
|
|
|
|
mode: '0644'
|
|
|
|
|
owner: root
|
|
|
|
|
src: "{{ role_path }}/templates/quadlet.volume.j2"
|
|
|
|
|
loop: "{{ podman_containers }}"
|
|
|
|
|
notify:
|
|
|
|
|
- Quadlet daemon-reload
|
|
|
|
|
|
|
|
|
|
- name: Template out network unit file
|
|
|
|
|
ansible.builtin.template:
|
|
|
|
|
dest: /etc/containers/systemd/users/quadlet/dual-stack.network
|
|
|
|
|
group: root
|
|
|
|
|
mode: '0644'
|
|
|
|
|
owner: root
|
|
|
|
|
src: "{{ role_path }}/templates/dual-stack.network.j2"
|
|
|
|
|
notify:
|
|
|
|
|
- Quadlet daemon-reload
|
|
|
|
|
|
|
|
|
|
- name: Template out container unit files
|
|
|
|
|
ansible.builtin.template:
|
|
|
|
|
dest: /etc/containers/systemd/users/quadlet/{{ item }}.container
|
|
|
|
|
group: root
|
|
|
|
|
mode: '0644'
|
|
|
|
|
owner: root
|
|
|
|
|
src: "{{ role_path }}/templates/{{ item }}.container.j2"
|
|
|
|
|
loop:
|
|
|
|
|
- technitium
|
|
|
|
|
notify:
|
|
|
|
|
- Quadlet daemon-reload
|
|
|
|
|
|
|
|
|
|
- name: Flush handlers to trigger daemon-reload
|
|
|
|
|
ansible.builtin.meta: flush_handlers
|
|
|
|
|
|
|
|
|
|
- name: Enable IP forwarding
|
|
|
|
|
ansible.posix.sysctl:
|
|
|
|
|
name: "{{ item }}"
|
|
|
|
|
reload: true
|
|
|
|
|
state: present
|
|
|
|
|
sysctl_set: true
|
|
|
|
|
value: 1
|
|
|
|
|
loop:
|
|
|
|
|
- net.ipv4.ip_forward
|
|
|
|
|
- net.ipv6.conf.all.forwarding
|
|
|
|
|
|
|
|
|
|
# Enable forwarding rules in UFW
|
|
|
|
|
|
|
|
|
|
# Enable/start user service
|
|
|
|
|
|
|
|
|
|
# Add to containers.conf
|
|
|
|
|
# [network]
|
|
|
|
|
# rootless_port_forwarder="pasta"
|