mgmt/infrastructure/consul/deploy-consul-configs.sh

201 lines
5.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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