From 58a3f1ea5a2f18bb33593169382d7b246279968a Mon Sep 17 00:00:00 2001 From: Ahmed AbdelHalim Date: Sun, 19 Jul 2026 00:23:36 +0200 Subject: Rename backup -> mount as a role --- configure.yml | 2 +- host_vars/rpi5.local.yml | Bin 3940 -> 3939 bytes host_vars/rpi5.local.yml.example | 2 +- molecule/raspberrypi/converge.yml | 10 ++--- roles/backup/README.md | 75 ----------------------------------- roles/backup/defaults/main.yml | 4 -- roles/backup/meta/argument_specs.yml | 20 ---------- roles/backup/meta/main.yml | 11 ----- roles/backup/tasks/main.yml | 18 --------- roles/mount/README.md | 75 +++++++++++++++++++++++++++++++++++ roles/mount/defaults/main.yml | 4 ++ roles/mount/meta/argument_specs.yml | 20 ++++++++++ roles/mount/meta/main.yml | 11 +++++ roles/mount/tasks/main.yml | 18 +++++++++ 14 files changed, 135 insertions(+), 135 deletions(-) delete mode 100644 roles/backup/README.md delete mode 100644 roles/backup/defaults/main.yml delete mode 100644 roles/backup/meta/argument_specs.yml delete mode 100644 roles/backup/meta/main.yml delete mode 100644 roles/backup/tasks/main.yml create mode 100644 roles/mount/README.md create mode 100644 roles/mount/defaults/main.yml create mode 100644 roles/mount/meta/argument_specs.yml create mode 100644 roles/mount/meta/main.yml create mode 100644 roles/mount/tasks/main.yml diff --git a/configure.yml b/configure.yml index 540a51f4..9add9d57 100644 --- a/configure.yml +++ b/configure.yml @@ -97,7 +97,7 @@ - role: "prometheus-node-exporter" - role: "grafana" - role: "neomutt" - - role: "backup" + - role: "mount" - role: "garage" - role: "wakeonlan" diff --git a/host_vars/rpi5.local.yml b/host_vars/rpi5.local.yml index 427d7bcd..7f68115b 100644 Binary files a/host_vars/rpi5.local.yml and b/host_vars/rpi5.local.yml differ diff --git a/host_vars/rpi5.local.yml.example b/host_vars/rpi5.local.yml.example index 0d131cfb..426b4154 100644 --- a/host_vars/rpi5.local.yml.example +++ b/host_vars/rpi5.local.yml.example @@ -88,7 +88,7 @@ grafana_dashboards: - key: "${DS_prometheus}" value: "prometheus" -backup_device: "PARTLABEL=backup" +mount_device: "PARTLABEL=backup" garage_rpc_secret: "changeme" garage_access_key_id: "GK_changeme" garage_secret_access_key: "changeme" diff --git a/molecule/raspberrypi/converge.yml b/molecule/raspberrypi/converge.yml index f2397c17..ebbb1cbe 100644 --- a/molecule/raspberrypi/converge.yml +++ b/molecule/raspberrypi/converge.yml @@ -60,10 +60,10 @@ password_store_repo_url: "https://github.com/octocat/Spoon-Knife" firefox_install_browserpass: true firefox_install_passff: true - backup_mount_point: "/mnt/backup" - backup_device: "tmpfs" - backup_fstype: "tmpfs" - backup_mount_options: "defaults,mode=0755" + mount_point: "/mnt/backup" + mount_device: "tmpfs" + mount_fstype: "tmpfs" + mount_options: "defaults,mode=0755" pre_tasks: - name: "Override is_chroot fact for container environment" ansible.builtin.set_fact: @@ -93,7 +93,7 @@ - role: "prometheus" - role: "prometheus-node-exporter" - role: "grafana" - - role: "backup" + - role: "mount" - role: "garage" - role: "gnome" - role: "gnome-calendar" diff --git a/roles/backup/README.md b/roles/backup/README.md deleted file mode 100644 index 62cada76..00000000 --- a/roles/backup/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Backup Role - -Mounts a dedicated backup drive on the target host. - -## Overview - -Prepares a dedicated storage device as the local backup destination S3-compatible object store (ex. Garage). - -## Configuration - -### Required Variables - -```yaml -backup_device: "PARTLABEL=backup" # no default — must set in host_vars -``` - -### Optional Variables - -```yaml -backup_mount_point: "/backup" -backup_fstype: "ext4" -backup_mount_options: "defaults,noatime" -``` - -## Preparing the Drive - -### 1. Install parted - -```bash -sudo apt install parted -``` - -### 2. Partition with a named label - -```bash -# check device name -lsblk - -# create GPT partition table + single labeled partition -sudo parted /dev/sdX --script mklabel gpt mkpart backup ext4 0% 100% -sudo parted /dev/nvme0nX --script mklabel gpt mkpart backup ext4 0% 100% - -# verify label -sudo parted /dev/sdX print -sudo parted /dev/nvme0nX print -``` - -### 3. Format as ext4 - -```bash -sudo mkfs.ext4 /dev/sdX1 -sudo mkfs.ext4 /dev/nvme0nXp1 - -# verify -sudo blkid /dev/sdX1 -sudo blkid /dev/nvme0nXp1 - -ls /dev/disk/by-partlabel/ -``` - -### 4. Set host variable - -In `host_vars/rpi5.local.yml`: - -```yaml -backup_device: "PARTLABEL=backup" -``` - -`PARTLABEL` is stable across reboots regardless of device enumeration order (`/dev/sda` vs `/dev/sdb`). -`ansible.posix.mount` handles `PARTLABEL=` values natively. - -## Notes - -- `noatime` mount option reduces unnecessary write cycles on the drive -- Role adds a persistent fstab entry — drive auto-mounts on reboot diff --git a/roles/backup/defaults/main.yml b/roles/backup/defaults/main.yml deleted file mode 100644 index 6fc18f9a..00000000 --- a/roles/backup/defaults/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -backup_mount_point: "/backup" -backup_fstype: "ext4" -backup_mount_options: "defaults,noatime" diff --git a/roles/backup/meta/argument_specs.yml b/roles/backup/meta/argument_specs.yml deleted file mode 100644 index 459187ee..00000000 --- a/roles/backup/meta/argument_specs.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -argument_specs: - main: - options: - backup_device: - type: "str" - description: "Device to mount (e.g. PARTLABEL=backup)" - required: true - backup_mount_point: - type: "str" - description: "Mount point for the backup drive" - default: "/mnt/backup" - backup_fstype: - type: "str" - description: "Filesystem type of the backup device" - default: "ext4" - backup_mount_options: - type: "str" - description: "Mount options for the backup device" - default: "defaults,noatime" diff --git a/roles/backup/meta/main.yml b/roles/backup/meta/main.yml deleted file mode 100644 index 616d6a42..00000000 --- a/roles/backup/meta/main.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -dependencies: [] -galaxy_info: - author: "a14m" - description: "Mount a dedicated backup drive" - license: "MIT" - min_ansible_version: "2.18" - platforms: - - name: "Debian" - versions: - - "bookworm" diff --git a/roles/backup/tasks/main.yml b/roles/backup/tasks/main.yml deleted file mode 100644 index 2180d659..00000000 --- a/roles/backup/tasks/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: "Create backup mount point" - become: true - ansible.builtin.file: - path: "{{ backup_mount_point }}" - state: "directory" - owner: "root" - group: "root" - mode: "0755" - -- name: "Mount backup drive" - become: true - ansible.posix.mount: - path: "{{ backup_mount_point }}" - src: "{{ backup_device }}" - fstype: "{{ backup_fstype }}" - opts: "{{ backup_mount_options }}" - state: "mounted" diff --git a/roles/mount/README.md b/roles/mount/README.md new file mode 100644 index 00000000..c82c777a --- /dev/null +++ b/roles/mount/README.md @@ -0,0 +1,75 @@ +# Mount Role + +Mounts a drive on the target host. + +## Overview + +Prepares a storage device as a mount point (e.g. local backup destination for S3-compatible object store like Garage). + +## Configuration + +### Required Variables + +```yaml +mount_device: "PARTLABEL=backup" # no default — must set in host_vars +``` + +### Optional Variables + +```yaml +mount_point: "/backup" +mount_fstype: "ext4" +mount_options: "defaults,noatime" +``` + +## Preparing the Drive + +### 1. Install parted + +```bash +sudo apt install parted +``` + +### 2. Partition with a named label + +```bash +# check device name +lsblk + +# create GPT partition table + single labeled partition +sudo parted /dev/sdX --script mklabel gpt mkpart backup ext4 0% 100% +sudo parted /dev/nvme0nX --script mklabel gpt mkpart backup ext4 0% 100% + +# verify label +sudo parted /dev/sdX print +sudo parted /dev/nvme0nX print +``` + +### 3. Format as ext4 + +```bash +sudo mkfs.ext4 /dev/sdX1 +sudo mkfs.ext4 /dev/nvme0nXp1 + +# verify +sudo blkid /dev/sdX1 +sudo blkid /dev/nvme0nXp1 + +ls /dev/disk/by-partlabel/ +``` + +### 4. Set host variable + +In `host_vars/rpi5.local.yml`: + +```yaml +mount_device: "PARTLABEL=backup" +``` + +`PARTLABEL` is stable across reboots regardless of device enumeration order (`/dev/sda` vs `/dev/sdb`). +`ansible.posix.mount` handles `PARTLABEL=` values natively. + +## Notes + +- `noatime` mount option reduces unnecessary write cycles on the drive +- Role adds a persistent fstab entry — drive auto-mounts on reboot diff --git a/roles/mount/defaults/main.yml b/roles/mount/defaults/main.yml new file mode 100644 index 00000000..325e0e51 --- /dev/null +++ b/roles/mount/defaults/main.yml @@ -0,0 +1,4 @@ +--- +mount_point: "/backup" +mount_fstype: "ext4" +mount_options: "defaults,noatime" diff --git a/roles/mount/meta/argument_specs.yml b/roles/mount/meta/argument_specs.yml new file mode 100644 index 00000000..e74c1610 --- /dev/null +++ b/roles/mount/meta/argument_specs.yml @@ -0,0 +1,20 @@ +--- +argument_specs: + main: + options: + mount_device: + type: "str" + description: "Device to mount (e.g. PARTLABEL=backup)" + required: true + mount_point: + type: "str" + description: "Mount point for the drive" + default: "/mnt/backup" + mount_fstype: + type: "str" + description: "Filesystem type of the device" + default: "ext4" + mount_options: + type: "str" + description: "Mount options for the device" + default: "defaults,noatime" diff --git a/roles/mount/meta/main.yml b/roles/mount/meta/main.yml new file mode 100644 index 00000000..ccb8c2a9 --- /dev/null +++ b/roles/mount/meta/main.yml @@ -0,0 +1,11 @@ +--- +dependencies: [] +galaxy_info: + author: "a14m" + description: "Mount a drive" + license: "MIT" + min_ansible_version: "2.18" + platforms: + - name: "Debian" + versions: + - "bookworm" diff --git a/roles/mount/tasks/main.yml b/roles/mount/tasks/main.yml new file mode 100644 index 00000000..65e40416 --- /dev/null +++ b/roles/mount/tasks/main.yml @@ -0,0 +1,18 @@ +--- +- name: "Create mount point" + become: true + ansible.builtin.file: + path: "{{ mount_point }}" + state: "directory" + owner: "root" + group: "root" + mode: "0755" + +- name: "Mount drive" + become: true + ansible.posix.mount: + path: "{{ mount_point }}" + src: "{{ mount_device }}" + fstype: "{{ mount_fstype }}" + opts: "{{ mount_options }}" + state: "mounted" -- cgit v1.2.3