#!/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 "$@"