#!/bin/bash # Consul配置批量部署脚本 set -e CONSUL_DIR="/root/mgmt/infrastructure/consul" BASELINE_DIR="$CONSUL_DIR/baseline" DEPLOYED_DIR="$CONSUL_DIR/deployed" LOGS_DIR="$CONSUL_DIR/logs" # 节点配置映射 declare -A NODE_IPS NODE_IPS[ch4]="100.117.106.136" NODE_IPS[ash3c]="100.116.80.94" NODE_IPS[warden]="100.122.197.112" NODE_IPS[ash1d]="100.98.209.50" NODE_IPS[ash2e]="100.98.209.51" NODE_IPS[ch2]="100.117.106.135" NODE_IPS[ch3]="100.117.106.137" NODE_IPS[de]="100.98.209.52" NODE_IPS[onecloud1]="100.98.209.53" NODE_IPS[semaphore]="100.98.209.54" NODE_IPS[browser]="100.116.112.45" NODE_IPS[hcp1]="100.116.112.46" NODE_IPS[influxdb]="100.116.112.47" NODE_IPS[brother]="100.116.112.48" # 服务器节点列表 SERVER_NODES=("ch4" "ash3c" "warden") CLIENT_NODES=("ash1d" "ash2e" "ch2" "ch3" "de" "onecloud1" "semaphore" "browser" "hcp1" "influxdb") # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log() { echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" >&2 } success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } # 创建必要目录 create_dirs() { mkdir -p "$LOGS_DIR" "$DEPLOYED_DIR" } # 生成节点配置 generate_config() { local node=$1 local node_type=$2 local bind_addr=${NODE_IPS[$node]} if [ -z "$bind_addr" ]; then error "未找到节点 $node 的IP地址" return 1 fi local template_file if [ "$node_type" = "server" ]; then template_file="$BASELINE_DIR/consul-server.hcl" else template_file="$BASELINE_DIR/consul-client.hcl" fi local output_file="$DEPLOYED_DIR/${node}-consul.hcl" log "生成 $node 的Consul配置" # 替换模板变量 sed "s/{{NODE_NAME}}/$node/g; s/{{BIND_ADDR}}/$bind_addr/g; s/{{ENCRYPT_KEY}}/placeholder/g" "$template_file" > "$output_file" success "配置生成完成: $output_file" } # 部署配置到节点 deploy_config() { local node=$1 local config_file="$DEPLOYED_DIR/${node}-consul.hcl" log "部署 $node 的Consul配置" # 备份现有配置 sshpass -p '3131' ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ben@"$node.tailnet-68f9.ts.net" " if [ -f /etc/consul.d/consul.hcl ]; then echo '3131' | sudo -S cp /etc/consul.d/consul.hcl /etc/consul.d/consul.hcl.backup.\$(date +%Y%m%d_%H%M%S) fi " 2>/dev/null || warning "无法备份 $node 的现有配置" # 上传新配置 sshpass -p '3131' scp -o StrictHostKeyChecking=no -o ConnectTimeout=10 "$config_file" ben@"$node.tailnet-68f9.ts.net":/tmp/consul-new.hcl # 替换配置文件 sshpass -p '3131' ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ben@"$node.tailnet-68f9.ts.net" " echo '3131' | sudo -S mkdir -p /etc/consul.d echo '3131' | sudo -S cp /tmp/consul-new.hcl /etc/consul.d/consul.hcl echo '3131' | sudo -S chown consul:consul /etc/consul.d/consul.hcl echo '3131' | sudo -S chmod 644 /etc/consul.d/consul.hcl rm -f /tmp/consul-new.hcl " success "配置部署完成: $node" } # 重启Consul服务 restart_consul() { local node=$1 log "重启 $node 的Consul服务" sshpass -p '3131' ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ben@"$node.tailnet-68f9.ts.net" " echo '3131' | sudo -S systemctl restart consul sleep 3 echo '3131' | sudo -S systemctl status consul --no-pager " success "Consul服务重启完成: $node" } # 主函数 main() { local target_node=${1:-"all"} log "开始批量部署Consul配置" log "目标节点: $target_node" create_dirs # 处理服务器节点 if [ "$target_node" = "all" ] || [ "$target_node" = "servers" ]; then log "处理服务器节点" for node in "${SERVER_NODES[@]}"; do generate_config "$node" "server" deploy_config "$node" restart_consul "$node" done fi # 处理客户端节点 if [ "$target_node" = "all" ] || [ "$target_node" = "clients" ]; then log "处理客户端节点" for node in "${CLIENT_NODES[@]}"; do generate_config "$node" "client" deploy_config "$node" restart_consul "$node" done fi # 处理特定节点 if [ "$target_node" != "all" ] && [ "$target_node" != "servers" ] && [ "$target_node" != "clients" ]; then local node_type="client" for server_node in "${SERVER_NODES[@]}"; do if [ "$target_node" = "$server_node" ]; then node_type="server" break fi done generate_config "$target_node" "$node_type" deploy_config "$target_node" restart_consul "$target_node" fi success "Consul配置批量部署完成!" } # 显示帮助 show_help() { echo "使用方法: $0 [节点名|all|servers|clients]" echo "" echo "参数:" echo " all - 部署所有节点 (默认)" echo " servers - 只部署服务器节点" echo " clients - 只部署客户端节点" echo " 节点名 - 部署特定节点" echo "" echo "示例:" echo " $0 # 部署所有节点" echo " $0 servers # 只部署服务器节点" echo " $0 ch4 # 只部署ch4节点" } if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then show_help exit 0 fi main "$@"