2025-10-07 11:05:08 +01:00

372 lines
11 KiB
Plaintext
Executable File

#!/usr/bin/env nu
# Kubernetes Taskserv Self-Install Script
#
# Queries MCP for settings, generates installer config, and runs unattended installation
# Suitable for: Automated deployment, CI/CD pipelines, infrastructure as code
def main [
--mcp-url: string = "http://localhost:8084" # MCP server URL
--workspace: string = "default" # Workspace name
--infra: string = "default" # Infrastructure name
--platform: string = "Docker" # Deployment platform
--domain: string = "localhost" # Domain/hostname
--webhook-url: string = "" # Webhook URL for notifications
--config-output: string = "" # Save config to file (optional)
--dry-run # Generate config only, don't install
] {
print "🔧 Kubernetes Taskserv Self-Install"
print $" Workspace: ($workspace)"
print $" Infrastructure: ($infra)"
print $" Platform: ($platform)"
print ""
# Step 1: Query MCP for settings
print "📡 Querying MCP server for configuration..."
let mcp_config = try {
query_mcp_settings $mcp_url $workspace $infra
} catch {
print $"❌ Failed to query MCP server at ($mcp_url)"
print " Ensure MCP server is running and accessible"
return 1
}
print $" ✅ Retrieved configuration from MCP"
print ""
# Step 2: Resolve dependencies
print "🔍 Resolving dependencies for Kubernetes..."
let dependencies = resolve_dependencies $mcp_config
if ($dependencies | length) > 0 {
print $" Dependencies found: ($dependencies | str join ', ')"
} else {
print " No dependencies required"
}
print ""
# Step 3: Generate installer configuration
print "📝 Generating installer configuration..."
let installer_config = generate_installer_config $mcp_config $platform $domain $webhook_url $dependencies
# Save config if requested
if $config_output != "" {
$installer_config | save -f $config_output
print $" 💾 Configuration saved to: ($config_output)"
}
print " ✅ Configuration generated"
print ""
# Step 4: Display configuration summary
print "📋 Configuration Summary:"
print $" Platform: ($installer_config.deployment.platform)"
print $" Mode: ($installer_config.deployment.mode)"
print $" Domain: ($installer_config.deployment.domain)"
print $" Services: ($installer_config.deployment.services | length) services"
print $" Auto-generate secrets: ($installer_config.deployment.auto_generate_secrets)"
if ($installer_config.notifications? | is-not-empty) {
print $" Notifications: Enabled (($installer_config.notifications.webhook_url))"
} else {
print " Notifications: Disabled"
}
print ""
# Step 5: Run installer in unattended mode
if $dry_run {
print "🔍 Dry-run mode - skipping installation"
print " To install, run without --dry-run flag"
return 0
}
print "🚀 Starting unattended installation..."
print ""
let config_file = $"/tmp/kubernetes-install-(date now | format date '%Y%m%d-%H%M%S').toml"
$installer_config | save -f $config_file
try {
run_unattended_installer $config_file
} catch {
print "❌ Installation failed"
print $" Config file saved at: ($config_file)"
return 1
}
# Cleanup temp config
rm -f $config_file
print ""
print "🎉 Kubernetes taskserv installed successfully!"
print ""
print "Next steps:"
print " • Verify installation: kubectl get pods -n provisioning"
print " • Check cluster status: provisioning cluster list"
print " • Access dashboard: provisioning orchestrator health"
print ""
return 0
}
# Query MCP server for configuration settings
def query_mcp_settings [mcp_url: string, workspace: string, infra: string] {
let response = http get $"($mcp_url)/api/v1/config/($workspace)/($infra)/kubernetes"
if ($response | is-empty) {
error make {msg: "Empty response from MCP server"}
}
return $response
}
# Resolve taskserv dependencies
def resolve_dependencies [config: record] {
let required_deps = [
"containerd"
"etcd"
]
let optional_deps = [
"cilium"
"helm"
]
# Check which dependencies are enabled in config
let enabled_optional = $optional_deps | filter {|dep|
($config.dependencies? | get -i $dep | default false)
}
return ($required_deps | append $enabled_optional)
}
# Generate installer configuration from MCP settings
def generate_installer_config [
mcp_config: record
platform: string
domain: string
webhook_url: string
dependencies: list
] {
# Base configuration
mut config = {
installation_id: $"kubernetes-($mcp_config.version?)-((date now | format date '%Y%m%d-%H%M%S'))"
verbose: ($mcp_config.verbose? | default false)
fail_fast: true
cleanup_on_failure: true
provisioning_path: "/usr/local/bin/provisioning"
work_dir: "~/.provisioning"
deployment: {
platform: $platform
mode: "CICD"
domain: $domain
auto_generate_secrets: true
services: []
}
env_vars: {}
}
# Add core services
$config.deployment.services = [
{
name: "orchestrator"
description: "Task coordination engine"
port: 8080
enabled: true
required: true
}
{
name: "control-center"
description: "Web UI dashboard"
port: 8081
enabled: true
required: true
}
{
name: "coredns"
description: "DNS service"
port: 5353
enabled: true
required: true
}
]
# Add Kubernetes-specific services
$config.deployment.services = ($config.deployment.services | append [
{
name: "kubernetes"
description: "Kubernetes cluster"
port: 6443
enabled: true
required: true
}
])
# Add dependency services
for dep in $dependencies {
let service = match $dep {
"containerd" => {
name: "containerd"
description: "Container runtime"
port: 0
enabled: true
required: true
}
"etcd" => {
name: "etcd"
description: "Distributed key-value store"
port: 2379
enabled: true
required: true
}
"cilium" => {
name: "cilium"
description: "Network plugin"
port: 0
enabled: true
required: false
}
"helm" => {
name: "helm"
description: "Package manager"
port: 0
enabled: true
required: false
}
_ => null
}
if ($service | is-not-empty) {
$config.deployment.services = ($config.deployment.services | append [$service])
}
}
# Add webhook notifications if provided
if $webhook_url != "" {
$config.notifications = {
webhook_url: $webhook_url
notify_progress: true
notify_completion: true
notify_failure: true
retry_attempts: 3
headers: {
"Content-Type": "application/json"
}
}
}
# Add environment variables from MCP config
if ($mcp_config.env? | is-not-empty) {
$config.env_vars = $mcp_config.env
}
# Add Kubernetes-specific environment variables
$config.env_vars = ($config.env_vars | merge {
LOG_LEVEL: "info"
PROVISIONING_MODE: "kubernetes"
K8S_VERSION: ($mcp_config.version? | default "1.28.0")
ENABLE_DEBUG: "false"
})
return $config
}
# Run the provisioning installer in unattended mode
def run_unattended_installer [config_file: string] {
let installer_path = which provisioning-installer | get path.0?
if ($installer_path | is-empty) {
error make {msg: "provisioning-installer not found in PATH"}
}
print $" Running: ($installer_path) --unattended --config ($config_file)"
print ""
# Run the installer
let result = run-external $installer_path "--unattended" "--config" $config_file
return $result
}
# Helper: Generate a sample config for reference
def "main sample" [
--output: string = "kubernetes-install-sample.toml" # Output file path
] {
print $"📝 Generating sample Kubernetes installation config..."
let sample_config = {
installation_id: "kubernetes-1.28.0-sample"
verbose: true
fail_fast: true
cleanup_on_failure: true
provisioning_path: "/usr/local/bin/provisioning"
work_dir: "~/.provisioning"
deployment: {
platform: "Docker"
mode: "CICD"
domain: "k8s.local"
auto_generate_secrets: true
services: [
{
name: "orchestrator"
description: "Task coordination engine"
port: 8080
enabled: true
required: true
}
{
name: "control-center"
description: "Web UI dashboard"
port: 8081
enabled: true
required: true
}
{
name: "kubernetes"
description: "Kubernetes cluster"
port: 6443
enabled: true
required: true
}
{
name: "containerd"
description: "Container runtime"
port: 0
enabled: true
required: true
}
{
name: "etcd"
description: "Distributed key-value store"
port: 2379
enabled: true
required: true
}
]
}
notifications: {
webhook_url: "https://example.com/webhook"
notify_progress: true
notify_completion: true
notify_failure: true
retry_attempts: 3
headers: {
"Content-Type": "application/json"
}
}
env_vars: {
LOG_LEVEL: "info"
PROVISIONING_MODE: "kubernetes"
K8S_VERSION: "1.28.0"
ENABLE_DEBUG: "false"
}
}
$sample_config | to toml | save -f $output
print $" ✅ Sample config saved to: ($output)"
print ""
print "Usage:"
print $" provisioning-installer --unattended --config ($output)"
print ""
}