mgmt/swarm/scripts/swarm-manager.sh

184 lines
4.5 KiB
Bash
Executable File

#!/bin/bash
# Docker Swarm 管理脚本
set -euo pipefail
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查是否在 Swarm 模式
check_swarm_mode() {
if docker info --format '{{.Swarm.LocalNodeState}}' | grep -q "active"; then
log_success "Docker Swarm 模式已激活"
return 0
else
log_error "Docker Swarm 模式未激活"
return 1
fi
}
# 初始化 Swarm
init_swarm() {
log_info "初始化 Docker Swarm..."
if docker swarm init; then
log_success "Docker Swarm 初始化成功"
log_info "要添加工作节点,请在其他主机上运行:"
docker swarm join-token worker
else
log_error "Docker Swarm 初始化失败"
return 1
fi
}
# 部署堆栈
deploy_stack() {
local stack_name="$1"
local compose_file="$2"
log_info "部署堆栈: $stack_name"
if [[ ! -f "$compose_file" ]]; then
log_error "Compose 文件不存在: $compose_file"
return 1
fi
if docker stack deploy -c "$compose_file" "$stack_name"; then
log_success "堆栈 $stack_name 部署成功"
else
log_error "堆栈 $stack_name 部署失败"
return 1
fi
}
# 列出堆栈
list_stacks() {
log_info "当前部署的堆栈:"
docker stack ls
}
# 查看堆栈服务
show_stack_services() {
local stack_name="$1"
log_info "堆栈 $stack_name 的服务:"
docker stack services "$stack_name"
}
# 删除堆栈
remove_stack() {
local stack_name="$1"
log_info "删除堆栈: $stack_name"
if docker stack rm "$stack_name"; then
log_success "堆栈 $stack_name 删除成功"
else
log_error "堆栈 $stack_name 删除失败"
return 1
fi
}
# 显示节点信息
show_nodes() {
log_info "Swarm 节点信息:"
docker node ls
}
# 显示帮助信息
show_help() {
echo "Docker Swarm 管理脚本"
echo ""
echo "用法: $0 [命令] [参数]"
echo ""
echo "命令:"
echo " init - 初始化 Docker Swarm"
echo " deploy <stack> <compose-file> - 部署堆栈"
echo " list - 列出所有堆栈"
echo " services <stack> - 查看堆栈服务"
echo " remove <stack> - 删除堆栈"
echo " nodes - 显示节点信息"
echo " check - 检查 Swarm 状态"
echo " help - 显示此帮助信息"
echo ""
echo "示例:"
echo " $0 init # 初始化 Swarm"
echo " $0 deploy traefik stacks/traefik-swarm-stack.yml"
echo " $0 deploy demo stacks/demo-services-stack.yml"
echo " $0 list # 列出堆栈"
echo " $0 services traefik # 查看 traefik 堆栈服务"
}
# 主函数
main() {
case "${1:-help}" in
"init")
init_swarm
;;
"deploy")
if [[ $# -lt 3 ]]; then
log_error "部署命令需要堆栈名称和 compose 文件"
echo "用法: $0 deploy <stack-name> <compose-file>"
exit 1
fi
check_swarm_mode || exit 1
deploy_stack "$2" "$3"
;;
"list")
check_swarm_mode || exit 1
list_stacks
;;
"services")
if [[ $# -lt 2 ]]; then
log_error "需要指定堆栈名称"
echo "用法: $0 services <stack-name>"
exit 1
fi
check_swarm_mode || exit 1
show_stack_services "$2"
;;
"remove")
if [[ $# -lt 2 ]]; then
log_error "需要指定堆栈名称"
echo "用法: $0 remove <stack-name>"
exit 1
fi
check_swarm_mode || exit 1
remove_stack "$2"
;;
"nodes")
check_swarm_mode || exit 1
show_nodes
;;
"check")
check_swarm_mode
;;
"help"|*)
show_help
;;
esac
}
# 运行主函数
main "$@"