#!/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