sync
This commit is contained in:
86
ansible/playbooks/roles/kubeconfig-manager/README.md
Normal file
86
ansible/playbooks/roles/kubeconfig-manager/README.md
Normal file
@@ -0,0 +1,86 @@
|
||||
# Kubeconfig Manager Role
|
||||
|
||||
A reusable Ansible role for managing kubeconfig files across multiple Kubernetes clusters.
|
||||
|
||||
## Features
|
||||
|
||||
- Fetches kubeconfig from remote Kubernetes nodes
|
||||
- Merges multiple cluster configs into a single `~/.kube/config` file
|
||||
- Creates backups before merging
|
||||
- Provides unique cluster, context, and user names
|
||||
- Works with any Kubernetes cluster (vanilla K8s, OpenShift, etc.)
|
||||
|
||||
## Requirements
|
||||
|
||||
- Ansible 2.9+
|
||||
- Access to Kubernetes cluster admin.conf file
|
||||
- Local kubectl installation (optional, for testing)
|
||||
|
||||
## Role Variables
|
||||
|
||||
| Variable | Default | Description |
|
||||
|----------|---------|-------------|
|
||||
| `cluster_name` | `kubernetes` | Name of the cluster (required) |
|
||||
| `kubeconfig_source_path` | `/etc/kubernetes/admin.conf` | Path to kubeconfig on remote host |
|
||||
| `context_suffix` | `admin` | Suffix for context name |
|
||||
|
||||
## Example Usage
|
||||
|
||||
### In a playbook:
|
||||
|
||||
```yaml
|
||||
- name: Setup kubeconfig for FastPass cluster
|
||||
hosts: fastpass_control_plane[0]
|
||||
roles:
|
||||
- role: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "fastpass"
|
||||
|
||||
- name: Setup kubeconfig for Hub cluster
|
||||
hosts: hub_cluster
|
||||
roles:
|
||||
- role: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "hub"
|
||||
kubeconfig_source_path: "/etc/kubernetes/admin.conf"
|
||||
```
|
||||
|
||||
### As an included role:
|
||||
|
||||
```yaml
|
||||
- name: Manage kubeconfig
|
||||
ansible.builtin.include_role:
|
||||
name: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "{{ my_cluster_name }}"
|
||||
```
|
||||
|
||||
## Generated Structure
|
||||
|
||||
The role creates contexts with this naming pattern:
|
||||
- **Cluster**: `{{ cluster_name }}`
|
||||
- **Context**: `{{ cluster_name }}-admin`
|
||||
- **User**: `{{ cluster_name }}-admin`
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
~/.kube/
|
||||
├── config # Merged kubeconfig
|
||||
├── config-fastpass # Individual cluster configs
|
||||
├── config-hub
|
||||
├── config-internal
|
||||
└── config.backup.1234567890 # Timestamped backups
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
None
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
|
||||
## Author
|
||||
|
||||
mk-labs
|
||||
11
ansible/playbooks/roles/kubeconfig-manager/defaults/main.yml
Normal file
11
ansible/playbooks/roles/kubeconfig-manager/defaults/main.yml
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
# Default variables for kubeconfig-manager role
|
||||
|
||||
# Source path for the kubeconfig file on the remote host
|
||||
kubeconfig_source_path: "/etc/kubernetes/admin.conf"
|
||||
|
||||
# Cluster name - should be provided by the calling playbook
|
||||
cluster_name: "kubernetes"
|
||||
|
||||
# Context suffix for the cluster
|
||||
context_suffix: "admin"
|
||||
34
ansible/playbooks/roles/kubeconfig-manager/tasks/main.yml
Normal file
34
ansible/playbooks/roles/kubeconfig-manager/tasks/main.yml
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
# role: kubeconfig-manager
|
||||
# description: Reusable role for managing kubeconfig files across multiple clusters
|
||||
# author: mk-labs
|
||||
# version: 1.0.0
|
||||
|
||||
- name: Get local user environment
|
||||
delegate_to: localhost
|
||||
ansible.builtin.set_fact:
|
||||
local_home: "{{ lookup('env', 'HOME') }}"
|
||||
local_user: "{{ lookup('env', 'USER') }}"
|
||||
|
||||
- name: Debug local environment
|
||||
delegate_to: localhost
|
||||
ansible.builtin.debug:
|
||||
msg: "Local user: {{ local_user }}, Home directory: {{ local_home }}"
|
||||
|
||||
- name: Create .kube directory
|
||||
delegate_to: localhost
|
||||
ansible.builtin.file:
|
||||
path: "{{ local_home }}/.kube"
|
||||
state: directory
|
||||
owner: "{{ local_user }}"
|
||||
mode: "0755"
|
||||
|
||||
- name: Copy kubeconfig from remote host
|
||||
ansible.builtin.fetch:
|
||||
src: "{{ kubeconfig_source_path | default('/etc/kubernetes/admin.conf') }}"
|
||||
dest: "{{ local_home }}/.kube/config-{{ cluster_name }}"
|
||||
flat: true
|
||||
mode: "0644"
|
||||
|
||||
- name: Include kubeconfig merge tasks
|
||||
ansible.builtin.include_tasks: merge-kubeconfig.yml
|
||||
@@ -0,0 +1,103 @@
|
||||
---
|
||||
# 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 <context-name>
|
||||
|
||||
To list all contexts:
|
||||
kubectl config get-contexts
|
||||
Reference in New Issue
Block a user