Introduction

Minikube runs a single-node Kubernetes cluster locally — perfect for development, testing, and learning. Automating Minikube installation with Ansible ensures consistent setup across developer machines, CI/CD runners, and lab environments.

Method 1: Ansible Galaxy Role

The quickest approach — use the community gantsign.minikube role:

ansible-galaxy install gantsign.minikube

Playbook

---
- name: Install Minikube
  hosts: all
  roles:
    - role: gantsign.minikube
      minikube_version: '1.32.0'
      minikube_architecture: 'amd64'

Customize for ARM (Apple Silicon)

- name: Install Minikube on Apple Silicon
  hosts: all
  roles:
    - role: gantsign.minikube
      minikube_version: '1.32.0'
      minikube_architecture: 'arm64'
      minikube_download_dir: "{{ ansible_facts.env.HOME }}/Downloads"

Method 2: Manual Installation Playbook

Full control over the installation:

---
- name: Install Minikube and dependencies
  hosts: dev_machines
  become: true
  vars:
    minikube_version: "1.32.0"
    kubectl_version: "1.29.0"

  tasks:
    - name: Install required packages
      ansible.builtin.package:
        name:
          - curl
          - conntrack
          - socat
        state: present

    - name: Detect architecture
      ansible.builtin.set_fact:
        arch: "{{ 'arm64' if ansible_architecture == 'aarch64' else 'amd64' }}"

    - name: Download minikube binary
      ansible.builtin.get_url:
        url: "https://storage.googleapis.com/minikube/releases/v{{ minikube_version }}/minikube-linux-{{ arch }}"
        dest: /usr/local/bin/minikube
        mode: '0755'

    - name: Download kubectl
      ansible.builtin.get_url:
        url: "https://dl.k8s.io/release/v{{ kubectl_version }}/bin/linux/{{ arch }}/kubectl"
        dest: /usr/local/bin/kubectl
        mode: '0755'

    - name: Verify installation
      ansible.builtin.command: minikube version
      register: minikube_ver
      changed_when: false

    - name: Show version
      ansible.builtin.debug:
        msg: "{{ minikube_ver.stdout }}"

Install with Docker Driver

- name: Set up Minikube with Docker
  hosts: dev_machines
  become: true
  tasks:
    - name: Install Docker
      ansible.builtin.package:
        name: docker.io
        state: present

    - name: Add user to docker group
      ansible.builtin.user:
        name: "{{ ansible_user }}"
        groups: docker
        append: true

    - name: Install minikube
      ansible.builtin.get_url:
        url: "https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64"
        dest: /usr/local/bin/minikube
        mode: '0755'

    - name: Set default driver to Docker
      ansible.builtin.command:
        cmd: minikube config set driver docker
      become: false
      changed_when: true

Cluster Management Playbook

---
- name: Manage Minikube cluster
  hosts: localhost
  connection: local
  become: false
  vars:
    cluster_cpus: 4
    cluster_memory: 8192
    cluster_disk: "40g"
    kubernetes_version: "1.29.0"

  tasks:
    - name: Start Minikube cluster
      ansible.builtin.command:
        cmd: >-
          minikube start
          --cpus={{ cluster_cpus }}
          --memory={{ cluster_memory }}
          --disk-size={{ cluster_disk }}
          --kubernetes-version=v{{ kubernetes_version }}
          --driver=docker
          --addons=ingress,metrics-server,dashboard
      register: start_result
      changed_when: "'Starting' in start_result.stdout"

    - name: Verify cluster is running
      ansible.builtin.command: kubectl cluster-info
      register: cluster_info
      changed_when: false

    - name: Show cluster info
      ansible.builtin.debug:
        msg: "{{ cluster_info.stdout_lines }}"

Stop and Delete Cluster

- name: Stop Minikube
  ansible.builtin.command: minikube stop
  changed_when: true

- name: Delete Minikube cluster
  ansible.builtin.command: minikube delete --all --purge
  changed_when: true

Minikube Addons Management

- name: Enable useful addons
  ansible.builtin.command:
    cmd: "minikube addons enable {{ item }}"
  loop:
    - ingress
    - metrics-server
    - dashboard
    - registry
    - storage-provisioner
  changed_when: true
  become: false

- name: List enabled addons
  ansible.builtin.command: minikube addons list --output=json
  register: addons
  changed_when: false

- name: Show enabled addons
  ansible.builtin.debug:
    msg: "{{ addons.stdout | from_json }}"

Deploy Application to Minikube

---
- name: Deploy app to Minikube
  hosts: localhost
  connection: local
  become: false
  tasks:
    - name: Ensure Minikube is running
      ansible.builtin.command: minikube status
      register: mk_status
      changed_when: false
      ignore_errors: true

    - name: Start Minikube if not running
      ansible.builtin.command: minikube start
      when: mk_status is failed
      changed_when: true

    - name: Create namespace
      kubernetes.core.k8s:
        state: present
        definition:
          apiVersion: v1
          kind: Namespace
          metadata:
            name: myapp

    - name: Deploy application
      kubernetes.core.k8s:
        state: present
        definition:
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: myapp
            namespace: myapp
          spec:
            replicas: 2
            selector:
              matchLabels:
                app: myapp
            template:
              metadata:
                labels:
                  app: myapp
              spec:
                containers:
                  - name: myapp
                    image: nginx:latest
                    ports:
                      - containerPort: 80

    - name: Expose service
      kubernetes.core.k8s:
        state: present
        definition:
          apiVersion: v1
          kind: Service
          metadata:
            name: myapp
            namespace: myapp
          spec:
            type: NodePort
            selector:
              app: myapp
            ports:
              - port: 80
                targetPort: 80

    - name: Get service URL
      ansible.builtin.command: minikube service myapp -n myapp --url
      register: service_url
      changed_when: false

    - name: Show application URL
      ansible.builtin.debug:
        msg: "Application available at: {{ service_url.stdout }}"

CI/CD Testing with Minikube

# .github/workflows/k8s-test.yml
name: Kubernetes Tests
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Start Minikube
        uses: medyagh/setup-minikube@latest
      - name: Deploy and test
        run: |
          ansible-playbook deploy-to-minikube.yml
          kubectl wait --for=condition=available deployment/myapp -n myapp --timeout=120s

Minikube vs Other Local K8s

ToolMulti-nodeResource UsageBest For
Minikube✅ (experimental)MediumGeneral dev/testing
kind✅LowCI/CD pipelines
k3s✅LowEdge/IoT
Docker Desktop❌HighSimple local dev
MicroK8s✅LowUbuntu/snap users

Conclusion

Minikube with Ansible gives you reproducible local Kubernetes environments. Use the Galaxy role for quick setup, or build a custom playbook for full control over versions, drivers, and addons. Combine with the kubernetes.core.k8s module to deploy applications directly from Ansible, and integrate into CI/CD for automated Kubernetes testing. For CI pipelines, consider kind as a lighter alternative — but for developer workstations, Minikube's dashboard and addon ecosystem remains hard to beat.

Further reading

To go deeper, managing Kubernetes with Ansible playbooks expands on these patterns in production.