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 "$@"
|