Files
k3s_auto_deploy/scripts/deploy-all.sh

334 lines
8.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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