From 40376b635f52cdb29588fcf4cd57d0f7a31997d8 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Wed, 21 Jan 2026 08:22:53 -0800 Subject: [PATCH] Add LaunchDaemon/LaunchAgent for persistent NFS and minikube mounts - LaunchDaemon: mounts sifaka:/volume1/torrents to /Volumes/torrents-nfs at boot - LaunchAgent: runs minikube mount to pass through to /mnt/torrents in VM - Handlers to load both services when plist files change Co-Authored-By: Claude Opus 4.5 --- .../files/com.blumeops.minikube-mount.plist | 41 +++++++++++++++++++ .../files/com.blumeops.nfs-torrents.plist | 24 +++++++++++ ansible/roles/minikube/handlers/main.yml | 13 ++++++ ansible/roles/minikube/tasks/main.yml | 28 +++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 ansible/roles/minikube/files/com.blumeops.minikube-mount.plist create mode 100644 ansible/roles/minikube/files/com.blumeops.nfs-torrents.plist diff --git a/ansible/roles/minikube/files/com.blumeops.minikube-mount.plist b/ansible/roles/minikube/files/com.blumeops.minikube-mount.plist new file mode 100644 index 0000000..2313c52 --- /dev/null +++ b/ansible/roles/minikube/files/com.blumeops.minikube-mount.plist @@ -0,0 +1,41 @@ + + + + + Label + com.blumeops.minikube-mount + ProgramArguments + + /bin/bash + -c + +# Wait for minikube to be running +for i in {1..60}; do + if /opt/homebrew/bin/minikube status | grep -q "Running"; then + break + fi + sleep 5 +done + +# Wait for NFS mount to be available +for i in {1..30}; do + if mount | grep -q "/Volumes/torrents-nfs"; then + break + fi + sleep 2 +done + +# Start the mount (this blocks until killed) +exec /opt/homebrew/bin/minikube mount /Volumes/torrents-nfs:/mnt/torrents + + + RunAtLoad + + KeepAlive + + StandardErrorPath + /tmp/minikube-mount.err + StandardOutPath + /tmp/minikube-mount.log + + diff --git a/ansible/roles/minikube/files/com.blumeops.nfs-torrents.plist b/ansible/roles/minikube/files/com.blumeops.nfs-torrents.plist new file mode 100644 index 0000000..1cec7a6 --- /dev/null +++ b/ansible/roles/minikube/files/com.blumeops.nfs-torrents.plist @@ -0,0 +1,24 @@ + + + + + Label + com.blumeops.nfs-torrents + ProgramArguments + + /sbin/mount + -t + nfs + -o + resvport,rw + sifaka:/volume1/torrents + /Volumes/torrents-nfs + + RunAtLoad + + StandardErrorPath + /tmp/nfs-torrents.err + StandardOutPath + /tmp/nfs-torrents.log + + diff --git a/ansible/roles/minikube/handlers/main.yml b/ansible/roles/minikube/handlers/main.yml index 44ad747..8af6513 100644 --- a/ansible/roles/minikube/handlers/main.yml +++ b/ansible/roles/minikube/handlers/main.yml @@ -12,3 +12,16 @@ ansible.builtin.command: cmd: minikube ssh --native-ssh=false "sudo systemctl restart containerd" changed_when: true + +- name: Load NFS mount LaunchDaemon + ansible.builtin.command: + cmd: launchctl load /Library/LaunchDaemons/com.blumeops.nfs-torrents.plist + become: true + failed_when: false + changed_when: true + +- name: Load minikube mount LaunchAgent + ansible.builtin.command: + cmd: launchctl load {{ ansible_env.HOME }}/Library/LaunchAgents/com.blumeops.minikube-mount.plist + failed_when: false + changed_when: true diff --git a/ansible/roles/minikube/tasks/main.yml b/ansible/roles/minikube/tasks/main.yml index d704ba0..fec9a50 100644 --- a/ansible/roles/minikube/tasks/main.yml +++ b/ansible/roles/minikube/tasks/main.yml @@ -106,3 +106,31 @@ changed_when: minikube_registry_config.rc == 0 when: minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout notify: Restart containerd in minikube + +# Set up persistent NFS mount from sifaka and minikube mount passthrough +# NFS mount uses LaunchDaemon (runs as root at boot) +# Minikube mount uses LaunchAgent (runs in user GUI session at login) + +- name: Create NFS mount point + ansible.builtin.file: + path: /Volumes/torrents-nfs + state: directory + mode: "0755" + become: true + +- name: Install NFS mount LaunchDaemon + ansible.builtin.copy: + src: com.blumeops.nfs-torrents.plist + dest: /Library/LaunchDaemons/com.blumeops.nfs-torrents.plist + owner: root + group: wheel + mode: "0644" + become: true + notify: Load NFS mount LaunchDaemon + +- name: Install minikube mount LaunchAgent + ansible.builtin.copy: + src: com.blumeops.minikube-mount.plist + dest: "{{ ansible_env.HOME }}/Library/LaunchAgents/com.blumeops.minikube-mount.plist" + mode: "0644" + notify: Load minikube mount LaunchAgent