--- # S3FS role tasks - Mount S3 buckets using s3fs - name: Install s3fs and dependencies ansible.builtin.apt: name: "{{ s3fs_packages }}" state: present update_cache: true - name: Create s3fs credentials directory ansible.builtin.file: path: /etc/s3fs state: directory mode: '0700' owner: root group: root - name: Create s3fs password file ansible.builtin.template: src: passwd-s3fs.j2 dest: /etc/s3fs/.passwd-s3fs mode: '0600' owner: root group: root no_log: true - name: Create S3 cache directory ansible.builtin.file: path: /var/cache/s3fs state: directory mode: '0755' owner: root group: root - name: Mount S3 buckets when: s3fs_enabled | bool block: - name: Create mount points for S3 buckets ansible.builtin.file: path: "{{ item.mount_point }}" state: directory mode: "{{ item.mode }}" owner: "{{ item.owner }}" group: "{{ item.group }}" loop: "{{ s3_buckets }}" loop_control: label: "{{ item.name }} -> {{ item.mount_point }}" - name: Add S3 buckets to /etc/fstab ansible.builtin.lineinfile: path: /etc/fstab line: "{{ item.name }} {{ item.mount_point }} fuse.s3fs _netdev,{{ s3fs_options | join(',') }} 0 0" regexp: "^{{ item.name }}\\s+{{ item.mount_point }}" state: present loop: "{{ s3_buckets }}" loop_control: label: "{{ item.name }} -> {{ item.mount_point }}" - name: Mount all S3 buckets ansible.builtin.command: cmd: "mount {{ item.mount_point }}" loop: "{{ s3_buckets }}" loop_control: label: "{{ item.name }} -> {{ item.mount_point }}" register: mount_result changed_when: mount_result.rc == 0 failed_when: false - name: Verify S3 buckets are mounted ansible.builtin.command: cmd: "mountpoint -q {{ item.mount_point }}" loop: "{{ s3_buckets }}" loop_control: label: "{{ item.name }} -> {{ item.mount_point }}" register: verify_mount changed_when: false failed_when: verify_mount.rc != 0 - name: Display mounted S3 buckets ansible.builtin.debug: msg: | ✅ S3 Buckets mounted successfully: {% for bucket in s3_buckets %} - {{ bucket.name }} -> {{ bucket.mount_point }} {% endfor %} - name: Test write access to Immich bucket ansible.builtin.copy: content: "S3FS test file created on {{ ansible_date_time.iso8601 }}" dest: "{{ s3_buckets | selectattr('name', 'equalto', 'asxpio-immich-main') | map(attribute='mount_point') | first }}/.s3fs-test" mode: '0644' when: "'asxpio-immich-main' in s3_buckets | map(attribute='name')" register: write_test - name: Remove test file ansible.builtin.file: path: "{{ s3_buckets | selectattr('name', 'equalto', 'asxpio-immich-main') | map(attribute='mount_point') | first }}/.s3fs-test" state: absent when: write_test is changed - name: Unmount S3 buckets ansible.builtin.command: cmd: "umount {{ item.mount_point }}" loop: "{{ s3_buckets }}" loop_control: label: "{{ item.mount_point }}" register: umount_result changed_when: umount_result.rc == 0 failed_when: false when: not (s3fs_enabled | bool) - name: Remove S3 buckets from /etc/fstab ansible.builtin.lineinfile: path: /etc/fstab regexp: "^{{ item.name }}\\s+{{ item.mount_point }}\\s" state: absent loop: "{{ s3_buckets }}" loop_control: label: "{{ item.name }} -> {{ item.mount_point }}" when: not (s3fs_enabled | bool)