334 lines
8.2 KiB
Bash
Executable File
334 lines
8.2 KiB
Bash
Executable File
#!/bin/bash
|
||
set -euo pipefail
|
||
|
||
# Load common functions
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||
|
||
# Source common library
|
||
source "$SCRIPT_DIR/lib/common.sh"
|
||
|
||
# Configuration
|
||
CONFIG_FILE="$PROJECT_DIR/config/cluster-vars.yml"
|
||
|
||
# Step definitions
|
||
STEPS=(
|
||
"check_prerequisites:检查前置条件"
|
||
"generate_inventory:生成Ansible Inventory"
|
||
"deploy_k3s:部署K3s集群"
|
||
"deploy_gitea:部署Gitea"
|
||
"setup_gitea:初始化Gitea"
|
||
"deploy_argocd:部署ArgoCD"
|
||
"deploy_https:配置HTTPS"
|
||
"create_demo_app:创建示例应用"
|
||
)
|
||
|
||
# Step functions
|
||
check_prerequisites() {
|
||
log_step "检查前置条件"
|
||
|
||
# Check configuration file
|
||
check_config_file "$CONFIG_FILE" || return 1
|
||
|
||
# Check required tools
|
||
check_required_tools || return 1
|
||
|
||
# Check network connectivity
|
||
check_network_with_retry "https://www.google.com" 3 || {
|
||
log_warn "Network connectivity check failed, but continuing..."
|
||
}
|
||
|
||
# Install Python YAML library
|
||
if ! python3 -c "import yaml" 2>/dev/null; then
|
||
log "Installing python3-yaml..."
|
||
sudo apt update && sudo apt install -y python3-yaml
|
||
fi
|
||
|
||
log "✓ All prerequisites checked"
|
||
return 0
|
||
}
|
||
|
||
generate_inventory() {
|
||
log_step "生成Ansible Inventory"
|
||
|
||
if [ ! -f "$SCRIPT_DIR/generate-inventory.py" ]; then
|
||
log_error "generate-inventory.py not found"
|
||
return 1
|
||
fi
|
||
|
||
cd "$PROJECT_DIR"
|
||
python3 "$SCRIPT_DIR/generate-inventory.py" || return 1
|
||
|
||
log "✓ Ansible inventory generated"
|
||
return 0
|
||
}
|
||
|
||
deploy_k3s() {
|
||
log_step "部署K3s集群"
|
||
|
||
if [ ! -d "$PROJECT_DIR/k3s-ansible" ]; then
|
||
log "Cloning k3s-ansible repository..."
|
||
cd "$PROJECT_DIR"
|
||
git clone https://github.com/k3s-io/k3s-ansible.git || return 1
|
||
fi
|
||
|
||
# Check if kubectl is already available and cluster is running
|
||
if check_kubectl; then
|
||
log "K3s cluster is already running, skipping deployment"
|
||
return 0
|
||
fi
|
||
|
||
log "Running Ansible playbook..."
|
||
cd "$PROJECT_DIR/k3s-ansible"
|
||
|
||
ansible-playbook site.yml \
|
||
-i inventory/hosts.ini \
|
||
-e "@$CONFIG_FILE" || return 1
|
||
|
||
# Configure kubectl
|
||
log "Configuring kubectl..."
|
||
mkdir -p ~/.kube
|
||
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
|
||
sudo chown $USER:$USER ~/.kube/config
|
||
|
||
# Verify cluster
|
||
log "Verifying cluster..."
|
||
sleep 10
|
||
kubectl get nodes || return 1
|
||
|
||
log "✓ K3s cluster deployed successfully"
|
||
return 0
|
||
}
|
||
|
||
deploy_gitea() {
|
||
log_step "部署Gitea"
|
||
|
||
if [ ! -f "$SCRIPT_DIR/deploy-gitea.sh" ]; then
|
||
log_error "deploy-gitea.sh not found"
|
||
return 1
|
||
fi
|
||
|
||
# Check if Gitea is already deployed
|
||
if kubectl get namespace gitea &>/dev/null && \
|
||
kubectl get deployment gitea -n gitea &>/dev/null 2>&1; then
|
||
log "Gitea is already deployed, skipping"
|
||
return 0
|
||
fi
|
||
|
||
bash "$SCRIPT_DIR/deploy-gitea.sh" || return 1
|
||
|
||
log "✓ Gitea deployed successfully"
|
||
return 0
|
||
}
|
||
|
||
setup_gitea() {
|
||
log_step "初始化Gitea"
|
||
|
||
if [ ! -f "$SCRIPT_DIR/setup-gitea.sh" ]; then
|
||
log_error "setup-gitea.sh not found"
|
||
return 1
|
||
fi
|
||
|
||
bash "$SCRIPT_DIR/setup-gitea.sh" || return 1
|
||
|
||
log "✓ Gitea initialized successfully"
|
||
return 0
|
||
}
|
||
|
||
deploy_argocd() {
|
||
log_step "部署ArgoCD"
|
||
|
||
if [ ! -f "$SCRIPT_DIR/deploy-argocd.sh" ]; then
|
||
log_error "deploy-argocd.sh not found"
|
||
return 1
|
||
fi
|
||
|
||
# Check if ArgoCD is already deployed
|
||
if kubectl get namespace argocd &>/dev/null && \
|
||
kubectl get deployment argocd-server -n argocd &>/dev/null 2>&1; then
|
||
log "ArgoCD is already deployed, skipping"
|
||
return 0
|
||
fi
|
||
|
||
bash "$SCRIPT_DIR/deploy-argocd.sh" || return 1
|
||
|
||
log "✓ ArgoCD deployed successfully"
|
||
return 0
|
||
}
|
||
|
||
deploy_https() {
|
||
log_step "配置HTTPS"
|
||
|
||
if [ ! -f "$SCRIPT_DIR/deploy-https.sh" ]; then
|
||
log_warn "deploy-https.sh not found, skipping HTTPS configuration"
|
||
return 0
|
||
fi
|
||
|
||
bash "$SCRIPT_DIR/deploy-https.sh" || {
|
||
log_warn "HTTPS configuration failed, but continuing..."
|
||
return 0
|
||
}
|
||
|
||
log "✓ HTTPS configured successfully"
|
||
return 0
|
||
}
|
||
|
||
create_demo_app() {
|
||
log_step "创建示例应用"
|
||
|
||
if [ ! -f "$SCRIPT_DIR/create-argocd-app.sh" ]; then
|
||
log_warn "create-argocd-app.sh not found, skipping demo app creation"
|
||
return 0
|
||
fi
|
||
|
||
bash "$SCRIPT_DIR/create-argocd-app.sh" || {
|
||
log_warn "Demo app creation failed, but continuing..."
|
||
return 0
|
||
}
|
||
|
||
log "✓ Demo app created successfully"
|
||
return 0
|
||
}
|
||
|
||
# Execute step
|
||
execute_step() {
|
||
local step_name="$1"
|
||
|
||
if type "$step_name" &>/dev/null; then
|
||
"$step_name"
|
||
return $?
|
||
else
|
||
log_error "Step function not found: $step_name"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Main function
|
||
main() {
|
||
echo "=========================================="
|
||
echo " K3s集群自动化部署"
|
||
echo "=========================================="
|
||
echo ""
|
||
|
||
log "开始部署流程"
|
||
log "日志文件: $LOG_FILE"
|
||
log "状态文件: $STATE_FILE"
|
||
echo ""
|
||
|
||
local failed_steps=()
|
||
local completed_steps=()
|
||
local skipped_steps=()
|
||
|
||
for step in "${STEPS[@]}"; do
|
||
step_name="${step%%:*}"
|
||
step_desc="${step##*:}"
|
||
|
||
echo ""
|
||
echo "=========================================="
|
||
|
||
if is_step_completed "$step_name"; then
|
||
log "✓ 跳过已完成的步骤: $step_desc"
|
||
skipped_steps+=("$step_desc")
|
||
continue
|
||
fi
|
||
|
||
log_step "执行步骤: $step_desc"
|
||
|
||
if execute_step "$step_name"; then
|
||
mark_step_completed "$step_name"
|
||
log "✓ 完成: $step_desc"
|
||
completed_steps+=("$step_desc")
|
||
else
|
||
log_error "✗ 失败: $step_desc"
|
||
failed_steps+=("$step_desc")
|
||
|
||
echo ""
|
||
echo "=========================================="
|
||
echo " 部署失败"
|
||
echo "=========================================="
|
||
echo ""
|
||
log_error "步骤失败: $step_desc"
|
||
log_error "请检查日志文件: $LOG_FILE"
|
||
log_error "修复问题后,可以重新运行此脚本继续部署"
|
||
echo ""
|
||
|
||
print_summary
|
||
echo "已完成步骤: ${#completed_steps[@]}"
|
||
for s in "${completed_steps[@]}"; do
|
||
echo " ✓ $s"
|
||
done
|
||
echo ""
|
||
echo "跳过步骤: ${#skipped_steps[@]}"
|
||
for s in "${skipped_steps[@]}"; do
|
||
echo " - $s"
|
||
done
|
||
echo ""
|
||
echo "失败步骤: ${#failed_steps[@]}"
|
||
for s in "${failed_steps[@]}"; do
|
||
echo " ✗ $s"
|
||
done
|
||
echo ""
|
||
|
||
exit 1
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "=========================================="
|
||
echo " 部署完成!"
|
||
echo "=========================================="
|
||
echo ""
|
||
|
||
print_summary
|
||
echo "总步骤数: ${#STEPS[@]}"
|
||
echo "已完成: ${#completed_steps[@]}"
|
||
echo "已跳过: ${#skipped_steps[@]}"
|
||
echo ""
|
||
|
||
if [ ${#completed_steps[@]} -gt 0 ]; then
|
||
echo "本次完成的步骤:"
|
||
for s in "${completed_steps[@]}"; do
|
||
echo " ✓ $s"
|
||
done
|
||
echo ""
|
||
fi
|
||
|
||
if [ ${#skipped_steps[@]} -gt 0 ]; then
|
||
echo "跳过的步骤:"
|
||
for s in "${skipped_steps[@]}"; do
|
||
echo " - $s"
|
||
done
|
||
echo ""
|
||
fi
|
||
|
||
log "✓ K3s集群部署完成!"
|
||
echo ""
|
||
echo "下一步操作:"
|
||
echo " 1. 验证部署: ./scripts/verify-deployment.sh"
|
||
echo " 2. 查看集群状态: kubectl get nodes"
|
||
echo " 3. 查看所有Pod: kubectl get pods -A"
|
||
echo ""
|
||
}
|
||
|
||
# Handle script arguments
|
||
case "${1:-}" in
|
||
--reset)
|
||
log "重置部署状态..."
|
||
reset_deployment_state
|
||
log "状态已重置,可以重新开始部署"
|
||
exit 0
|
||
;;
|
||
--help|-h)
|
||
echo "用法: $0 [选项]"
|
||
echo ""
|
||
echo "选项:"
|
||
echo " --reset 重置部署状态,从头开始"
|
||
echo " --help 显示此帮助信息"
|
||
echo ""
|
||
exit 0
|
||
;;
|
||
esac
|
||
|
||
# Run main function
|
||
main
|