mgmt/scripts/deployment/deploy-consul-cluster.sh

104 lines
3.0 KiB
Bash
Executable File

#!/bin/bash
# Consul 集群部署脚本
# 使用 Ansible 在物理机上部署 Consul 集群
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
INVENTORY_FILE="$PROJECT_ROOT/configuration/inventories/production/consul-cluster.ini"
PLAYBOOK_FILE="$PROJECT_ROOT/configuration/playbooks/applications/consul-cluster.yml"
echo "=== Consul 集群部署脚本 ==="
echo "项目根目录: $PROJECT_ROOT"
echo "清单文件: $INVENTORY_FILE"
echo "Playbook: $PLAYBOOK_FILE"
echo
# 检查必要文件
if [[ ! -f "$INVENTORY_FILE" ]]; then
echo "错误: 清单文件不存在: $INVENTORY_FILE"
exit 1
fi
if [[ ! -f "$PLAYBOOK_FILE" ]]; then
echo "错误: Playbook 文件不存在: $PLAYBOOK_FILE"
exit 1
fi
# 生成 Consul 加密密钥(如果需要)
echo "1. 检查 Consul 加密密钥..."
if grep -q "YOUR_BASE64_ENCRYPT_KEY_HERE" "$INVENTORY_FILE"; then
echo "需要生成 Consul 加密密钥..."
# 尝试使用已安装的 consul 生成密钥
if command -v consul &> /dev/null; then
ENCRYPT_KEY=$(consul keygen)
echo "生成的加密密钥: $ENCRYPT_KEY"
# 替换清单文件中的占位符
sed -i "s/YOUR_BASE64_ENCRYPT_KEY_HERE/$ENCRYPT_KEY/" "$INVENTORY_FILE"
echo "已更新清单文件中的加密密钥"
else
echo "警告: 未找到 consul 命令,请手动生成加密密钥并更新清单文件"
echo "可以使用以下命令生成: consul keygen"
echo "或者使用在线工具生成 32 字节的 base64 编码密钥"
fi
fi
# 测试连接
echo
echo "2. 测试目标主机连接..."
ansible -i "$INVENTORY_FILE" consul_cluster -m ping
if [[ $? -ne 0 ]]; then
echo "错误: 无法连接到目标主机,请检查清单文件中的连接信息"
exit 1
fi
# 显示部署信息
echo
echo "3. 部署信息:"
echo "目标主机:"
ansible -i "$INVENTORY_FILE" consul_cluster --list-hosts
echo
echo "Consul 版本: $(grep consul_version "$INVENTORY_FILE" | cut -d'=' -f2)"
echo "数据中心: $(grep consul_datacenter "$INVENTORY_FILE" | cut -d'=' -f2)"
# 确认部署
echo
read -p "确认部署 Consul 集群到上述主机? (y/N): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "部署已取消"
exit 0
fi
# 执行部署
echo
echo "4. 开始部署 Consul 集群..."
ansible-playbook -i "$INVENTORY_FILE" "$PLAYBOOK_FILE" -v
if [[ $? -eq 0 ]]; then
echo
echo "=== 部署完成 ==="
echo
echo "验证集群状态:"
echo "1. 检查服务状态:"
echo " ansible -i $INVENTORY_FILE consul_cluster -m shell -a 'systemctl status consul'"
echo
echo "2. 检查集群成员:"
echo " ansible -i $INVENTORY_FILE consul_cluster -m shell -a 'consul members'"
echo
echo "3. 访问 Web UI:"
echo " - Master: http://master:8500"
echo " - Ash3c: http://ash3c:8500"
echo
echo "4. 检查集群领导者:"
echo " curl http://master:8500/v1/status/leader"
echo
else
echo "部署失败,请检查错误信息"
exit 1
fi