372 lines
11 KiB
Plaintext
Executable File
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 ""
|
|
}
|