From d76d675b29271cbe6adac910c90febe72680a228 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Mon, 9 Feb 2026 23:03:01 -0800 Subject: [PATCH] Fix minikube role skipping start when kubelet/apiserver are stopped (#137) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - After a power loss, minikube's Docker container (host) restarts but kubelet/apiserver remain stopped - The ansible role's status check used `--format='{{.Host}}'` which only examined the host VM state - When host=Running but kubelet/apiserver=Stopped, the role skipped `minikube start` - Fixed to use full `minikube status` exit code (returns non-zero when any component is unhealthy) - Simplified all downstream conditions to use exit code instead of string matching ## Test plan - [x] Verified the fix correctly skips `minikube start` when cluster is already fully running - [x] Pre-commit hooks pass (ansible-lint, yamllint, etc.) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: https://forge.ops.eblu.me/eblume/blumeops/pulls/137 --- ansible/roles/minikube/tasks/main.yml | 32 +++++++++---------- .../fix-minikube-status-check.bugfix.md | 1 + 2 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 docs/changelog.d/fix-minikube-status-check.bugfix.md diff --git a/ansible/roles/minikube/tasks/main.yml b/ansible/roles/minikube/tasks/main.yml index 938ad23..c09d420 100644 --- a/ansible/roles/minikube/tasks/main.yml +++ b/ansible/roles/minikube/tasks/main.yml @@ -37,9 +37,9 @@ msg: "WARNING: Docker does not appear to be running. Please start Docker Desktop manually." when: minikube_docker_status.rc != 0 -- name: Check if minikube cluster exists +- name: Check minikube cluster status ansible.builtin.command: - cmd: minikube status --format={% raw %}'{{.Host}}'{% endraw %} + cmd: minikube status register: minikube_status changed_when: false failed_when: false @@ -63,11 +63,11 @@ failed_when: false # Don't fail - may need manual intervention when: - minikube_docker_status.rc == 0 - - minikube_status.rc != 0 or 'Running' not in minikube_status.stdout + - minikube_status.rc != 0 - name: Check minikube status after start attempt ansible.builtin.command: - cmd: minikube status --format={% raw %}'{{.Host}}'{% endraw %} + cmd: minikube status register: minikube_final_status changed_when: false failed_when: false @@ -75,7 +75,7 @@ - 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 + when: minikube_final_status.rc != 0 # Configure containerd to use zot registry as pull-through cache # With docker driver, use host.minikube.internal to reach the host @@ -90,7 +90,7 @@ - ghcr.io - quay.io changed_when: false - when: minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + when: minikube_final_status.rc == 0 # Private registry (registry.ops.eblu.me) - direct to zot - name: Check registry.ops.eblu.me config @@ -98,7 +98,7 @@ cmd: minikube ssh --native-ssh=false "cat /etc/containerd/certs.d/registry.ops.eblu.me/hosts.toml 2>/dev/null || echo ''" register: minikube_registry_config changed_when: false - when: minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + when: minikube_final_status.rc == 0 - name: Configure registry.ops.eblu.me mirror ansible.builtin.command: @@ -110,7 +110,7 @@ skip_verify = true" | sudo tee /etc/containerd/certs.d/registry.ops.eblu.me/hosts.toml' changed_when: true when: - - minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + - minikube_final_status.rc == 0 - "'host.minikube.internal:5050' not in minikube_registry_config.stdout" notify: Restart containerd in minikube @@ -120,7 +120,7 @@ cmd: minikube ssh --native-ssh=false "cat /etc/containerd/certs.d/docker.io/hosts.toml 2>/dev/null || echo ''" register: minikube_dockerio_config changed_when: false - when: minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + when: minikube_final_status.rc == 0 - name: Configure docker.io mirror through zot ansible.builtin.command: @@ -132,7 +132,7 @@ skip_verify = true" | sudo tee /etc/containerd/certs.d/docker.io/hosts.toml' changed_when: true when: - - minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + - minikube_final_status.rc == 0 - "'host.minikube.internal:5050' not in minikube_dockerio_config.stdout" notify: Restart containerd in minikube @@ -142,7 +142,7 @@ cmd: minikube ssh --native-ssh=false "cat /etc/containerd/certs.d/ghcr.io/hosts.toml 2>/dev/null || echo ''" register: minikube_ghcr_config changed_when: false - when: minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + when: minikube_final_status.rc == 0 - name: Configure ghcr.io mirror through zot ansible.builtin.command: @@ -154,7 +154,7 @@ skip_verify = true" | sudo tee /etc/containerd/certs.d/ghcr.io/hosts.toml' changed_when: true when: - - minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + - minikube_final_status.rc == 0 - "'host.minikube.internal:5050' not in minikube_ghcr_config.stdout" notify: Restart containerd in minikube @@ -164,7 +164,7 @@ cmd: minikube ssh --native-ssh=false "cat /etc/containerd/certs.d/quay.io/hosts.toml 2>/dev/null || echo ''" register: minikube_quay_config changed_when: false - when: minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + when: minikube_final_status.rc == 0 - name: Configure quay.io mirror through zot ansible.builtin.command: @@ -176,7 +176,7 @@ skip_verify = true" | sudo tee /etc/containerd/certs.d/quay.io/hosts.toml' changed_when: true when: - - minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + - minikube_final_status.rc == 0 - "'host.minikube.internal:5050' not in minikube_quay_config.stdout" notify: Restart containerd in minikube @@ -188,13 +188,13 @@ cmd: kubectl config view --minify -o jsonpath="{.clusters[0].cluster.server}" register: minikube_api_url changed_when: false - when: minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + when: minikube_final_status.rc == 0 - name: Extract API server port from URL ansible.builtin.set_fact: minikube_api_port: "{{ minikube_api_url.stdout | regex_search(':([0-9]+)$', '\\1') | first }}" when: - - minikube_final_status.rc == 0 and 'Running' in minikube_final_status.stdout + - minikube_final_status.rc == 0 - minikube_api_url.stdout is defined - name: Check current tailscale serve config for k8s diff --git a/docs/changelog.d/fix-minikube-status-check.bugfix.md b/docs/changelog.d/fix-minikube-status-check.bugfix.md new file mode 100644 index 0000000..bff2ea2 --- /dev/null +++ b/docs/changelog.d/fix-minikube-status-check.bugfix.md @@ -0,0 +1 @@ +Fix minikube ansible role not restarting cluster after power loss — status check only examined host VM state, missing stopped kubelet/apiserver.