sync
This commit is contained in:
193
ansible/DNS_MANAGEMENT_REFACTOR.md
Normal file
193
ansible/DNS_MANAGEMENT_REFACTOR.md
Normal file
@@ -0,0 +1,193 @@
|
||||
# DNS Management Refactor - Modular & Repeatable
|
||||
|
||||
This document explains the refactoring of DNS management from standalone playbooks to modular, reusable tasks.
|
||||
|
||||
## 🎯 **What Changed**
|
||||
|
||||
### **Before (Monolithic)**
|
||||
```yaml
|
||||
# Standalone playbook: add_technitium_dns_entry.yml
|
||||
- name: Add entry to Technitium DNS
|
||||
hosts: all
|
||||
tasks:
|
||||
- name: Create DNS entry
|
||||
effectivelywild.technitium_dns.technitium_dns_add_record:
|
||||
# ... hardcoded parameters
|
||||
```
|
||||
|
||||
### **After (Modular)**
|
||||
```yaml
|
||||
# Reusable task: tasks/add_technitium_dns_entry.yml
|
||||
- name: Create DNS entry for {{ dns_record_name }}
|
||||
effectivelywild.technitium_dns.technitium_dns_add_record:
|
||||
# ... parameterized with variables
|
||||
```
|
||||
|
||||
## 📁 **New Structure**
|
||||
|
||||
```
|
||||
ansible/
|
||||
├── playbooks/
|
||||
│ ├── tasks/
|
||||
│ │ └── add_technitium_dns_entry.yml # ✅ Reusable task file
|
||||
│ ├── add_dns_entry.yml # ✅ New playbook using task
|
||||
│ ├── add_technitium_dns_entry.yml.backup # 📦 Backed up old version
|
||||
│ └── roles/
|
||||
│ └── dns-manager/ # ✅ Enhanced role
|
||||
│ ├── tasks/main.yml # Uses task file
|
||||
│ └── defaults/main.yml # Technitium defaults
|
||||
└── scripts/
|
||||
└── migrate-dns-references.sh # ✅ Migration helper
|
||||
```
|
||||
|
||||
## 🚀 **Usage Examples**
|
||||
|
||||
### **1. In Playbooks (Direct Task Include)**
|
||||
```yaml
|
||||
- name: Add DNS entry for my server
|
||||
hosts: my_servers
|
||||
tasks:
|
||||
- name: Create DNS entry
|
||||
ansible.builtin.include_tasks: tasks/add_technitium_dns_entry.yml
|
||||
vars:
|
||||
dns_record_name: "{{ inventory_hostname }}"
|
||||
dns_zone: "{{ base_domain }}"
|
||||
dns_ip_address: "{{ ansible_default_ipv4.address }}"
|
||||
```
|
||||
|
||||
### **2. Using the DNS Manager Role**
|
||||
```yaml
|
||||
- name: Setup cluster DNS
|
||||
hosts: control_plane[0]
|
||||
roles:
|
||||
- role: dns-manager
|
||||
vars:
|
||||
cluster_endpoint: "my-cluster.local.mk-labs.cloud"
|
||||
cluster_vip: "10.1.71.100"
|
||||
```
|
||||
|
||||
### **3. Using the New Playbook**
|
||||
```yaml
|
||||
# Import the new modular playbook
|
||||
- import_playbook: add_dns_entry.yml
|
||||
```
|
||||
|
||||
### **4. In Cluster Network Setup**
|
||||
```yaml
|
||||
- name: Setup complete cluster network
|
||||
ansible.builtin.include_role:
|
||||
name: cluster-network-setup
|
||||
vars:
|
||||
cluster_name: "fastpass"
|
||||
cluster_endpoint: "fastpass.local.mk-labs.cloud"
|
||||
cluster_vip: "10.1.71.53"
|
||||
```
|
||||
|
||||
## 🔧 **Migration Guide**
|
||||
|
||||
### **Automatic Migration**
|
||||
```bash
|
||||
# Run the migration script to find references
|
||||
./scripts/migrate-dns-references.sh
|
||||
```
|
||||
|
||||
### **Manual Updates**
|
||||
|
||||
1. **Replace playbook imports:**
|
||||
```yaml
|
||||
# OLD
|
||||
- import_playbook: add_technitium_dns_entry.yml
|
||||
|
||||
# NEW
|
||||
- import_playbook: add_dns_entry.yml
|
||||
```
|
||||
|
||||
2. **Use task includes in roles:**
|
||||
```yaml
|
||||
- ansible.builtin.include_tasks: tasks/add_technitium_dns_entry.yml
|
||||
vars:
|
||||
dns_record_name: "my-server"
|
||||
dns_ip_address: "10.1.71.100"
|
||||
```
|
||||
|
||||
3. **Use the dns-manager role:**
|
||||
```yaml
|
||||
- ansible.builtin.include_role:
|
||||
name: dns-manager
|
||||
```
|
||||
|
||||
## 📋 **Variable Reference**
|
||||
|
||||
### **Task Variables (`tasks/add_technitium_dns_entry.yml`)**
|
||||
| Variable | Default | Description |
|
||||
|----------|---------|-------------|
|
||||
| `dns_record_name` | `inventory_hostname` | DNS record name |
|
||||
| `dns_zone` | `base_domain` | DNS zone |
|
||||
| `dns_ip_address` | `ip_address` | IP address for A record |
|
||||
| `dns_record_type` | `A` | DNS record type |
|
||||
| `dns_ttl` | `360` | TTL in seconds |
|
||||
| `dns_create_ptr` | `true` | Create PTR record |
|
||||
| `dns_debug` | `true` | Show debug output |
|
||||
|
||||
### **DNS Manager Role Variables**
|
||||
| Variable | Default | Description |
|
||||
|----------|---------|-------------|
|
||||
| `cluster_endpoint` | - | Full cluster FQDN |
|
||||
| `cluster_vip` | - | Cluster VIP address |
|
||||
| `dns_management_enabled` | `true` | Enable DNS management |
|
||||
| `use_hosts_file_fallback` | `true` | Add to /etc/hosts |
|
||||
| `dns_ttl` | `360` | DNS TTL |
|
||||
| `create_ptr_record` | `true` | Create PTR record |
|
||||
|
||||
## 🎯 **Benefits**
|
||||
|
||||
### ✅ **Modularity**
|
||||
- Single task file used across multiple contexts
|
||||
- Consistent DNS management approach
|
||||
- Easy to maintain and update
|
||||
|
||||
### ✅ **Flexibility**
|
||||
- Works in playbooks, roles, and standalone
|
||||
- Parameterized for different use cases
|
||||
- Supports multiple DNS providers (extensible)
|
||||
|
||||
### ✅ **Maintainability**
|
||||
- One place to update DNS logic
|
||||
- Clear variable interface
|
||||
- Better error handling and debugging
|
||||
|
||||
### ✅ **Integration**
|
||||
- Seamlessly integrates with cluster setup
|
||||
- Works with existing homelab infrastructure
|
||||
- Compatible with Traefik load balancer setup
|
||||
|
||||
## 🔄 **Integration with Cluster Setup**
|
||||
|
||||
The DNS management now integrates seamlessly with your cluster deployment:
|
||||
|
||||
```yaml
|
||||
# In fastpass-first-control-plane role
|
||||
- name: Setup network infrastructure for FastPass cluster
|
||||
ansible.builtin.include_role:
|
||||
name: cluster-network-setup
|
||||
vars:
|
||||
cluster_name: "{{ cluster_name }}"
|
||||
cluster_endpoint: "{{ control_plane_endpoint }}"
|
||||
cluster_vip: "{{ ansible_default_ipv4.address }}"
|
||||
control_plane_nodes: "{{ groups['fastpass_control_plane'] }}"
|
||||
```
|
||||
|
||||
This automatically:
|
||||
1. ✅ Creates DNS entry for `fastpass.local.mk-labs.cloud`
|
||||
2. ✅ Configures Traefik load balancer
|
||||
3. ✅ Tests connectivity
|
||||
4. ✅ Provides fallback to /etc/hosts
|
||||
|
||||
## 🚀 **Next Steps**
|
||||
|
||||
1. **Test the refactored approach** with your FastPass cluster
|
||||
2. **Extend to other clusters** (Hub, Internal) using the same pattern
|
||||
3. **Add support for other DNS providers** if needed
|
||||
4. **Create monitoring** for DNS health checks
|
||||
|
||||
This modular approach makes your homelab's DNS management much more maintainable and repeatable across all your Kubernetes clusters!
|
||||
233
ansible/KUBECONFIG_MANAGEMENT.md
Normal file
233
ansible/KUBECONFIG_MANAGEMENT.md
Normal file
@@ -0,0 +1,233 @@
|
||||
# Kubeconfig Management - Modular & Repeatable
|
||||
|
||||
This document explains the modular kubeconfig management system for your homelab's multiple Kubernetes clusters.
|
||||
|
||||
## Overview
|
||||
|
||||
The kubeconfig management has been refactored into reusable, modular components that can handle multiple clusters seamlessly:
|
||||
|
||||
- **FastPass** (Vanilla Kubernetes)
|
||||
- **Hub Cluster** (OpenShift SNO)
|
||||
- **Internal Cluster** (OpenShift)
|
||||
- **Future clusters** (easily extensible)
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
ansible/playbooks/roles/
|
||||
├── kubeconfig-manager/ # Core reusable role
|
||||
│ ├── tasks/main.yml # Main entry point
|
||||
│ ├── tasks/merge-kubeconfig.yml # Merging logic
|
||||
│ ├── defaults/main.yml # Default variables
|
||||
│ └── README.md # Role documentation
|
||||
├── cluster-kubeconfig/ # Generic wrapper role
|
||||
└── fastpass-first-control-plane/ # Uses kubeconfig-manager
|
||||
```
|
||||
|
||||
## Quick Usage
|
||||
|
||||
### 1. Using the Script (Easiest)
|
||||
|
||||
```bash
|
||||
cd ansible
|
||||
|
||||
# Setup FastPass cluster kubeconfig
|
||||
./scripts/setup-kubeconfig.sh fastpass fastpass_control_plane[0]
|
||||
|
||||
# Setup Hub cluster kubeconfig
|
||||
./scripts/setup-kubeconfig.sh hub hub_cluster
|
||||
|
||||
# Setup Internal cluster kubeconfig
|
||||
./scripts/setup-kubeconfig.sh internal internal_cluster[0]
|
||||
```
|
||||
|
||||
### 2. Direct Ansible Usage
|
||||
|
||||
```bash
|
||||
# Single cluster
|
||||
ansible-playbook -i inventory.yml \
|
||||
playbooks/examples/multi-cluster-kubeconfig.yml \
|
||||
--limit fastpass_control_plane[0] \
|
||||
-e target_cluster_name=fastpass
|
||||
|
||||
# Multiple clusters at once
|
||||
ansible-playbook -i inventory.yml \
|
||||
playbooks/examples/multi-cluster-kubeconfig.yml
|
||||
```
|
||||
|
||||
### 3. In Your Own Playbooks
|
||||
|
||||
```yaml
|
||||
- name: Setup kubeconfig for any cluster
|
||||
hosts: my_cluster_nodes[0]
|
||||
roles:
|
||||
- role: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "my-cluster"
|
||||
kubeconfig_source_path: "/etc/kubernetes/admin.conf"
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
### ✅ **Modular & Reusable**
|
||||
- Single role works with any Kubernetes cluster
|
||||
- Easy to extend for new clusters
|
||||
- Consistent behavior across all clusters
|
||||
|
||||
### ✅ **Safe Operations**
|
||||
- Automatic backups before merging
|
||||
- Non-destructive merging
|
||||
- Preserves existing contexts
|
||||
|
||||
### ✅ **Multi-Cluster Ready**
|
||||
- Unique naming: `cluster-name-admin`
|
||||
- No conflicts between clusters
|
||||
- Easy context switching
|
||||
|
||||
### ✅ **Homelab Optimized**
|
||||
- Works with vanilla Kubernetes
|
||||
- Works with OpenShift
|
||||
- Handles different kubeconfig paths
|
||||
|
||||
## Generated Structure
|
||||
|
||||
After running the kubeconfig management:
|
||||
|
||||
```bash
|
||||
~/.kube/
|
||||
├── config # Merged config with all clusters
|
||||
├── config-fastpass # Individual cluster configs
|
||||
├── config-hub
|
||||
├── config-internal
|
||||
└── config.backup.1697123456 # Timestamped backups
|
||||
```
|
||||
|
||||
## Context Management
|
||||
|
||||
```bash
|
||||
# List all available contexts
|
||||
kubectl config get-contexts
|
||||
|
||||
# Switch between clusters
|
||||
kubectl config use-context fastpass-admin
|
||||
kubectl config use-context hub-admin
|
||||
kubectl config use-context internal-admin
|
||||
|
||||
# Check current context
|
||||
kubectl config current-context
|
||||
|
||||
# Test connectivity
|
||||
kubectl cluster-info
|
||||
kubectl get nodes
|
||||
```
|
||||
|
||||
## Integration with Existing Roles
|
||||
|
||||
### Before (Monolithic)
|
||||
```yaml
|
||||
# fastpass-first-control-plane/tasks/main.yml
|
||||
- name: 50+ lines of kubeconfig logic
|
||||
# Lots of repetitive code
|
||||
```
|
||||
|
||||
### After (Modular)
|
||||
```yaml
|
||||
# fastpass-first-control-plane/tasks/main.yml
|
||||
- name: Setup kubeconfig for FastPass cluster
|
||||
ansible.builtin.include_role:
|
||||
name: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "{{ cluster_name }}"
|
||||
```
|
||||
|
||||
## Adding New Clusters
|
||||
|
||||
To add a new cluster (e.g., "edge-cluster"):
|
||||
|
||||
1. **Add to inventory:**
|
||||
```yaml
|
||||
edge_cluster:
|
||||
hosts:
|
||||
edge-node-01:
|
||||
```
|
||||
|
||||
2. **Use the script:**
|
||||
```bash
|
||||
./scripts/setup-kubeconfig.sh edge edge_cluster[0]
|
||||
```
|
||||
|
||||
3. **Or add to playbook:**
|
||||
```yaml
|
||||
- name: Setup kubeconfig for Edge cluster
|
||||
hosts: edge_cluster[0]
|
||||
roles:
|
||||
- role: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "edge"
|
||||
```
|
||||
|
||||
## Customization
|
||||
|
||||
### Different Kubeconfig Paths
|
||||
```yaml
|
||||
- role: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "openshift-cluster"
|
||||
kubeconfig_source_path: "/etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/localhost.kubeconfig"
|
||||
```
|
||||
|
||||
### Custom Context Names
|
||||
```yaml
|
||||
- role: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "prod"
|
||||
context_suffix: "system:admin" # Results in "prod-system:admin"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Permission Denied**
|
||||
```bash
|
||||
# Fix ownership
|
||||
sudo chown -R $USER:$USER ~/.kube/
|
||||
```
|
||||
|
||||
2. **Context Not Found**
|
||||
```bash
|
||||
# List available contexts
|
||||
kubectl config get-contexts
|
||||
|
||||
# Check if cluster was added
|
||||
kubectl config view
|
||||
```
|
||||
|
||||
3. **Backup Recovery**
|
||||
```bash
|
||||
# Restore from backup
|
||||
cp ~/.kube/config.backup.1697123456 ~/.kube/config
|
||||
```
|
||||
|
||||
### Debug Mode
|
||||
```bash
|
||||
# Run with verbose output
|
||||
ansible-playbook -vvv playbooks/examples/multi-cluster-kubeconfig.yml
|
||||
```
|
||||
|
||||
## Benefits for Your Homelab
|
||||
|
||||
1. **Consistency**: Same process for all clusters
|
||||
2. **Maintainability**: Single role to update/fix
|
||||
3. **Scalability**: Easy to add new clusters
|
||||
4. **Safety**: Automatic backups and safe merging
|
||||
5. **Flexibility**: Works with different Kubernetes distributions
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **Test the modular approach** with your FastPass cluster
|
||||
2. **Extend to Hub and Internal clusters** using the same pattern
|
||||
3. **Create cluster-specific variables** in group_vars if needed
|
||||
4. **Add monitoring/validation** tasks to verify kubeconfig health
|
||||
|
||||
This modular approach makes your homelab's multi-cluster management much more maintainable and repeatable!
|
||||
@@ -15,3 +15,6 @@ base_domain: "local.mk-labs.cloud"
|
||||
|
||||
# Terraform variables
|
||||
terraform_server: "infra01"
|
||||
|
||||
# Traefik variables
|
||||
traefik_server: "lightning-lane"
|
||||
@@ -8,12 +8,12 @@ pod_network_cidr: "10.244.0.0/16"
|
||||
service_cidr: "10.96.0.0/12"
|
||||
|
||||
# Control Plane Configuration
|
||||
control_plane_endpoint: "fastpass.local.mk-labs.cloud"
|
||||
control_plane_endpoint: "{{ cluster_name}}.{{ base_domain}}"
|
||||
control_plane_port: "6443"
|
||||
|
||||
# CNI Configuration
|
||||
cni_plugin: "calico"
|
||||
calico_version: "v3.28.0"
|
||||
calico_version: "v3.30.3"
|
||||
|
||||
# Node Labels and Taints
|
||||
node_labels:
|
||||
|
||||
59
ansible/host_vars/arcade/vars
Normal file
59
ansible/host_vars/arcade/vars
Normal file
@@ -0,0 +1,59 @@
|
||||
---
|
||||
# file: host_vars/vm_template/vars
|
||||
# Ansible vars template for hosts created via cloning.
|
||||
|
||||
# Supported hypervisors:
|
||||
# - Proxmox
|
||||
|
||||
platform: "proxmox"
|
||||
|
||||
# This is the Proxmox node where all the VM templates are stored. (Templates are not global.)
|
||||
|
||||
proxmox_clone_node: "fantasyland"
|
||||
|
||||
# Templates are named in the following format (all lower case): <OS Distribution>-<OS Version>-<VM Size>
|
||||
# Current OS offerings are:
|
||||
# - Ubuntu
|
||||
# - 24.04
|
||||
# - Fedora
|
||||
# - 42
|
||||
|
||||
vm_os_distribution: "ubuntu"
|
||||
vm_os_version: "24.04"
|
||||
|
||||
# Current VM sizes are:
|
||||
# - Small: 2 cores, 2GB memory, 8 GiB virtual disk
|
||||
# - Medium: 2 cores, 4GB memory, 16 GiB virtual disk
|
||||
# - Large: 4 cores, 4GB memory, 32 GiB virtual disk
|
||||
# - Large Plus: 4 cores, 4GB memory, 48 GiB virtual disk
|
||||
# - Xlarge: 4 cores, 8GB memory, 64 GiB virtual disk
|
||||
# - Xlarge Plus: 4 cores, 8GB memory, 128 GiB virtual disk
|
||||
|
||||
vm_size: "large"
|
||||
|
||||
# Proxmox storage target.
|
||||
|
||||
vm_storage: "liberty-tree"
|
||||
|
||||
# Proxmox does not yet do dynamic load balancing, the host target sets the target for HA groups
|
||||
# and backup groups. (ha_group will be factored out in the next functionality update.)
|
||||
|
||||
ha_group: "pve03"
|
||||
proxmox_host_target: "pve03"
|
||||
|
||||
# Currently, only single NIC VMs using IPv4 are supported via cloning. The IP address also
|
||||
# sets the Proxmox VMID. The VMID is a combination of the 3rd and 4th octet of the IPv4 address.
|
||||
|
||||
ip_address: 10.1.71.111
|
||||
# vm_mac_address: 'BC:24:11:11:BC:58'
|
||||
|
||||
# Software
|
||||
# Future enhancement will allow specification of additional software to automatically deploy to
|
||||
# the VM after creation.
|
||||
|
||||
#terraform_version: "1.11.3"
|
||||
|
||||
# ---
|
||||
|
||||
vm_clone_source: "{{ vm_os_distribution }}-{{ vm_os_version }}-{{ vm_size }}"
|
||||
hostname: "{{ inventory_hostname }}.{{ base_domain }}" # Change variable to fqdn
|
||||
33
ansible/host_vars/lightning_lane/vars
Normal file
33
ansible/host_vars/lightning_lane/vars
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
# file: host_vars/lightning_lane/vars
|
||||
# Traefik Load Balancer Server
|
||||
|
||||
# Supported hypervisors:
|
||||
# - Proxmox
|
||||
|
||||
platform: "proxmox"
|
||||
|
||||
# This is the Proxmox node where all the VM templates are stored. (Templates are not global.)
|
||||
proxmox_clone_node: "fantasyland"
|
||||
|
||||
# VM Configuration
|
||||
vm_os_distribution: "ubuntu"
|
||||
vm_os_version: "24.04"
|
||||
vm_size: "medium"
|
||||
vm_storage: "general"
|
||||
|
||||
# Proxmox HA Configuration
|
||||
ha_group: "pve02"
|
||||
proxmox_host_target: "pve02"
|
||||
|
||||
# Network Configuration
|
||||
# IP address for the Traefik load balancer
|
||||
ip_address: 10.1.71.80
|
||||
vm_mac_address: 'BC:24:11:50:00:80'
|
||||
|
||||
# Software Configuration
|
||||
# Traefik will be installed and configured on this host
|
||||
|
||||
# VM Template Configuration
|
||||
vm_clone_source: "{{ vm_os_distribution }}-{{ vm_os_version }}-{{ vm_size }}"
|
||||
hostname: "{{ inventory_hostname }}.{{ base_domain }}"
|
||||
@@ -37,6 +37,11 @@ prometheus_nodes:
|
||||
# hosts:
|
||||
# cinderella-castle:
|
||||
|
||||
papermc_server:
|
||||
# ansible-galaxy role install engonzal.papermc
|
||||
hosts:
|
||||
arcade:
|
||||
|
||||
semaphore_server:
|
||||
hosts:
|
||||
imagineering:
|
||||
@@ -45,6 +50,10 @@ n8n_server:
|
||||
hosts:
|
||||
tiki-room:
|
||||
|
||||
traefik_server:
|
||||
hosts:
|
||||
lightning_lane:
|
||||
|
||||
# dhcp_server:
|
||||
# hosts:
|
||||
# matchbox:
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
---
|
||||
- name: Add entry to DNS
|
||||
# Replacement for add_technitium_dns_entry.yml
|
||||
# This playbook uses the modular task file approach
|
||||
|
||||
- name: Add DNS entry using Technitium DNS
|
||||
hosts: all
|
||||
gather_facts: false
|
||||
|
||||
tasks:
|
||||
- name: Create DNS entry for {{ inventory_hostname }}
|
||||
delegate_to: "{{ groups['ipaserver'][0] }}"
|
||||
freeipa.ansible_freeipa.ipadnsrecord:
|
||||
ipaapi_context: "server"
|
||||
ipaadmin_password: "{{ vault_freeipa_password }}"
|
||||
name: "{{ inventory_hostname }}"
|
||||
zone_name: "{{ base_domain }}"
|
||||
record_type: "A"
|
||||
record_value: "{{ ip_address }}"
|
||||
record_ttl: 60
|
||||
# create_reverse: yes
|
||||
- name: Include Technitium DNS entry task
|
||||
ansible.builtin.include_tasks: tasks/add_technitium_dns_entry.yml
|
||||
vars:
|
||||
host_name: "{{ inventory_hostname }}"
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
when: vm_os_distribution == "ubuntu"
|
||||
|
||||
- name: DNS Playbook
|
||||
ansible.builtin.import_playbook: add_technitium_dns_entry.yml
|
||||
ansible.builtin.import_playbook: add_dns_entry.yml
|
||||
|
||||
- name: DHCP Playbook
|
||||
ansible.builtin.import_playbook: add_dhcp_reservation.yml
|
||||
|
||||
@@ -6,19 +6,21 @@
|
||||
# roles:
|
||||
# - role: kubernetes-prerequisites
|
||||
|
||||
- name: Step 2 - Deploy First Control Plane Node
|
||||
hosts: fastpass_control_plane[0]
|
||||
become: true
|
||||
gather_facts: true # false
|
||||
roles:
|
||||
- role: fastpass-first-control-plane
|
||||
|
||||
# - name: Step 3 - Deploy Additional Control Plane Nodes
|
||||
# hosts: fastpass_control_plane[1:]
|
||||
# - name: Step 2 - Deploy First Control Plane Node
|
||||
# hosts: fastpass_control_plane[0]
|
||||
# become: true
|
||||
# gather_facts: false
|
||||
# roles:
|
||||
# - role: fastpass-additional-control-plane
|
||||
# - role: fastpass-first-control-plane
|
||||
|
||||
- name: Step 3 - Deploy Additional Control Plane Nodes
|
||||
hosts: fastpass_control_plane[1:]
|
||||
become: true
|
||||
gather_facts: true # false
|
||||
roles:
|
||||
- role: fastpass-additional-control-plane
|
||||
vars:
|
||||
cluster_name: "fastpass"
|
||||
|
||||
# - name: Step 4 - Deploy Worker Nodes
|
||||
# hosts: fastpass_workers
|
||||
@@ -26,18 +28,3 @@
|
||||
# gather_facts: false
|
||||
# roles:
|
||||
# - role: fastpass-workers
|
||||
|
||||
# - name: Final Cluster Validation
|
||||
# hosts: fastpass_control_plane[0]
|
||||
# become: false
|
||||
# gather_facts: false
|
||||
# environment:
|
||||
# KUBECONFIG: "{{ kubeconfig_path }}"
|
||||
# tasks:
|
||||
# - name: Display cluster status
|
||||
# ansible.builtin.command: kubectl get nodes
|
||||
# delegate_to: localhost
|
||||
|
||||
# - name: Display all pods
|
||||
# ansible.builtin.command: kubectl get pods -A
|
||||
# delegate_to: localhost
|
||||
|
||||
28
ansible/playbooks/deploy_minecraft.yml
Normal file
28
ansible/playbooks/deploy_minecraft.yml
Normal file
@@ -0,0 +1,28 @@
|
||||
---
|
||||
- name: 1. Deploy Paper Minecraft server
|
||||
hosts: papermc_server
|
||||
vars:
|
||||
papermc_mem: 2G
|
||||
papermc_server_port: 25565
|
||||
papermc_motd: "MK-Labs Minecraft Server"
|
||||
papermc_broadcast_console_to_ops: false
|
||||
papermc_version: 1.21.8
|
||||
papermc_dir_main: /app/minecraft
|
||||
papermc_dir_data: /app/minecraft/data
|
||||
papermc_dir_logs: /app/minecraft/logs
|
||||
papermc_dir_plugins: /app/minecraft/plugins
|
||||
papermc_dir_worlds: /app/minecraft/worlds
|
||||
papermc_dir_worlds_nether: /app/minecraft/worlds/nether
|
||||
papermc_dir_worlds_the_end: /app/minecraft/worlds/the_end
|
||||
papermc_dir_worlds_world: /app/minecraft/worlds/world
|
||||
papermc_jar_url: https://papermc.io/api/v2/projects/paper/versions/{{ papermc_version }}/builds/latest/downloads/paper-{{ papermc_version }}-{{ papermc_build }}.jar
|
||||
papermc_jar_path: /opt/papermc/paper-{{ papermc_version }}-{{ papermc_build }}.jar
|
||||
papermc_jar_checksum_type: sha256
|
||||
papermc_jar_checksum_path: /opt/papermc/paper-{{ papermc_version }}-{{ papermc_build }}.jar.sha256
|
||||
papermc_whitelist:
|
||||
- ryansrailroad
|
||||
papermc_white_list: "true"
|
||||
papermc_enforce_whitelist: "true"
|
||||
roles:
|
||||
- role: engonzal.papermc
|
||||
become: yes
|
||||
41
ansible/playbooks/examples/multi-cluster-kubeconfig.yml
Normal file
41
ansible/playbooks/examples/multi-cluster-kubeconfig.yml
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
# Example playbook showing how to use the modular kubeconfig management
|
||||
# across multiple clusters in your homelab
|
||||
|
||||
- name: Setup kubeconfig for FastPass cluster
|
||||
hosts: fastpass_control_plane[0]
|
||||
gather_facts: true
|
||||
roles:
|
||||
- role: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "fastpass"
|
||||
|
||||
- name: Setup kubeconfig for Hub cluster
|
||||
hosts: hub_cluster
|
||||
gather_facts: true
|
||||
roles:
|
||||
- role: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "hub"
|
||||
|
||||
- name: Setup kubeconfig for Internal cluster
|
||||
hosts: internal_cluster[0]
|
||||
gather_facts: true
|
||||
roles:
|
||||
- role: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "internal"
|
||||
|
||||
# Alternative approach using the generic cluster-kubeconfig role
|
||||
- name: Setup kubeconfig for any cluster
|
||||
hosts: "{{ target_cluster_hosts }}"
|
||||
gather_facts: true
|
||||
roles:
|
||||
- role: cluster-kubeconfig
|
||||
vars:
|
||||
cluster_name: "{{ target_cluster_name }}"
|
||||
|
||||
# Usage examples:
|
||||
# ansible-playbook -i inventory.yml examples/multi-cluster-kubeconfig.yml
|
||||
# ansible-playbook -i inventory.yml examples/multi-cluster-kubeconfig.yml --limit fastpass_control_plane[0]
|
||||
# ansible-playbook -i inventory.yml examples/multi-cluster-kubeconfig.yml -e target_cluster_hosts=hub_cluster -e target_cluster_name=hub
|
||||
60
ansible/playbooks/examples/setup-fastpass-network.yml
Normal file
60
ansible/playbooks/examples/setup-fastpass-network.yml
Normal file
@@ -0,0 +1,60 @@
|
||||
---
|
||||
# Example: Setup network infrastructure for FastPass cluster
|
||||
# This demonstrates the modular approach for DNS and load balancer setup
|
||||
|
||||
- name: Setup FastPass Cluster Network Infrastructure
|
||||
hosts: fastpass_control_plane[0]
|
||||
gather_facts: true
|
||||
vars:
|
||||
cluster_name: "fastpass"
|
||||
cluster_endpoint: "{{ control_plane_endpoint }}"
|
||||
cluster_vip: "{{ ansible_default_ipv4.address }}"
|
||||
control_plane_nodes: "{{ groups['fastpass_control_plane'] }}"
|
||||
|
||||
tasks:
|
||||
- name: Display cluster configuration
|
||||
ansible.builtin.debug:
|
||||
msg: |
|
||||
Setting up network for FastPass cluster:
|
||||
- Cluster Name: {{ cluster_name }}
|
||||
- Endpoint: {{ cluster_endpoint }}
|
||||
- VIP: {{ cluster_vip }}
|
||||
- Control Plane Nodes: {{ control_plane_nodes | join(', ') }}
|
||||
|
||||
- name: Setup cluster network infrastructure
|
||||
ansible.builtin.include_role:
|
||||
name: cluster-network-setup
|
||||
vars:
|
||||
cluster_name: "{{ cluster_name }}"
|
||||
cluster_endpoint: "{{ cluster_endpoint }}"
|
||||
cluster_vip: "{{ cluster_vip }}"
|
||||
control_plane_nodes: "{{ control_plane_nodes }}"
|
||||
|
||||
# Alternative approach using task file directly
|
||||
- name: Alternative - Use Technitium DNS task directly
|
||||
hosts: localhost
|
||||
gather_facts: false
|
||||
vars:
|
||||
cluster_endpoint: "{{ hostvars[groups['fastpass_control_plane'][0]]['control_plane_endpoint'] }}"
|
||||
cluster_vip: "{{ hostvars[groups['fastpass_control_plane'][0]]['ansible_default_ipv4']['address'] }}"
|
||||
|
||||
tasks:
|
||||
- name: Create DNS entry using task file
|
||||
ansible.builtin.include_tasks: ../tasks/add_technitium_dns_entry.yml
|
||||
vars:
|
||||
dns_record_name: "{{ cluster_endpoint.split('.')[0] }}"
|
||||
dns_zone: "{{ base_domain }}"
|
||||
dns_ip_address: "{{ cluster_vip }}"
|
||||
dns_record_type: "A"
|
||||
dns_ttl: 360
|
||||
dns_create_ptr: true
|
||||
dns_debug: true
|
||||
when: use_task_approach | default(false)
|
||||
|
||||
# Usage examples:
|
||||
#
|
||||
# Use modular approach (recommended):
|
||||
# ansible-playbook -i inventory.yml playbooks/examples/setup-fastpass-network.yml
|
||||
#
|
||||
# Use task file approach:
|
||||
# ansible-playbook -i inventory.yml playbooks/examples/setup-fastpass-network.yml -e use_task_approach=true
|
||||
12
ansible/playbooks/roles/cluster-kubeconfig/tasks/main.yml
Normal file
12
ansible/playbooks/roles/cluster-kubeconfig/tasks/main.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
# role: cluster-kubeconfig
|
||||
# description: Generic role for any Kubernetes cluster kubeconfig management
|
||||
# author: mk-labs
|
||||
# version: 1.0.0
|
||||
|
||||
- name: Setup kubeconfig for {{ cluster_name }} cluster
|
||||
ansible.builtin.include_role:
|
||||
name: kubeconfig-manager
|
||||
vars:
|
||||
cluster_name: "{{ cluster_name }}"
|
||||
kubeconfig_source_path: "{{ kubeconfig_source_path | default('/etc/kubernetes/admin.conf') }}"
|
||||
48
ansible/playbooks/roles/cluster-network-setup/tasks/main.yml
Normal file
48
ansible/playbooks/roles/cluster-network-setup/tasks/main.yml
Normal file
@@ -0,0 +1,48 @@
|
||||
---
|
||||
# role: cluster-network-setup
|
||||
# description: Combined DNS and Load Balancer setup for Kubernetes clusters
|
||||
# author: mk-labs
|
||||
# version: 1.0.0
|
||||
|
||||
- name: Setup DNS entry for cluster
|
||||
ansible.builtin.include_role:
|
||||
name: dns-manager
|
||||
vars:
|
||||
cluster_endpoint: "{{ cluster_endpoint }}"
|
||||
cluster_vip: "{{ cluster_vip }}"
|
||||
|
||||
- name: Setup Traefik load balancer for cluster
|
||||
ansible.builtin.include_role:
|
||||
name: traefik-manager
|
||||
vars:
|
||||
cluster_name: "{{ cluster_name }}"
|
||||
cluster_endpoint: "{{ cluster_endpoint }}"
|
||||
control_plane_nodes: "{{ control_plane_nodes }}"
|
||||
when: traefik_enabled | default(true)
|
||||
|
||||
- name: Wait for DNS propagation
|
||||
ansible.builtin.wait_for:
|
||||
timeout: 30
|
||||
delegate_to: localhost
|
||||
|
||||
- name: Test cluster endpoint connectivity
|
||||
ansible.builtin.wait_for:
|
||||
host: "{{ cluster_endpoint }}"
|
||||
port: "{{ cluster_api_port | default(6443) }}"
|
||||
timeout: 60
|
||||
delegate_to: localhost
|
||||
register: connectivity_test
|
||||
failed_when: false
|
||||
|
||||
- name: Display network setup results
|
||||
ansible.builtin.debug:
|
||||
msg: |
|
||||
🌐 Network Setup Complete for {{ cluster_name }}:
|
||||
|
||||
DNS Entry: {{ cluster_endpoint }} → {{ cluster_vip }}
|
||||
Load Balancer: {{ 'Configured' if traefik_enabled | default(true) else 'Skipped' }}
|
||||
Connectivity: {{ 'Success' if connectivity_test.failed == false else 'Failed - Check firewall/network' }}
|
||||
|
||||
Next steps:
|
||||
1. Verify: kubectl --kubeconfig ~/.kube/config-{{ cluster_name }} cluster-info
|
||||
2. Switch context: kubectl config use-context {{ cluster_name }}-admin
|
||||
18
ansible/playbooks/roles/dns-manager/defaults/main.yml
Normal file
18
ansible/playbooks/roles/dns-manager/defaults/main.yml
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
# Default variables for dns-manager role
|
||||
|
||||
# DNS Configuration
|
||||
dns_management_enabled: true
|
||||
use_hosts_file_fallback: false
|
||||
dns_ttl: 360
|
||||
dns_propagation_wait: 2
|
||||
create_ptr_record: true
|
||||
|
||||
# Cluster Configuration (to be provided by calling role)
|
||||
# cluster_endpoint: "fastpass.local.mk-labs.cloud"
|
||||
# cluster_vip: "10.1.71.53"
|
||||
|
||||
# DNS Server Configuration (from group_vars)
|
||||
# dns_server: "monorail"
|
||||
# base_domain: "local.mk-labs.cloud"
|
||||
# vault_technitium_api_key: "{{ vault_technitium_api_key }}"
|
||||
17
ansible/playbooks/roles/dns-manager/tasks/main.yml
Normal file
17
ansible/playbooks/roles/dns-manager/tasks/main.yml
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
# role: dns-manager
|
||||
# description: Reusable role for managing DNS entries across clusters using Technitium DNS
|
||||
# author: mk-labs
|
||||
# version: 1.0.0
|
||||
|
||||
- name: Create DNS entry using Technitium DNS task
|
||||
ansible.builtin.include_tasks: "{{ playbook_dir }}/tasks/add_technitium_dns_entry.yml"
|
||||
|
||||
- name: Wait for DNS propagation
|
||||
ansible.builtin.pause:
|
||||
seconds: "{{ dns_propagation_wait | default(10) }}"
|
||||
when: dns_management_enabled | default(true)
|
||||
|
||||
- name: Look up A (IPv4) records for example.org
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ query('community.dns.lookup', 'fastpass') }}"
|
||||
@@ -0,0 +1,38 @@
|
||||
Role Name
|
||||
=========
|
||||
|
||||
A brief description of the role goes here.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required.
|
||||
|
||||
Role Variables
|
||||
--------------
|
||||
|
||||
A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well.
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles.
|
||||
|
||||
Example Playbook
|
||||
----------------
|
||||
|
||||
Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:
|
||||
|
||||
- hosts: servers
|
||||
roles:
|
||||
- { role: username.rolename, x: 42 }
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
BSD
|
||||
|
||||
Author Information
|
||||
------------------
|
||||
|
||||
An optional section for the role authors to include contact information, or a website (HTML is not allowed).
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
# FastPass Additional Control Plane Role Defaults
|
||||
|
||||
# Kubernetes services for control plane
|
||||
kubernetes_services_control_plane:
|
||||
- kubernetes_API
|
||||
- etcd
|
||||
- kubelet
|
||||
- kube-scheduler
|
||||
- kube-controller-manager
|
||||
|
||||
# Join token configuration
|
||||
join_token_ttl: "24h"
|
||||
certificate_key_ttl: "2h"
|
||||
|
||||
# Default cluster configuration
|
||||
pod_network_cidr: "10.244.0.0/16"
|
||||
service_cidr: "10.96.0.0/12"
|
||||
|
||||
# Kubelet configuration
|
||||
kubelet_cgroup_driver: "systemd"
|
||||
container_runtime_endpoint: "unix:///run/containerd/containerd.sock"
|
||||
@@ -0,0 +1,2 @@
|
||||
---
|
||||
# handlers file for fastpass-additional-control-plane
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
galaxy_info:
|
||||
author: Ryan Blundon
|
||||
description: FastPass Additional Control Plane - Deploy additional control plane nodes to existing FastPass Kubernetes cluster
|
||||
company: Homelab
|
||||
|
||||
license: MIT
|
||||
|
||||
min_ansible_version: "2.9"
|
||||
|
||||
platforms:
|
||||
- name: Ubuntu
|
||||
versions:
|
||||
- focal
|
||||
- jammy
|
||||
- name: Debian
|
||||
versions:
|
||||
- bullseye
|
||||
- bookworm
|
||||
|
||||
galaxy_tags:
|
||||
- kubernetes
|
||||
- k8s
|
||||
- controlplane
|
||||
- cluster
|
||||
- fastpass
|
||||
- kubeadm
|
||||
|
||||
dependencies:
|
||||
- role: dns-manager
|
||||
when: cluster_name is defined
|
||||
- role: kubeconfig-manager
|
||||
when: cluster_name is defined
|
||||
@@ -0,0 +1,29 @@
|
||||
---
|
||||
# role: fastpass-additional-control-plane
|
||||
# description: FastPass Additional Control Plane - Deploy additional control plane nodes to existing FastPass Kubernetes cluster
|
||||
# author: Ryan Blundon
|
||||
# version: 1.0.0
|
||||
# date: 2025-10-05
|
||||
|
||||
# This role joins additional nodes to an existing Kubernetes cluster as control plane nodes
|
||||
# It follows the same patterns as fastpass-first-control-plane but uses kubeadm join instead of kubeadm init
|
||||
|
||||
- name: Display role information
|
||||
ansible.builtin.debug:
|
||||
msg: "Starting FastPass Additional Control Plane deployment for {{ inventory_hostname }}"
|
||||
|
||||
- name: Setup DNS record for cluster
|
||||
ansible.builtin.include_role:
|
||||
name: dns-manager
|
||||
vars:
|
||||
host_name: "{{ cluster_name }}"
|
||||
|
||||
- name: Open services for control plane
|
||||
become: true
|
||||
when: ansible_os_family == "Debian"
|
||||
block:
|
||||
- name: Open firewall ports for control plane
|
||||
community.general.ufw:
|
||||
rule: allow
|
||||
name: "{{ item }}"
|
||||
loop: "{{ kubernetes_services_control_plane }}"
|
||||
@@ -0,0 +1,3 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
localhost
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
- hosts: localhost
|
||||
remote_user: root
|
||||
roles:
|
||||
- fastpass-additional-control-plane
|
||||
@@ -0,0 +1,2 @@
|
||||
---
|
||||
# vars file for fastpass-additional-control-plane
|
||||
@@ -1,11 +1,16 @@
|
||||
---
|
||||
# role: fastpass-first-control-plane
|
||||
# description: FastPass First Control Plane
|
||||
# author: mk-labs
|
||||
# author: Ryan Blundon
|
||||
# version: 1.0.0
|
||||
# date: 2025-09-27
|
||||
|
||||
# Open sevices for control plane
|
||||
- name: Setup DNS record for cluster
|
||||
ansible.builtin.include_role:
|
||||
name: dns-manager
|
||||
vars:
|
||||
host_name: "{{ cluster_name }}"
|
||||
|
||||
- name: Open services for control plane
|
||||
become: true
|
||||
when: ansible_os_family == "Debian"
|
||||
@@ -14,8 +19,7 @@
|
||||
community.general.ufw:
|
||||
rule: allow
|
||||
name: "{{ item }}"
|
||||
loop:
|
||||
"{{ kubernetes_services_control_plane }}"
|
||||
loop: "{{ kubernetes_services_control_plane }}"
|
||||
|
||||
- name: Create initial kubelet config file
|
||||
become: true
|
||||
@@ -23,20 +27,27 @@
|
||||
dest: /var/lib/kubelet/config.yaml
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
||||
mode: "0644"
|
||||
content: |
|
||||
apiVersion: kubelet.config.k8s.io/v1beta1
|
||||
kind: KubeletConfiguration
|
||||
cgroupDriver: systemd
|
||||
containerRuntimeEndpoint: unix:///run/containerd/containerd.sock
|
||||
|
||||
# - name: Initialize Kubernetes cluster
|
||||
# become: true
|
||||
# ansible.builtin.command: kubeadm init --ignore-preflight-errors=NumCPU,Mem --control-plane-endpoint=fastpass # {{ cluster_name }}
|
||||
# args:
|
||||
# creates: /etc/kubernetes/admin.conf
|
||||
# register: kubeadm_init
|
||||
# changed_when: kubeadm_init.rc == 0
|
||||
- name: Initialize Kubernetes cluster
|
||||
become: true
|
||||
ansible.builtin.command:
|
||||
argv:
|
||||
- kubeadm
|
||||
- init
|
||||
- --apiserver-advertise-address={{ ip_address }}
|
||||
- --control-plane-endpoint={{ cluster_name }}
|
||||
- --pod-network-cidr={{ pod_network_cidr }}
|
||||
- --service-cidr={{ service_cidr }}
|
||||
args:
|
||||
creates: /etc/kubernetes/admin.conf
|
||||
register: kubeadm_init
|
||||
changed_when: kubeadm_init.rc == 0
|
||||
|
||||
- name: Ensure kubelet is enabled and started
|
||||
become: true
|
||||
@@ -44,23 +55,49 @@
|
||||
name: kubelet
|
||||
enabled: true
|
||||
state: started
|
||||
|
||||
- name: Debug ansible_env.HOME
|
||||
|
||||
- name: Setup kubeconfig for FastPass cluster
|
||||
ansible.builtin.include_role:
|
||||
name: kubeconfig-manager
|
||||
|
||||
# - name: Download tigera-operator manifest
|
||||
# delegate_to: localhost
|
||||
# ansible.builtin.get_url:
|
||||
# url: https://raw.githubusercontent.com/projectcalico/calico/{{ calico_version }}/manifests/tigera-operator.yaml
|
||||
# dest: /tmp/tigera-operator.yaml
|
||||
# mode: "0644"
|
||||
|
||||
# - name: Install tigera-operator from downloaded file
|
||||
# delegate_to: localhost
|
||||
# kubernetes.core.k8s:
|
||||
# kubeconfig: "{{ local_home }}/.kube/config"
|
||||
# state: present
|
||||
# src: /tmp/tigera-operator.yaml
|
||||
|
||||
# - name: Download Calico CRDs
|
||||
# delegate_to: localhost
|
||||
# ansible.builtin.get_url:
|
||||
# url: https://raw.githubusercontent.com/projectcalico/calico/{{ calico_version }}/manifests/custom-resources.yaml
|
||||
# dest: /tmp/custom-resources.yaml
|
||||
# mode: "0644"
|
||||
|
||||
# - name: Install Calico CRDs from downloaded file
|
||||
# delegate_to: localhost
|
||||
# kubernetes.core.k8s:
|
||||
# kubeconfig: "{{ local_home }}/.kube/config"
|
||||
# state: present
|
||||
# src: /tmp/custom-resources.yaml
|
||||
|
||||
- name: Download Flannel CNI
|
||||
delegate_to: localhost
|
||||
ansible.builtin.debug:
|
||||
var: ansible_env.HOME
|
||||
ansible.builtin.get_url:
|
||||
url: https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
|
||||
dest: /tmp/kube-flannel.yaml
|
||||
mode: "0644"
|
||||
|
||||
|
||||
- name: Create .kube directory for user
|
||||
- name: Install Flannel CNI from downloaded file
|
||||
delegate_to: localhost
|
||||
ansible.builtin.file:
|
||||
path: "{{ ansible_env.HOME }}/.kube"
|
||||
state: directory
|
||||
mode: '0755'
|
||||
|
||||
- name: Copy admin.conf to user's .kube directory on controller
|
||||
ansible.builtin.fetch:
|
||||
src: /etc/kubernetes/admin.conf
|
||||
dest: "{{ ansible_env.HOME }}/.kube/config-fastpass" # {{cluster_name}}"
|
||||
mode: '0644'
|
||||
|
||||
kubernetes.core.k8s:
|
||||
kubeconfig: "{{ local_home }}/.kube/config"
|
||||
state: present
|
||||
src: /tmp/kube-flannel.yaml
|
||||
|
||||
38
ansible/playbooks/roles/fastpass-worker-nodes/README.md
Normal file
38
ansible/playbooks/roles/fastpass-worker-nodes/README.md
Normal file
@@ -0,0 +1,38 @@
|
||||
Role Name
|
||||
=========
|
||||
|
||||
A brief description of the role goes here.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required.
|
||||
|
||||
Role Variables
|
||||
--------------
|
||||
|
||||
A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well.
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles.
|
||||
|
||||
Example Playbook
|
||||
----------------
|
||||
|
||||
Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:
|
||||
|
||||
- hosts: servers
|
||||
roles:
|
||||
- { role: username.rolename, x: 42 }
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
BSD
|
||||
|
||||
Author Information
|
||||
------------------
|
||||
|
||||
An optional section for the role authors to include contact information, or a website (HTML is not allowed).
|
||||
@@ -0,0 +1,3 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
# defaults file for fastpass-worker-nodes
|
||||
@@ -0,0 +1,3 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
# handlers file for fastpass-worker-nodes
|
||||
35
ansible/playbooks/roles/fastpass-worker-nodes/meta/main.yml
Normal file
35
ansible/playbooks/roles/fastpass-worker-nodes/meta/main.yml
Normal file
@@ -0,0 +1,35 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
galaxy_info:
|
||||
author: your name
|
||||
description: your role description
|
||||
company: your company (optional)
|
||||
|
||||
# If the issue tracker for your role is not on github, uncomment the
|
||||
# next line and provide a value
|
||||
# issue_tracker_url: http://example.com/issue/tracker
|
||||
|
||||
# Choose a valid license ID from https://spdx.org - some suggested licenses:
|
||||
# - BSD-3-Clause (default)
|
||||
# - MIT
|
||||
# - GPL-2.0-or-later
|
||||
# - GPL-3.0-only
|
||||
# - Apache-2.0
|
||||
# - CC-BY-4.0
|
||||
license: license (GPL-2.0-or-later, MIT, etc)
|
||||
|
||||
min_ansible_version: 2.1
|
||||
|
||||
# If this a Container Enabled role, provide the minimum Ansible Container version.
|
||||
# min_ansible_container_version:
|
||||
|
||||
galaxy_tags: []
|
||||
# List tags for your role here, one per line. A tag is a keyword that describes
|
||||
# and categorizes the role. Users find roles by searching for tags. Be sure to
|
||||
# remove the '[]' above, if you add tags to this list.
|
||||
#
|
||||
# NOTE: A tag is limited to a single word comprised of alphanumeric characters.
|
||||
# Maximum 20 tags per role.
|
||||
|
||||
dependencies: []
|
||||
# List your role dependencies here, one per line. Be sure to remove the '[]' above,
|
||||
# if you add dependencies to this list.
|
||||
@@ -0,0 +1,3 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
# tasks file for fastpass-worker-nodes
|
||||
@@ -0,0 +1,3 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
localhost
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
- hosts: localhost
|
||||
remote_user: root
|
||||
roles:
|
||||
- fastpass-worker-nodes
|
||||
@@ -0,0 +1,3 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
# vars file for fastpass-worker-nodes
|
||||
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
|
||||
@@ -74,43 +74,3 @@
|
||||
- name: 7 Install containerd
|
||||
ansible.builtin.include_role:
|
||||
name: containerd
|
||||
|
||||
# - name: Create kubelet config directory
|
||||
# ansible.builtin.file:
|
||||
# path: /var/lib/kubelet
|
||||
# state: directory
|
||||
# owner: root
|
||||
# group: root
|
||||
# mode: '0755'
|
||||
|
||||
# - name: Create initial kubelet config file
|
||||
# ansible.builtin.copy:
|
||||
# dest: /var/lib/kubelet/config.yaml
|
||||
# owner: root
|
||||
# group: root
|
||||
# mode: '0644'
|
||||
# content: |
|
||||
# apiVersion: kubelet.config.k8s.io/v1beta1
|
||||
# kind: KubeletConfiguration
|
||||
# cgroupDriver: systemd
|
||||
# containerRuntimeEndpoint: unix:///run/containerd/containerd.sock
|
||||
|
||||
# - name: Install CNI plugins via dnf
|
||||
# ansible.builtin.dnf:
|
||||
# name: containernetworking-plugins
|
||||
# state: present
|
||||
|
||||
# - name: Verify CNI plugins installation
|
||||
# ansible.builtin.shell: ls -la /opt/cni/bin/ || echo "CNI plugins not found in /opt/cni/bin/"
|
||||
# register: cni_plugins
|
||||
# ignore_errors: true
|
||||
|
||||
# - name: Display installed CNI plugins
|
||||
# ansible.builtin.debug:
|
||||
# msg: "CNI plugins status: {{ cni_plugins.stdout }}"
|
||||
|
||||
# - name: Enable kubelet service (but don't start yet)
|
||||
# ansible.builtin.systemd:
|
||||
# name: kubelet
|
||||
# enabled: true
|
||||
# state: stopped
|
||||
|
||||
12
ansible/playbooks/roles/traefik-manager/defaults/main.yml
Normal file
12
ansible/playbooks/roles/traefik-manager/defaults/main.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
# Default variables for traefik-manager role
|
||||
|
||||
# Traefik Configuration
|
||||
traefik_config_dir: "/etc/traefik"
|
||||
traefik_host: "{{ traefik_server | default(groups['traefik_servers'][0] | default('localhost')) }}"
|
||||
cluster_api_port: 6443
|
||||
|
||||
# Cluster Configuration (to be provided by calling role)
|
||||
# cluster_name: "fastpass"
|
||||
# cluster_endpoint: "fastpass.local.mk-labs.cloud"
|
||||
# control_plane_nodes: ["space-mountain", "big-thunder-mountain", "splash-mountain"]
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
# Handlers for traefik-manager role
|
||||
|
||||
- name: reload traefik
|
||||
ansible.builtin.systemd:
|
||||
name: traefik
|
||||
state: reloaded
|
||||
delegate_to: "{{ traefik_host }}"
|
||||
45
ansible/playbooks/roles/traefik-manager/tasks/main.yml
Normal file
45
ansible/playbooks/roles/traefik-manager/tasks/main.yml
Normal file
@@ -0,0 +1,45 @@
|
||||
---
|
||||
# role: traefik-manager
|
||||
# description: Reusable role for managing Traefik load balancer configuration
|
||||
# author: mk-labs
|
||||
# version: 1.0.0
|
||||
|
||||
- name: Create Traefik configuration directory
|
||||
ansible.builtin.file:
|
||||
path: "{{ traefik_config_dir }}/dynamic"
|
||||
state: directory
|
||||
mode: "0755"
|
||||
delegate_to: "{{ traefik_host }}"
|
||||
|
||||
- name: Generate Traefik TCP router configuration for Kubernetes API
|
||||
ansible.builtin.template:
|
||||
src: k8s-api-router.yml.j2
|
||||
dest: "{{ traefik_config_dir }}/dynamic/{{ cluster_name }}-api.yml"
|
||||
mode: "0644"
|
||||
delegate_to: "{{ traefik_host }}"
|
||||
notify: reload traefik
|
||||
|
||||
- name: Generate Traefik service configuration for control plane nodes
|
||||
ansible.builtin.template:
|
||||
src: k8s-api-service.yml.j2
|
||||
dest: "{{ traefik_config_dir }}/dynamic/{{ cluster_name }}-service.yml"
|
||||
mode: "0644"
|
||||
delegate_to: "{{ traefik_host }}"
|
||||
notify: reload traefik
|
||||
|
||||
- name: Verify Traefik configuration syntax
|
||||
ansible.builtin.command: |
|
||||
traefik --configfile={{ traefik_config_dir }}/traefik.yml --dry-run
|
||||
delegate_to: "{{ traefik_host }}"
|
||||
register: traefik_syntax_check
|
||||
failed_when: traefik_syntax_check.rc != 0
|
||||
changed_when: false
|
||||
|
||||
- name: Display Traefik configuration status
|
||||
ansible.builtin.debug:
|
||||
msg: |
|
||||
✅ Traefik configuration created successfully:
|
||||
- Router: {{ cluster_name }}-api
|
||||
- Service: {{ cluster_name }}-backend
|
||||
- Endpoint: {{ cluster_endpoint }}:{{ cluster_api_port }}
|
||||
- Backend nodes: {{ control_plane_nodes | join(', ') }}
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
# Traefik TCP Router for {{ cluster_name }} Kubernetes API
|
||||
tcp:
|
||||
routers:
|
||||
{{ cluster_name }}-api:
|
||||
rule: "HostSNI(`{{ cluster_endpoint }}`)"
|
||||
service: "{{ cluster_name }}-backend"
|
||||
tls:
|
||||
passthrough: true
|
||||
entryPoints:
|
||||
- "k8s-api"
|
||||
|
||||
services:
|
||||
{{ cluster_name }}-backend:
|
||||
loadBalancer:
|
||||
servers:
|
||||
{% for node in control_plane_nodes %}
|
||||
- address: "{{ hostvars[node]['ansible_default_ipv4']['address'] }}:{{ cluster_api_port }}"
|
||||
{% endfor %}
|
||||
healthCheck:
|
||||
path: "/healthz"
|
||||
interval: "10s"
|
||||
timeout: "3s"
|
||||
20
ansible/playbooks/tasks/add_technitium_dns_entry.yml
Normal file
20
ansible/playbooks/tasks/add_technitium_dns_entry.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
# Reusable task file for adding Technitium DNS entries
|
||||
# This replaces the standalone playbook and can be imported into any playbook
|
||||
|
||||
# - name: Display cluster_name
|
||||
# ansible.builtin.debug:
|
||||
# msg: "{{ host_name }} - {{ ip_address }} - {{ vault_technitium_api_key }}"
|
||||
|
||||
- name: Create DNS A Record entry for {{ host_name }}
|
||||
delegate_to: localhost
|
||||
effectivelywild.technitium_dns.technitium_dns_add_record:
|
||||
api_url: "http://{{ dns_server }}.{{ base_domain }}"
|
||||
api_token: "{{ vault_technitium_api_key }}"
|
||||
zone: "{{ base_domain }}"
|
||||
name: "{{ host_name }}.{{ base_domain }}"
|
||||
type: "A"
|
||||
ipAddress: "{{ ip_address }}"
|
||||
ptr: true
|
||||
ttl: 360
|
||||
validate_certs: false
|
||||
11
ansible/playbooks/test-dns-cname.yml
Normal file
11
ansible/playbooks/test-dns-cname.yml
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
- name: Test DNS CNAME Creation
|
||||
hosts: fastpass_control_plane[0]
|
||||
gather_facts: false
|
||||
tasks:
|
||||
- name: Test DNS CNAME entry creation
|
||||
ansible.builtin.include_role:
|
||||
name: dns-manager
|
||||
vars:
|
||||
cluster_endpoint: "{{ control_plane_endpoint }}"
|
||||
cluster_cname_target: "{{ traefik_server }}.{{ base_domain }}"
|
||||
@@ -1,13 +1,16 @@
|
||||
# requirements.yml
|
||||
---
|
||||
collections:
|
||||
- name: community.general
|
||||
version: 11.1.0
|
||||
|
||||
- name: nccurry.openshift
|
||||
version: 1.4.0
|
||||
# - name: nccurry.openshift
|
||||
# version: 1.4.0
|
||||
|
||||
- name: somaz94.ansible_k8s_iac_tool
|
||||
version: 1.1.6
|
||||
|
||||
- name: prometheus.prometheus
|
||||
version: 0.27.0
|
||||
# - name: prometheus.prometheus
|
||||
# version: 0.27.0
|
||||
|
||||
- name: kubernetes.core
|
||||
82
ansible/scripts/migrate-dns-references.sh
Normal file
82
ansible/scripts/migrate-dns-references.sh
Normal file
@@ -0,0 +1,82 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Migration script to update DNS entry references
|
||||
# This script helps migrate from the old add_technitium_dns_entry.yml to the new modular approach
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
print_status() {
|
||||
local status=$1
|
||||
local message=$2
|
||||
case $status in
|
||||
"INFO")
|
||||
echo -e "${BLUE}ℹ️ INFO${NC}: $message"
|
||||
;;
|
||||
"SUCCESS")
|
||||
echo -e "${GREEN}✅ SUCCESS${NC}: $message"
|
||||
;;
|
||||
"ERROR")
|
||||
echo -e "${RED}❌ ERROR${NC}: $message"
|
||||
;;
|
||||
"WARN")
|
||||
echo -e "${YELLOW}⚠️ WARN${NC}: $message"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
print_status "INFO" "Migrating DNS entry references to modular approach..."
|
||||
|
||||
# Search for references to the old playbook
|
||||
OLD_PLAYBOOK="add_technitium_dns_entry.yml"
|
||||
NEW_PLAYBOOK="add_dns_entry.yml"
|
||||
|
||||
# Find all YAML files that might reference the old playbook
|
||||
YAML_FILES=$(find . -name "*.yml" -type f | grep -v ".git")
|
||||
|
||||
FOUND_REFERENCES=0
|
||||
|
||||
for file in $YAML_FILES; do
|
||||
if grep -q "$OLD_PLAYBOOK" "$file" 2>/dev/null; then
|
||||
print_status "WARN" "Found reference in: $file"
|
||||
FOUND_REFERENCES=$((FOUND_REFERENCES + 1))
|
||||
|
||||
# Show the context
|
||||
echo " Context:"
|
||||
grep -n -B2 -A2 "$OLD_PLAYBOOK" "$file" | sed 's/^/ /'
|
||||
echo ""
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $FOUND_REFERENCES -eq 0 ]; then
|
||||
print_status "SUCCESS" "No references to $OLD_PLAYBOOK found"
|
||||
else
|
||||
print_status "INFO" "Found $FOUND_REFERENCES references to migrate"
|
||||
print_status "INFO" "Migration options:"
|
||||
echo ""
|
||||
echo "1. Replace playbook imports:"
|
||||
echo " OLD: - import_playbook: $OLD_PLAYBOOK"
|
||||
echo " NEW: - import_playbook: $NEW_PLAYBOOK"
|
||||
echo ""
|
||||
echo "2. Use task includes in roles:"
|
||||
echo " - ansible.builtin.include_tasks: tasks/add_technitium_dns_entry.yml"
|
||||
echo ""
|
||||
echo "3. Use the dns-manager role:"
|
||||
echo " - ansible.builtin.include_role:"
|
||||
echo " name: dns-manager"
|
||||
fi
|
||||
|
||||
# Check if the old playbook exists and suggest backup
|
||||
if [ -f "playbooks/$OLD_PLAYBOOK" ]; then
|
||||
print_status "INFO" "Old playbook exists at: playbooks/$OLD_PLAYBOOK"
|
||||
print_status "INFO" "Consider backing it up before removing:"
|
||||
echo " mv playbooks/$OLD_PLAYBOOK playbooks/${OLD_PLAYBOOK}.backup"
|
||||
fi
|
||||
|
||||
print_status "SUCCESS" "Migration analysis complete"
|
||||
114
ansible/scripts/setup-cluster-network.sh
Normal file
114
ansible/scripts/setup-cluster-network.sh
Normal file
@@ -0,0 +1,114 @@
|
||||
#!/bin/bash
|
||||
|
||||
# FastPass Homelab - Cluster Network Setup Script
|
||||
# This script sets up DNS (via Technitium) and load balancer configuration for any Kubernetes cluster
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Function to print colored output
|
||||
print_status() {
|
||||
local status=$1
|
||||
local message=$2
|
||||
case $status in
|
||||
"INFO")
|
||||
echo -e "${BLUE}ℹ️ INFO${NC}: $message"
|
||||
;;
|
||||
"SUCCESS")
|
||||
echo -e "${GREEN}✅ SUCCESS${NC}: $message"
|
||||
;;
|
||||
"ERROR")
|
||||
echo -e "${RED}❌ ERROR${NC}: $message"
|
||||
;;
|
||||
"WARN")
|
||||
echo -e "${YELLOW}⚠️ WARN${NC}: $message"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Usage function
|
||||
usage() {
|
||||
echo "Usage: $0 <cluster_name> <cluster_endpoint> <control_plane_group>"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " $0 fastpass fastpass.local.mk-labs.cloud fastpass_control_plane"
|
||||
echo " $0 hub hub.local.mk-labs.cloud hub_cluster"
|
||||
echo " $0 internal internal.local.mk-labs.cloud internal_cluster"
|
||||
echo ""
|
||||
echo "This script will:"
|
||||
echo " 1. Create DNS entry for the cluster endpoint"
|
||||
echo " 2. Configure Traefik load balancer"
|
||||
echo " 3. Test connectivity"
|
||||
echo ""
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Check arguments
|
||||
if [ $# -ne 3 ]; then
|
||||
print_status "ERROR" "Invalid number of arguments"
|
||||
usage
|
||||
fi
|
||||
|
||||
CLUSTER_NAME=$1
|
||||
CLUSTER_ENDPOINT=$2
|
||||
CONTROL_PLANE_GROUP=$3
|
||||
|
||||
print_status "INFO" "Setting up network for cluster: $CLUSTER_NAME"
|
||||
print_status "INFO" "Endpoint: $CLUSTER_ENDPOINT"
|
||||
print_status "INFO" "Control plane group: $CONTROL_PLANE_GROUP"
|
||||
|
||||
# Check if inventory file exists
|
||||
if [ ! -f "inventory.yml" ]; then
|
||||
print_status "ERROR" "inventory.yml not found. Please run from ansible directory."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create temporary playbook
|
||||
TEMP_PLAYBOOK=$(mktemp /tmp/cluster-network-setup-XXXXXX.yml)
|
||||
cat > "$TEMP_PLAYBOOK" << EOF
|
||||
---
|
||||
- name: Setup network infrastructure for $CLUSTER_NAME
|
||||
hosts: ${CONTROL_PLANE_GROUP}[0]
|
||||
gather_facts: true
|
||||
tasks:
|
||||
- name: Setup cluster network infrastructure
|
||||
ansible.builtin.include_role:
|
||||
name: cluster-network-setup
|
||||
vars:
|
||||
cluster_name: "$CLUSTER_NAME"
|
||||
cluster_endpoint: "$CLUSTER_ENDPOINT"
|
||||
cluster_vip: "{{ ansible_default_ipv4.address }}"
|
||||
control_plane_nodes: "{{ groups['$CONTROL_PLANE_GROUP'] }}"
|
||||
EOF
|
||||
|
||||
print_status "INFO" "Running network setup playbook..."
|
||||
|
||||
# Run the network setup
|
||||
if ansible-playbook -i inventory.yml "$TEMP_PLAYBOOK"; then
|
||||
print_status "SUCCESS" "Network setup completed for $CLUSTER_NAME"
|
||||
|
||||
# Test connectivity
|
||||
print_status "INFO" "Testing connectivity to $CLUSTER_ENDPOINT:6443..."
|
||||
if timeout 10 bash -c "</dev/tcp/$CLUSTER_ENDPOINT/6443"; then
|
||||
print_status "SUCCESS" "Connectivity test passed"
|
||||
else
|
||||
print_status "WARN" "Connectivity test failed - may need time to propagate"
|
||||
fi
|
||||
|
||||
print_status "INFO" "Network setup complete. You can now:"
|
||||
echo " 1. Deploy your cluster"
|
||||
echo " 2. Test with: kubectl --server=https://$CLUSTER_ENDPOINT:6443 cluster-info"
|
||||
|
||||
else
|
||||
print_status "ERROR" "Network setup failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Cleanup
|
||||
rm -f "$TEMP_PLAYBOOK"
|
||||
91
ansible/scripts/setup-kubeconfig.sh
Normal file
91
ansible/scripts/setup-kubeconfig.sh
Normal file
@@ -0,0 +1,91 @@
|
||||
#!/bin/bash
|
||||
|
||||
# FastPass Homelab - Kubeconfig Setup Script
|
||||
# This script makes it easy to add any cluster's kubeconfig to your local config
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Function to print colored output
|
||||
print_status() {
|
||||
local status=$1
|
||||
local message=$2
|
||||
case $status in
|
||||
"INFO")
|
||||
echo -e "${BLUE}ℹ️ INFO${NC}: $message"
|
||||
;;
|
||||
"SUCCESS")
|
||||
echo -e "${GREEN}✅ SUCCESS${NC}: $message"
|
||||
;;
|
||||
"ERROR")
|
||||
echo -e "${RED}❌ ERROR${NC}: $message"
|
||||
;;
|
||||
"WARN")
|
||||
echo -e "${YELLOW}⚠️ WARN${NC}: $message"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Usage function
|
||||
usage() {
|
||||
echo "Usage: $0 <cluster_name> <host_group>"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " $0 fastpass fastpass_control_plane[0]"
|
||||
echo " $0 hub hub_cluster"
|
||||
echo " $0 internal internal_cluster[0]"
|
||||
echo ""
|
||||
echo "Available clusters in your homelab:"
|
||||
echo " - fastpass (FastPass Kubernetes cluster)"
|
||||
echo " - hub (OpenShift Hub cluster)"
|
||||
echo " - internal (Internal OpenShift cluster)"
|
||||
echo ""
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Check arguments
|
||||
if [ $# -ne 2 ]; then
|
||||
print_status "ERROR" "Invalid number of arguments"
|
||||
usage
|
||||
fi
|
||||
|
||||
CLUSTER_NAME=$1
|
||||
HOST_GROUP=$2
|
||||
|
||||
print_status "INFO" "Setting up kubeconfig for cluster: $CLUSTER_NAME"
|
||||
print_status "INFO" "Target hosts: $HOST_GROUP"
|
||||
|
||||
# Check if inventory file exists
|
||||
if [ ! -f "inventory.yml" ]; then
|
||||
print_status "ERROR" "inventory.yml not found. Please run from ansible directory."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run the kubeconfig setup
|
||||
print_status "INFO" "Running Ansible playbook..."
|
||||
|
||||
ansible-playbook -i inventory.yml \
|
||||
playbooks/examples/multi-cluster-kubeconfig.yml \
|
||||
--limit "$HOST_GROUP" \
|
||||
-e "target_cluster_hosts=$HOST_GROUP" \
|
||||
-e "target_cluster_name=$CLUSTER_NAME" \
|
||||
--tags kubeconfig
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_status "SUCCESS" "Kubeconfig setup completed for $CLUSTER_NAME"
|
||||
print_status "INFO" "You can now use: kubectl config use-context ${CLUSTER_NAME}-admin"
|
||||
|
||||
# Show available contexts
|
||||
echo ""
|
||||
print_status "INFO" "Available contexts:"
|
||||
kubectl config get-contexts 2>/dev/null || print_status "WARN" "kubectl not found or kubeconfig not accessible"
|
||||
else
|
||||
print_status "ERROR" "Kubeconfig setup failed"
|
||||
exit 1
|
||||
fi
|
||||
0
ansible/scripts/test-fastpass-deployment.sh
Executable file → Normal file
0
ansible/scripts/test-fastpass-deployment.sh
Executable file → Normal file
9
ansible/test-fastpass-role.yml
Normal file
9
ansible/test-fastpass-role.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
- name: Test FastPass First Control Plane Role
|
||||
hosts: localhost
|
||||
gather_facts: true
|
||||
vars:
|
||||
cluster_name: "fastpass"
|
||||
kubernetes_services_control_plane: []
|
||||
roles:
|
||||
- role: playbooks/roles/fastpass-first-control-plane
|
||||
Reference in New Issue
Block a user