2026-01-18 12:06:28 -08:00
---
# Minikube installation and cluster setup for indri
2026-01-20 21:06:53 -08:00
# Uses qemu2 driver for full VM with kernel mount capabilities (NFS, SMB, etc.)
2026-01-20 21:41:47 -08:00
# Requires socket_vmnet for proper networking (minikube service/tunnel commands)
2026-01-18 12:06:28 -08:00
#
2026-01-20 21:06:53 -08:00
# NOTE: minikube start may have issues when run via SSH.
2026-01-18 12:06:28 -08:00
# If cluster fails to start, manually run on indri:
2026-01-20 21:41:47 -08:00
# minikube start --driver=qemu2 --network=socket_vmnet --container-runtime=containerd \
2026-01-20 21:20:04 -08:00
# --cpus=6 --memory=12288 --disk-size=200g \
2026-01-18 12:49:20 -08:00
# --apiserver-names=k8s.tail8d86e.ts.net --apiserver-names=indri \
# --apiserver-port=6443 --listen-address=0.0.0.0
2026-01-18 12:06:28 -08:00
2026-01-20 21:06:53 -08:00
- name : Install qemu via homebrew (required for qemu2 driver)
community.general.homebrew :
name : qemu
state : present
2026-01-20 21:41:47 -08:00
- name : Install socket_vmnet via homebrew (required for qemu2 networking)
community.general.homebrew :
name : socket_vmnet
state : present
2026-01-21 11:24:44 -08:00
- name : Check if socket_vmnet process is running
ansible.builtin.command :
cmd : pgrep socket_vmnet
register : minikube_socket_vmnet_status
changed_when : false
failed_when : false
2026-01-20 21:41:47 -08:00
- name : Start socket_vmnet service
ansible.builtin.command :
cmd : brew services start socket_vmnet
become : true
register : minikube_socket_vmnet_start
changed_when : "'Successfully started' in minikube_socket_vmnet_start.stdout"
failed_when : false
2026-01-21 11:24:44 -08:00
when : minikube_socket_vmnet_status.rc != 0
2026-01-20 21:41:47 -08:00
2026-01-18 12:06:28 -08:00
- name : Install minikube via homebrew
community.general.homebrew :
name : minikube
state : present
- name : Install kubectl via homebrew
community.general.homebrew :
name : kubectl
state : present
- name : Check if minikube cluster exists
ansible.builtin.command :
cmd : minikube status --format={% raw %}'{{.Host}}'{% endraw %}
register : minikube_status
changed_when : false
failed_when : false
- name : Start minikube cluster
ansible.builtin.command :
cmd : >
minikube start
--driver={{ minikube_driver }}
2026-01-20 21:41:47 -08:00
--network={{ minikube_network }}
2026-01-18 12:06:28 -08:00
--container-runtime={{ minikube_container_runtime }}
--cpus={{ minikube_cpus }}
--memory={{ minikube_memory }}
--disk-size={{ minikube_disk_size }}
{% for name in minikube_apiserver_names %}
--apiserver-names={{ name }}
{% endfor %}
2026-01-18 12:49:20 -08:00
--apiserver-port={{ minikube_apiserver_port }}
2026-01-18 12:06:28 -08:00
--listen-address={{ minikube_listen_address }}
register : minikube_start
changed_when : minikube_start.rc == 0
failed_when : false # Don't fail - may need manual intervention like podman
when : minikube_status.rc != 0 or 'Running' not in minikube_status.stdout
- name : Check minikube status after start attempt
ansible.builtin.command :
cmd : minikube status --format={% raw %}'{{.Host}}'{% endraw %}
register : minikube_final_status
changed_when : false
failed_when : false
- name : Warn if minikube failed to start
ansible.builtin.debug :
msg : "WARNING: minikube may not have started properly. Run 'minikube start' manually on indri if needed. Status: {{ minikube_final_status.stdout | default('unknown') }}"
when : minikube_final_status.rc != 0 or 'Running' not in minikube_final_status.stdout
2026-01-19 09:49:52 -08:00
2026-01-21 08:03:21 -08:00
# Configure VM to access zot registry on host
# The VM can't resolve Tailscale hostnames, so we add a hosts entry
# and configure containerd to use the local zot instance
- name : Add registry hostname to VM hosts file
2026-01-19 09:49:52 -08:00
ansible.builtin.command :
2026-01-21 08:03:21 -08:00
cmd : minikube ssh --native-ssh=false "grep -q 'registry.tail8d86e.ts.net' /etc/hosts || echo '192.168.105.1 registry.tail8d86e.ts.net' | sudo tee -a /etc/hosts"
register : minikube_hosts_entry
changed_when : "'registry.tail8d86e.ts.net' in minikube_hosts_entry.stdout"
2026-01-19 09:49:52 -08:00
when : minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout
2026-01-21 08:03:21 -08:00
- name : Create containerd registry mirror directory
2026-01-20 21:06:53 -08:00
ansible.builtin.command :
2026-01-21 08:03:21 -08:00
cmd : minikube ssh --native-ssh=false "sudo mkdir -p /etc/containerd/certs.d/registry.tail8d86e.ts.net"
register : minikube_registry_dir
2026-01-20 21:06:53 -08:00
changed_when : false
2026-01-21 08:03:21 -08:00
when : minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout
2026-01-21 11:24:44 -08:00
- name : Check containerd registry mirror config
ansible.builtin.command :
cmd : minikube ssh --native-ssh=false "cat /etc/containerd/certs.d/registry.tail8d86e.ts.net/hosts.toml 2>/dev/null || echo ''"
register : minikube_registry_config_current
changed_when : false
when : minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout
2026-01-21 08:03:21 -08:00
- name : Configure containerd registry mirror for zot
ansible.builtin.command :
cmd : |
minikube ssh --native-ssh=false 'echo "server = \"http://host.minikube.internal:5050\"
[ host.\"http://host.minikube.internal:5050\"]
capabilities = [\"pull\", \"resolve\"]
skip_verify = true" | sudo tee /etc/containerd/certs.d/registry.tail8d86e.ts.net/hosts.toml'
register : minikube_registry_config
2026-01-21 11:24:44 -08:00
changed_when : true
when :
- minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout
- "'host.minikube.internal:5050' not in minikube_registry_config_current.stdout"
2026-01-21 08:03:21 -08:00
notify : Restart containerd in minikube
2026-01-21 08:22:53 -08:00
# 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)
2026-01-21 11:24:44 -08:00
#
# NOTE: Tasks with become:true require passwordless sudo on indri
# (configured via /etc/sudoers.d/erichblume)
- name : Check if NFS mount point exists
ansible.builtin.stat :
path : /Volumes/torrents-nfs
register : minikube_nfs_mount_point
2026-01-21 08:22:53 -08:00
- name : Create NFS mount point
ansible.builtin.file :
path : /Volumes/torrents-nfs
state : directory
mode : "0755"
become : true
2026-01-21 11:24:44 -08:00
when : not minikube_nfs_mount_point.stat.exists
- name : Check if NFS LaunchDaemon is installed
ansible.builtin.stat :
path : /Library/LaunchDaemons/com.blumeops.nfs-torrents.plist
register : minikube_nfs_launchdaemon
2026-01-21 08:22:53 -08:00
- 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
2026-01-21 11:24:44 -08:00
when : not minikube_nfs_launchdaemon.stat.exists
2026-01-21 08:22:53 -08:00
- name : Install minikube mount LaunchAgent
ansible.builtin.copy :
src : com.blumeops.minikube-mount.plist
2026-01-21 11:24:44 -08:00
dest : "{{ ansible_facts['env']['HOME'] }}/Library/LaunchAgents/com.blumeops.minikube-mount.plist"
2026-01-21 08:22:53 -08:00
mode : "0644"
notify : Load minikube mount LaunchAgent