201 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/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 "$@"
 |