--- # Kubeconfig merging tasks - name: Check if main kubeconfig exists delegate_to: localhost ansible.builtin.stat: path: "{{ local_home }}/.kube/config" register: main_kubeconfig - name: Create backup of existing kubeconfig delegate_to: localhost ansible.builtin.copy: src: "{{ local_home }}/.kube/config" dest: "{{ local_home }}/.kube/config.backup.{{ ansible_date_time.epoch }}" mode: "0644" when: main_kubeconfig.stat.exists - name: Read new cluster kubeconfig delegate_to: localhost ansible.builtin.slurp: src: "{{ local_home }}/.kube/config-{{ cluster_name }}" register: new_kubeconfig_content - name: Parse new kubeconfig delegate_to: localhost ansible.builtin.set_fact: new_kubeconfig: "{{ new_kubeconfig_content.content | b64decode | from_yaml }}" - name: Update cluster name in kubeconfig delegate_to: localhost ansible.builtin.set_fact: updated_kubeconfig: apiVersion: "{{ new_kubeconfig.apiVersion }}" kind: "{{ new_kubeconfig.kind }}" clusters: - name: "{{ cluster_name }}" cluster: "{{ new_kubeconfig.clusters[0].cluster }}" contexts: - name: "{{ cluster_name }}-admin" context: cluster: "{{ cluster_name }}" user: "{{ cluster_name }}-admin" users: - name: "{{ cluster_name }}-admin" user: "{{ new_kubeconfig.users[0].user }}" current-context: "{{ cluster_name }}-admin" - name: Merge with existing kubeconfig or create new one delegate_to: localhost block: - name: Read existing kubeconfig ansible.builtin.slurp: src: "{{ local_home }}/.kube/config" register: existing_kubeconfig_content when: main_kubeconfig.stat.exists - name: Parse existing kubeconfig ansible.builtin.set_fact: existing_kubeconfig: "{{ existing_kubeconfig_content.content | b64decode | from_yaml }}" when: main_kubeconfig.stat.exists - name: Merge kubeconfigs ansible.builtin.set_fact: merged_kubeconfig: apiVersion: "{{ existing_kubeconfig.apiVersion | default('v1') }}" kind: "{{ existing_kubeconfig.kind | default('Config') }}" clusters: "{{ (existing_kubeconfig.clusters | default([])) + updated_kubeconfig.clusters }}" contexts: "{{ (existing_kubeconfig.contexts | default([])) + updated_kubeconfig.contexts }}" users: "{{ (existing_kubeconfig.users | default([])) + updated_kubeconfig.users }}" current-context: "{{ updated_kubeconfig['current-context'] }}" when: main_kubeconfig.stat.exists - name: Use new kubeconfig as merged config ansible.builtin.set_fact: merged_kubeconfig: "{{ updated_kubeconfig }}" when: not main_kubeconfig.stat.exists - name: Write merged kubeconfig delegate_to: localhost ansible.builtin.copy: content: "{{ merged_kubeconfig | to_nice_yaml }}" dest: "{{ local_home }}/.kube/config" mode: "0644" owner: "{{ local_user }}" - name: Display available contexts delegate_to: localhost ansible.builtin.debug: msg: | Kubeconfig updated successfully! Available contexts: {% for context in merged_kubeconfig.contexts %} - {{ context.name }} {% endfor %} Current context: {{ merged_kubeconfig['current-context'] }} To switch contexts, use: kubectl config use-context To list all contexts: kubectl config get-contexts