--- - name: Define Atlas ZFS datasets tags: [atlas, storage] ansible.builtin.set_fact: atlas_zfs_datasets: - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_work }}" mountpoint: "{{ atlas_work_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: mountpoint: "{{ atlas_work_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_archive }}" mountpoint: "{{ atlas_archive_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: compression: zstd mountpoint: "{{ atlas_archive_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_app_data }}" mountpoint: "{{ atlas_app_data_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: compression: zstd mountpoint: "{{ atlas_app_data_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_navidrome }}" mountpoint: "{{ atlas_navidrome_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: compression: zstd mountpoint: "{{ atlas_navidrome_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_syncthing }}" mountpoint: "{{ atlas_syncthing_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: compression: lz4 mountpoint: "{{ atlas_syncthing_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_media }}" mountpoint: "{{ atlas_media_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: compression: lz4 mountpoint: "{{ atlas_media_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_music }}" mountpoint: "{{ atlas_music_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: compression: lz4 mountpoint: "{{ atlas_music_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_backup_prometheus }}" mountpoint: "{{ atlas_backup_prometheus_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: mountpoint: "{{ atlas_backup_prometheus_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_photobook }}" mountpoint: "{{ atlas_photobook_mountpoint }}" owner: "{{ atlas_immich_username }}" group: "{{ atlas_immich_group }}" properties: compression: lz4 mountpoint: "{{ atlas_photobook_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_backups }}" mountpoint: "{{ atlas_backups_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: compression: lz4 mountpoint: "{{ atlas_backups_mountpoint }}" - name: "{{ atlas_zfs_pool }}/{{ atlas_zfs_dataset_service_backups }}" mountpoint: "{{ atlas_service_backups_mountpoint }}" owner: "{{ atlas_admin_username }}" group: "{{ atlas_admin_group }}" properties: compression: lz4 mountpoint: "{{ atlas_service_backups_mountpoint }}" refreservation: "{{ atlas_zfs_service_backups_refreservation }}" - name: Require completed Atlas storage placeholders tags: [atlas, storage] ansible.builtin.assert: that: - atlas_zfs_pool != 'CHANGEME_ZFS_POOL' - atlas_mount_root != '/CHANGEME_ATLAS_MOUNT_ROOT' - atlas_mount_root.startswith('/') - (atlas_zfs_datasets | map(attribute='name') | unique | list | length) == (atlas_zfs_datasets | length) - (atlas_zfs_datasets | map(attribute='mountpoint') | unique | list | length) == (atlas_zfs_datasets | length) fail_msg: >- Replace the Atlas ZFS pool and mount-root placeholders, then set atlas_manage_storage to true before managing datasets. when: atlas_manage_storage | bool - name: Check whether the configured Atlas ZFS pool exists tags: [atlas, storage] ansible.builtin.command: argv: - zpool - list - -H - -o - name - "{{ atlas_zfs_pool }}" register: atlas_zfs_pool_check changed_when: false failed_when: false when: atlas_manage_storage | bool - name: Require the configured Atlas ZFS pool tags: [atlas, storage] ansible.builtin.assert: that: - atlas_zfs_pool_check.rc == 0 fail_msg: >- The configured Atlas ZFS pool does not exist. The Atlas profile only manages child datasets and never creates pools. when: atlas_manage_storage | bool - name: Manage Atlas ZFS datasets declaratively tags: [atlas, storage] community.general.zfs: name: "{{ item.name }}" state: present extra_zfs_properties: "{{ item.properties }}" loop: "{{ atlas_zfs_datasets }}" loop_control: label: "{{ item.name }}" when: atlas_manage_storage | bool - name: Set Atlas dataset ownership tags: [atlas, storage] ansible.builtin.file: path: "{{ item.mountpoint }}" state: directory owner: "{{ item.owner }}" group: "{{ item.group }}" mode: "0770" loop: "{{ atlas_zfs_datasets }}" loop_control: label: "{{ item.mountpoint }}" when: atlas_manage_storage | bool