260 lines
7.3 KiB
Bash
260 lines
7.3 KiB
Bash
#!/bin/bash
|
|
|
|
# Operations Manager - 便捷的运维脚本管理工具
|
|
# 使用方法: ./ops-manager.sh [action] [target] [options]
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
PURPLE='\033[0;35m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 配置
|
|
ANSIBLE_DIR="$(dirname "$0")/../ansible"
|
|
INVENTORY="$ANSIBLE_DIR/inventory.ini"
|
|
|
|
# 可用的操作
|
|
declare -A OPERATIONS=(
|
|
["update"]="system-update.yml"
|
|
["cleanup"]="system-cleanup.yml"
|
|
["health"]="service-health-check.yml"
|
|
["security"]="security-hardening.yml"
|
|
["docker"]="docker-management.yml"
|
|
["network"]="network-connectivity.yml"
|
|
["cert"]="certificate-management.yml"
|
|
["toolkit"]="ops-toolkit.yml"
|
|
["cloud"]="cloud-providers-update.yml"
|
|
)
|
|
|
|
# 可用的目标组
|
|
declare -A TARGETS=(
|
|
["all"]="all"
|
|
["lxc"]="lxc"
|
|
["alpine"]="alpine"
|
|
["proxmox"]="proxmox"
|
|
["armbian"]="armbian"
|
|
["hcp"]="hcp"
|
|
["feiniu"]="feiniu"
|
|
["dev"]="dev"
|
|
["oci-kr"]="oci_kr"
|
|
["oci-us"]="oci_us"
|
|
["huawei"]="huawei"
|
|
["google"]="google"
|
|
["aws"]="aws"
|
|
["germany"]="germany"
|
|
)
|
|
|
|
# 显示帮助信息
|
|
show_help() {
|
|
echo -e "${CYAN}🛠️ Operations Manager - 运维脚本管理工具${NC}"
|
|
echo ""
|
|
echo -e "${YELLOW}使用方法:${NC}"
|
|
echo " $0 [操作] [目标] [选项]"
|
|
echo ""
|
|
echo -e "${YELLOW}可用操作:${NC}"
|
|
for op in "${!OPERATIONS[@]}"; do
|
|
echo -e " ${GREEN}$op${NC} - ${OPERATIONS[$op]}"
|
|
done
|
|
echo ""
|
|
echo -e "${YELLOW}可用目标:${NC}"
|
|
for target in "${!TARGETS[@]}"; do
|
|
echo -e " ${BLUE}$target${NC} - ${TARGETS[$target]}"
|
|
done
|
|
echo ""
|
|
echo -e "${YELLOW}示例:${NC}"
|
|
echo -e " $0 ${GREEN}update${NC} ${BLUE}lxc${NC} # 更新 LXC 容器"
|
|
echo -e " $0 ${GREEN}cleanup${NC} ${BLUE}all${NC} # 清理所有服务器"
|
|
echo -e " $0 ${GREEN}health${NC} ${BLUE}proxmox${NC} # 检查 Proxmox 健康状态"
|
|
echo -e " $0 ${GREEN}docker${NC} ${BLUE}lxc${NC} # 管理 LXC 中的 Docker"
|
|
echo -e " $0 ${GREEN}toolkit${NC} ${BLUE}germany${NC} # 运行德国服务器工具包"
|
|
echo ""
|
|
echo -e "${YELLOW}选项:${NC}"
|
|
echo -e " ${PURPLE}--dry-run${NC} 仅显示将要执行的命令"
|
|
echo -e " ${PURPLE}--verbose${NC} 显示详细输出"
|
|
echo -e " ${PURPLE}--check${NC} 检查模式(不做实际更改)"
|
|
echo -e " ${PURPLE}--help${NC} 显示此帮助信息"
|
|
}
|
|
|
|
# 显示状态信息
|
|
show_status() {
|
|
echo -e "${CYAN}📊 系统状态概览${NC}"
|
|
echo ""
|
|
|
|
# 检查 Ansible 是否可用
|
|
if command -v ansible >/dev/null 2>&1; then
|
|
echo -e "${GREEN}✅ Ansible 已安装${NC}"
|
|
else
|
|
echo -e "${RED}❌ Ansible 未安装${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查 inventory 文件
|
|
if [ -f "$INVENTORY" ]; then
|
|
echo -e "${GREEN}✅ Inventory 文件存在${NC}"
|
|
echo -e " 📁 路径: $INVENTORY"
|
|
else
|
|
echo -e "${RED}❌ Inventory 文件不存在${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# 显示可用的主机组
|
|
echo ""
|
|
echo -e "${YELLOW}📋 可用主机组:${NC}"
|
|
ansible-inventory -i "$INVENTORY" --list | jq -r 'keys[]' | grep -v "_meta" | sort | while read group; do
|
|
count=$(ansible-inventory -i "$INVENTORY" --list | jq -r ".[\"$group\"].hosts // [] | length")
|
|
echo -e " ${BLUE}$group${NC}: $count 台主机"
|
|
done
|
|
}
|
|
|
|
# 执行 Ansible 命令
|
|
run_ansible() {
|
|
local operation=$1
|
|
local target=$2
|
|
local options=$3
|
|
|
|
local playbook="${OPERATIONS[$operation]}"
|
|
local host_pattern="${TARGETS[$target]}"
|
|
|
|
if [ -z "$playbook" ]; then
|
|
echo -e "${RED}❌ 未知操作: $operation${NC}"
|
|
show_help
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$host_pattern" ]; then
|
|
echo -e "${RED}❌ 未知目标: $target${NC}"
|
|
show_help
|
|
exit 1
|
|
fi
|
|
|
|
local ansible_cmd="ansible-playbook -i $INVENTORY $ANSIBLE_DIR/$playbook --limit $host_pattern"
|
|
|
|
# 添加选项
|
|
if [[ "$options" == *"--check"* ]]; then
|
|
ansible_cmd="$ansible_cmd --check"
|
|
fi
|
|
|
|
if [[ "$options" == *"--verbose"* ]]; then
|
|
ansible_cmd="$ansible_cmd -v"
|
|
fi
|
|
|
|
echo -e "${CYAN}🚀 执行操作${NC}"
|
|
echo -e "操作: ${GREEN}$operation${NC} ($playbook)"
|
|
echo -e "目标: ${BLUE}$target${NC} ($host_pattern)"
|
|
echo -e "命令: ${PURPLE}$ansible_cmd${NC}"
|
|
echo ""
|
|
|
|
if [[ "$options" == *"--dry-run"* ]]; then
|
|
echo -e "${YELLOW}🔍 DRY RUN 模式 - 仅显示命令,不执行${NC}"
|
|
return 0
|
|
fi
|
|
|
|
# 确认执行
|
|
read -p "确认执行? (y/N): " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
echo -e "${YELLOW}⏹️ 操作已取消${NC}"
|
|
exit 0
|
|
fi
|
|
|
|
echo -e "${GREEN}▶️ 开始执行...${NC}"
|
|
eval $ansible_cmd
|
|
}
|
|
|
|
# 快速操作菜单
|
|
interactive_mode() {
|
|
echo -e "${CYAN}🎯 交互式运维管理${NC}"
|
|
echo ""
|
|
|
|
# 选择操作
|
|
echo -e "${YELLOW}选择操作:${NC}"
|
|
local ops=($(printf '%s\n' "${!OPERATIONS[@]}" | sort))
|
|
for i in "${!ops[@]}"; do
|
|
echo -e " $((i+1)). ${GREEN}${ops[i]}${NC} - ${OPERATIONS[${ops[i]}]}"
|
|
done
|
|
|
|
read -p "请选择操作 (1-${#ops[@]}): " op_choice
|
|
if [[ ! "$op_choice" =~ ^[0-9]+$ ]] || [ "$op_choice" -lt 1 ] || [ "$op_choice" -gt "${#ops[@]}" ]; then
|
|
echo -e "${RED}❌ 无效选择${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
local selected_op="${ops[$((op_choice-1))]}"
|
|
|
|
# 选择目标
|
|
echo ""
|
|
echo -e "${YELLOW}选择目标:${NC}"
|
|
local targets=($(printf '%s\n' "${!TARGETS[@]}" | sort))
|
|
for i in "${!targets[@]}"; do
|
|
echo -e " $((i+1)). ${BLUE}${targets[i]}${NC} - ${TARGETS[${targets[i]}]}"
|
|
done
|
|
|
|
read -p "请选择目标 (1-${#targets[@]}): " target_choice
|
|
if [[ ! "$target_choice" =~ ^[0-9]+$ ]] || [ "$target_choice" -lt 1 ] || [ "$target_choice" -gt "${#targets[@]}" ]; then
|
|
echo -e "${RED}❌ 无效选择${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
local selected_target="${targets[$((target_choice-1))]}"
|
|
|
|
# 选择选项
|
|
echo ""
|
|
echo -e "${YELLOW}选择执行选项:${NC}"
|
|
echo -e " 1. ${GREEN}正常执行${NC}"
|
|
echo -e " 2. ${PURPLE}检查模式${NC} (--check)"
|
|
echo -e " 3. ${PURPLE}详细输出${NC} (--verbose)"
|
|
echo -e " 4. ${PURPLE}仅显示命令${NC} (--dry-run)"
|
|
|
|
read -p "请选择选项 (1-4): " option_choice
|
|
|
|
local options=""
|
|
case $option_choice in
|
|
2) options="--check" ;;
|
|
3) options="--verbose" ;;
|
|
4) options="--dry-run" ;;
|
|
esac
|
|
|
|
run_ansible "$selected_op" "$selected_target" "$options"
|
|
}
|
|
|
|
# 主程序
|
|
main() {
|
|
# 检查参数
|
|
if [ $# -eq 0 ]; then
|
|
interactive_mode
|
|
exit 0
|
|
fi
|
|
|
|
case "$1" in
|
|
--help|-h|help)
|
|
show_help
|
|
;;
|
|
--status|-s|status)
|
|
show_status
|
|
;;
|
|
--interactive|-i|interactive)
|
|
interactive_mode
|
|
;;
|
|
*)
|
|
if [ $# -lt 2 ]; then
|
|
echo -e "${RED}❌ 参数不足${NC}"
|
|
show_help
|
|
exit 1
|
|
fi
|
|
|
|
local operation=$1
|
|
local target=$2
|
|
local options="${@:3}"
|
|
|
|
run_ansible "$operation" "$target" "$options"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# 执行主程序
|
|
main "$@" |