Breaks out wild-setup phases into independently-runnable scripts.
Remove deprecated scripts and add Talos schema mappings - Deleted the following scripts as they are no longer needed: - create-installer-image.sh - detect-node-hardware.sh - generate-machine-configs.sh - Added a new file `talos-schemas.yaml` to maintain mappings of Talos versions to their corresponding schematic IDs for wild-cloud deployments. - Updated the README in the home scaffold to simplify the initial setup instructions.
This commit is contained in:
@@ -1,53 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Talos custom installer image creation script
|
||||
# This script generates installer image URLs using the centralized schematic ID
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Check if WC_HOME is set
|
||||
if [ -z "${WC_HOME:-}" ]; then
|
||||
echo "Error: WC_HOME environment variable not set. Run \`source ./env.sh\`."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get Talos version and schematic ID from config
|
||||
TALOS_VERSION=$(wild-config cluster.nodes.talos.version)
|
||||
SCHEMATIC_ID=$(wild-config cluster.nodes.talos.schematicId)
|
||||
|
||||
echo "Creating custom Talos installer image..."
|
||||
echo "Talos version: $TALOS_VERSION"
|
||||
|
||||
# Check if schematic ID exists
|
||||
if [ -z "$SCHEMATIC_ID" ] || [ "$SCHEMATIC_ID" = "null" ]; then
|
||||
echo "Error: No schematic ID found in config.yaml"
|
||||
echo "Run 'wild-talos-schema' first to upload schematic and get ID"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Schematic ID: $SCHEMATIC_ID"
|
||||
echo ""
|
||||
echo "Schematic includes:"
|
||||
yq eval '.cluster.nodes.talos.schematic.customization.systemExtensions.officialExtensions[]' "${WC_HOME}/config.yaml" | sed 's/^/ - /'
|
||||
echo ""
|
||||
|
||||
# Generate installer image URL
|
||||
INSTALLER_URL="factory.talos.dev/metal-installer/$SCHEMATIC_ID:$TALOS_VERSION"
|
||||
|
||||
echo ""
|
||||
echo "🎉 Custom installer image URL generated!"
|
||||
echo ""
|
||||
echo "Installer URL: $INSTALLER_URL"
|
||||
echo ""
|
||||
echo "Usage in machine configuration:"
|
||||
echo "machine:"
|
||||
echo " install:"
|
||||
echo " image: $INSTALLER_URL"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo "1. Update machine config templates with this installer URL"
|
||||
echo "2. Regenerate machine configurations"
|
||||
echo "3. Apply to existing nodes to trigger installation with extensions"
|
||||
echo ""
|
||||
echo "To update templates automatically, run:"
|
||||
echo " sed -i 's|image:.*|image: $INSTALLER_URL|' patch.templates/controlplane-node-*.yaml"
|
@@ -1,163 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Node registration script for Talos cluster setup
|
||||
# This script discovers hardware configuration from a node in maintenance mode
|
||||
# and updates config.yaml with per-node hardware settings
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Check if WC_HOME is set
|
||||
if [ -z "${WC_HOME:-}" ]; then
|
||||
echo "Error: WC_HOME environment variable not set. Run \`source ./env.sh\`."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Usage function
|
||||
usage() {
|
||||
echo "Usage: register-node.sh <node-ip> <node-number>"
|
||||
echo ""
|
||||
echo "Register a Talos node by discovering its hardware configuration."
|
||||
echo "The node must be booted in maintenance mode and accessible via IP."
|
||||
echo ""
|
||||
echo "Arguments:"
|
||||
echo " node-ip Current IP of the node in maintenance mode"
|
||||
echo " node-number Node number (1, 2, or 3) for control plane nodes"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " ./register-node.sh 192.168.8.168 1"
|
||||
echo " ./register-node.sh 192.168.8.169 2"
|
||||
echo ""
|
||||
echo "This script will:"
|
||||
echo " - Query the node for available network interfaces"
|
||||
echo " - Query the node for available disks"
|
||||
echo " - Update config.yaml with the per-node hardware settings"
|
||||
echo " - Update patch templates to use per-node hardware"
|
||||
}
|
||||
|
||||
# Parse arguments
|
||||
if [ $# -ne 2 ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
NODE_IP="$1"
|
||||
NODE_NUMBER="$2"
|
||||
|
||||
# Validate node number
|
||||
if [[ ! "$NODE_NUMBER" =~ ^[1-3]$ ]]; then
|
||||
echo "Error: Node number must be 1, 2, or 3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Registering Talos control plane node $NODE_NUMBER at $NODE_IP..."
|
||||
|
||||
# Test connectivity
|
||||
echo "Testing connectivity to node..."
|
||||
if ! talosctl -n "$NODE_IP" get links --insecure >/dev/null 2>&1; then
|
||||
echo "Error: Cannot connect to node at $NODE_IP"
|
||||
echo "Make sure the node is booted in maintenance mode and accessible."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Node is accessible"
|
||||
|
||||
# Discover network interfaces
|
||||
echo "Discovering network interfaces..."
|
||||
|
||||
# First, try to find the interface that's actually carrying traffic (has the default route)
|
||||
CONNECTED_INTERFACE=$(talosctl -n "$NODE_IP" get routes --insecure -o json 2>/dev/null | \
|
||||
jq -s -r '.[] | select(.spec.destination == "0.0.0.0/0" and .spec.gateway != null) | .spec.outLinkName' | \
|
||||
head -1)
|
||||
|
||||
if [ -n "$CONNECTED_INTERFACE" ]; then
|
||||
ACTIVE_INTERFACE="$CONNECTED_INTERFACE"
|
||||
echo "✅ Discovered connected interface (with default route): $ACTIVE_INTERFACE"
|
||||
else
|
||||
# Fallback: find any active ethernet interface
|
||||
echo "No default route found, checking for active ethernet interfaces..."
|
||||
ACTIVE_INTERFACE=$(talosctl -n "$NODE_IP" get links --insecure -o json 2>/dev/null | \
|
||||
jq -s -r '.[] | select(.spec.operationalState == "up" and .spec.type == "ether" and .metadata.id != "lo") | .metadata.id' | \
|
||||
head -1)
|
||||
|
||||
if [ -z "$ACTIVE_INTERFACE" ]; then
|
||||
echo "Error: No active ethernet interface found"
|
||||
echo "Available interfaces:"
|
||||
talosctl -n "$NODE_IP" get links --insecure
|
||||
echo ""
|
||||
echo "Available routes:"
|
||||
talosctl -n "$NODE_IP" get routes --insecure
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Discovered active interface: $ACTIVE_INTERFACE"
|
||||
fi
|
||||
|
||||
# Discover available disks
|
||||
echo "Discovering available disks..."
|
||||
AVAILABLE_DISKS=$(talosctl -n "$NODE_IP" get disks --insecure -o json 2>/dev/null | \
|
||||
jq -s -r '.[] | select(.spec.size > 10000000000) | .metadata.id' | \
|
||||
head -5)
|
||||
|
||||
if [ -z "$AVAILABLE_DISKS" ]; then
|
||||
echo "Error: No suitable disks found (must be >10GB)"
|
||||
echo "Available disks:"
|
||||
talosctl -n "$NODE_IP" get disks --insecure
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Available disks (>10GB):"
|
||||
echo "$AVAILABLE_DISKS"
|
||||
echo ""
|
||||
|
||||
# Let user choose disk
|
||||
echo "Select installation disk for node $NODE_NUMBER:"
|
||||
select INSTALL_DISK in $AVAILABLE_DISKS; do
|
||||
if [ -n "${INSTALL_DISK:-}" ]; then
|
||||
break
|
||||
fi
|
||||
echo "Invalid selection. Please try again."
|
||||
done
|
||||
|
||||
# Add /dev/ prefix if not present
|
||||
if [[ "$INSTALL_DISK" != /dev/* ]]; then
|
||||
INSTALL_DISK="/dev/$INSTALL_DISK"
|
||||
fi
|
||||
|
||||
echo "✅ Selected disk: $INSTALL_DISK"
|
||||
|
||||
# Update config.yaml with per-node configuration
|
||||
echo "Updating config.yaml with node $NODE_NUMBER configuration..."
|
||||
|
||||
CONFIG_FILE="${WC_HOME}/config.yaml"
|
||||
|
||||
# Get the target IP for this node from the existing config
|
||||
TARGET_IP=$(yq eval ".cluster.nodes.control.node${NODE_NUMBER}.ip" "$CONFIG_FILE")
|
||||
|
||||
# Use yq to update the per-node configuration
|
||||
yq eval ".cluster.nodes.control.node${NODE_NUMBER}.ip = \"$TARGET_IP\"" -i "$CONFIG_FILE"
|
||||
yq eval ".cluster.nodes.control.node${NODE_NUMBER}.interface = \"$ACTIVE_INTERFACE\"" -i "$CONFIG_FILE"
|
||||
yq eval ".cluster.nodes.control.node${NODE_NUMBER}.disk = \"$INSTALL_DISK\"" -i "$CONFIG_FILE"
|
||||
|
||||
echo "✅ Updated config.yaml for node $NODE_NUMBER:"
|
||||
echo " - Target IP: $TARGET_IP"
|
||||
echo " - Network interface: $ACTIVE_INTERFACE"
|
||||
echo " - Installation disk: $INSTALL_DISK"
|
||||
|
||||
|
||||
echo ""
|
||||
echo "🎉 Node $NODE_NUMBER registration complete!"
|
||||
echo ""
|
||||
echo "Node configuration saved:"
|
||||
echo " - Target IP: $TARGET_IP"
|
||||
echo " - Interface: $ACTIVE_INTERFACE"
|
||||
echo " - Disk: $INSTALL_DISK"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo "1. Regenerate machine configurations:"
|
||||
echo " ./generate-machine-configs.sh"
|
||||
echo ""
|
||||
echo "2. Apply configuration to this node:"
|
||||
echo " talosctl apply-config --insecure -n $NODE_IP --file final/controlplane-node-${NODE_NUMBER}.yaml"
|
||||
echo ""
|
||||
echo "3. Wait for reboot and verify static IP connectivity"
|
||||
echo "4. Repeat registration for additional control plane nodes"
|
@@ -1,115 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Talos machine configuration generation script
|
||||
# This script generates machine configs for registered nodes using existing cluster secrets
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Check if WC_HOME is set
|
||||
if [ -z "${WC_HOME:-}" ]; then
|
||||
echo "Error: WC_HOME environment variable not set. Run \`source ./env.sh\`."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
NODE_SETUP_DIR="${WC_HOME}/setup/cluster-nodes"
|
||||
|
||||
# Check if cluster has been initialized
|
||||
if [ ! -f "${NODE_SETUP_DIR}/generated/secrets.yaml" ]; then
|
||||
echo "Error: Cluster not initialized. Run ./init-cluster.sh first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get cluster configuration from config.yaml
|
||||
CLUSTER_NAME=$(wild-config cluster.name)
|
||||
VIP=$(wild-config cluster.nodes.control.vip)
|
||||
|
||||
echo "Generating machine configurations for cluster: $CLUSTER_NAME"
|
||||
|
||||
# Check which nodes have been registered (have hardware config)
|
||||
REGISTERED_NODES=()
|
||||
for i in 1 2 3; do
|
||||
if yq eval ".cluster.nodes.control.node${i}.interface" "${WC_HOME}/config.yaml" | grep -v "null" >/dev/null 2>&1; then
|
||||
NODE_IP=$(wild-config cluster.nodes.control.node${i}.ip)
|
||||
REGISTERED_NODES+=("$NODE_IP")
|
||||
echo "✅ Node $i registered: $NODE_IP"
|
||||
else
|
||||
echo "⏸️ Node $i not registered yet"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#REGISTERED_NODES[@]} -eq 0 ]; then
|
||||
echo ""
|
||||
echo "No nodes have been registered yet."
|
||||
echo "Run ./detect-node-hardware.sh <maintenance-ip> <node-number> first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create directories
|
||||
mkdir -p "${NODE_SETUP_DIR}/final" "${NODE_SETUP_DIR}/patch"
|
||||
|
||||
# Compile patch templates for registered nodes only
|
||||
echo "Compiling patch templates..."
|
||||
|
||||
for i in 1 2 3; do
|
||||
if yq eval ".cluster.nodes.control.node${i}.interface" "${WC_HOME}/config.yaml" | grep -v "null" >/dev/null 2>&1; then
|
||||
echo "Compiling template for control plane node $i..."
|
||||
cat "${NODE_SETUP_DIR}/patch.templates/controlplane-node-${i}.yaml" | wild-compile-template > "${NODE_SETUP_DIR}/patch/controlplane-node-${i}.yaml"
|
||||
fi
|
||||
done
|
||||
|
||||
# Always compile worker template (doesn't require hardware detection)
|
||||
if [ -f "${NODE_SETUP_DIR}/patch.templates/worker.yaml" ]; then
|
||||
cat "${NODE_SETUP_DIR}/patch.templates/worker.yaml" | wild-compile-template > "${NODE_SETUP_DIR}/patch/worker.yaml"
|
||||
fi
|
||||
|
||||
# Generate final machine configs for registered nodes only
|
||||
echo "Generating final machine configurations..."
|
||||
for i in 1 2 3; do
|
||||
if yq eval ".cluster.nodes.control.node${i}.interface" "${WC_HOME}/config.yaml" | grep -v "null" >/dev/null 2>&1; then
|
||||
echo "Generating config for control plane node $i..."
|
||||
talosctl machineconfig patch "${NODE_SETUP_DIR}/generated/controlplane.yaml" --patch @"${NODE_SETUP_DIR}/patch/controlplane-node-${i}.yaml" -o "${NODE_SETUP_DIR}/final/controlplane-node-${i}.yaml"
|
||||
fi
|
||||
done
|
||||
|
||||
# Always generate worker config (doesn't require hardware detection)
|
||||
if [ -f "${NODE_SETUP_DIR}/patch/worker.yaml" ]; then
|
||||
echo "Generating worker config..."
|
||||
talosctl machineconfig patch "${NODE_SETUP_DIR}/generated/worker.yaml" --patch @"${NODE_SETUP_DIR}/patch/worker.yaml" -o "${NODE_SETUP_DIR}/final/worker.yaml"
|
||||
fi
|
||||
|
||||
# Update talosctl context with registered nodes
|
||||
echo "Updating talosctl context..."
|
||||
if [ ${#REGISTERED_NODES[@]} -gt 0 ]; then
|
||||
talosctl config node "${REGISTERED_NODES[@]}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Machine configurations generated successfully!"
|
||||
echo ""
|
||||
echo "Generated configs:"
|
||||
for i in 1 2 3; do
|
||||
if [ -f "${NODE_SETUP_DIR}/final/controlplane-node-${i}.yaml" ]; then
|
||||
NODE_IP=$(wild-config cluster.nodes.control.node${i}.ip)
|
||||
echo " - ${NODE_SETUP_DIR}/final/controlplane-node-${i}.yaml (target IP: $NODE_IP)"
|
||||
fi
|
||||
done
|
||||
if [ -f "${NODE_SETUP_DIR}/final/worker.yaml" ]; then
|
||||
echo " - ${NODE_SETUP_DIR}/final/worker.yaml"
|
||||
fi
|
||||
echo ""
|
||||
echo "Current talosctl configuration:"
|
||||
talosctl config info
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo "1. Apply configurations to nodes in maintenance mode:"
|
||||
for i in 1 2 3; do
|
||||
if [ -f "${NODE_SETUP_DIR}/final/controlplane-node-${i}.yaml" ]; then
|
||||
echo " talosctl apply-config --insecure -n <maintenance-ip> --file ${NODE_SETUP_DIR}/final/controlplane-node-${i}.yaml"
|
||||
fi
|
||||
done
|
||||
echo ""
|
||||
echo "2. Wait for nodes to reboot with static IPs, then bootstrap cluster with ANY control node:"
|
||||
echo " talosctl bootstrap --nodes 192.168.8.31 --endpoint 192.168.8.31"
|
||||
echo ""
|
||||
echo "3. Get kubeconfig:"
|
||||
echo " talosctl kubeconfig"
|
20
setup/cluster-nodes/talos-schemas.yaml
Normal file
20
setup/cluster-nodes/talos-schemas.yaml
Normal file
@@ -0,0 +1,20 @@
|
||||
# Talos Version to Schematic ID Mappings
|
||||
#
|
||||
# This file contains mappings of Talos versions to their corresponding
|
||||
# default schematic IDs for wild-cloud deployments.
|
||||
#
|
||||
# Schematic IDs are generated from factory.talos.dev and include
|
||||
# common system extensions needed for typical hardware.
|
||||
#
|
||||
# To add new versions:
|
||||
# 1. Go to https://factory.talos.dev/
|
||||
# 2. Select the system extensions you need
|
||||
# 3. Generate the schematic
|
||||
# 4. Add the version and schematic ID below
|
||||
|
||||
# Format: "version": "schematic-id"
|
||||
talos-schemas:
|
||||
"v1.6.1": "e6230b0db3fd355a0bb77a9de74af41a9f3edd168f913cbd94807629a2116d07"
|
||||
# Add more versions here as needed
|
||||
# "v1.6.2": "example-schematic-id-here"
|
||||
# "v1.7.0": "example-schematic-id-here"
|
@@ -4,23 +4,12 @@
|
||||
|
||||
Congratulations! Everything you need for setting up and managing your wild-cloud is in this directory.
|
||||
|
||||
The first step is to set up your configuration and secrets.
|
||||
|
||||
```bash
|
||||
mv config.example.yaml config.yaml
|
||||
mv secrets.example.yaml secrets.yaml
|
||||
```
|
||||
|
||||
> Configuration instructions TBD.
|
||||
|
||||
Generate your custom setup:
|
||||
Just run:
|
||||
|
||||
```bash
|
||||
wild-setup
|
||||
```
|
||||
|
||||
Now, continue setup with your custom [setup instructions](./setup/README.md).
|
||||
|
||||
## Using your wild-cloud
|
||||
|
||||
### Installing Wild-Cloud apps
|
||||
|
Reference in New Issue
Block a user