# Consul集群最佳变量命名规范实施

## 概述

本项目已实施了一系列改进，确保Consul集群完全遵循最佳变量命名规范 `config/{environment}/{provider}/{region_or_service}/{key}`。这些改进使Consul集群配置更加灵活、可维护且符合环境隔离的最佳实践。

## 改进内容

### 1. 变量命名规范实施

我们创建了完整的Consul集群变量命名规范，涵盖以下类别：

- **集群基本配置**: `config/dev/consul/cluster/...`
- **节点配置**: `config/dev/consul/nodes/...`
- **网络配置**: `config/dev/consul/network/...`
- **端口配置**: `config/dev/consul/ports/...`
- **UI配置**: `config/dev/consul/ui/...`
- **服务发现配置**: `config/dev/consul/service_discovery/...`
- **性能调优配置**: `config/dev/consul/performance/...`
- **日志配置**: `config/dev/consul/logging/...`
- **安全配置**: `config/dev/consul/security/...`
- **连接配置**: `config/dev/consul/connect/...`
- **Autopilot配置**: `config/dev/consul/autopilot/...`
- **快照配置**: `config/dev/consul/snapshot/...`
- **备份配置**: `config/dev/consul/backup/...`

### 2. 自动化脚本

我们创建了以下自动化脚本，简化了Consul集群的部署和管理：

#### setup_consul_cluster_variables.sh
- 将Consul集群配置存储到Consul KV中
- 遵循 `config/{environment}/{provider}/{region_or_service}/{key}` 格式
- 包含Consul连接检查和配置验证功能

#### generate_consul_config.sh
- 使用Consul模板从KV存储生成最终的Consul配置文件
- 包含Consul连接检查和consul-template可用性验证
- 支持自定义Consul地址、环境和配置目录

#### deploy_consul_cluster_kv.sh
- 综合部署脚本，执行完整的部署流程
- 包含配置参数设置、Consul/Nomad连接检查
- 执行变量设置、配置生成、现有集群停止、新集群部署
- 包含多步骤验证功能（作业状态、leader选举、节点数量、关键变量配置）

### 3. 配置模板

我们创建了Consul配置模板文件 `consul.hcl.tmpl`，使用Consul模板语法从KV存储中动态获取配置：

- 基础配置（data_dir、raft_dir）
- UI配置（启用状态）
- 数据中心配置
- 服务器配置（server模式、bootstrap_expect）
- 网络配置（client_addr、bind_addr、advertise_addr）
- 端口配置
- 集群连接（retry_join节点IP）
- 服务发现配置
- 性能调优配置
- 日志配置
- 安全配置（加密密钥）
- 连接配置
- Autopilot配置（清理死服务器等）
- 快照配置（间隔、保留数量）
- 备份配置（间隔、保留数量）

### 4. Nomad作业配置

我们创建了完全遵循最佳变量命名规范的Nomad作业配置文件：

#### consul-cluster-dynamic.nomad
- 使用template块动态生成配置文件
- 包含3个服务组（consul-master、consul-ash3c、consul-warden）
- 每个组部署1个Consul服务器实例到对应节点
- 设置固定端口、资源分配和集群连接参数

#### consul-cluster-kv.nomad
- 完全遵循 `config/{environment}/{provider}/{region_or_service}/{key}` 格式
- 使用template块从Consul KV存储动态获取配置
- 包含3个服务组配置，每个组使用Consul模板动态生成配置

### 5. 文档更新

我们更新了Consul变量和存储配置指南文档，添加了：

- Consul集群配置变量章节，包含11个类别共40个具体KV路径示例
- 部署遵循最佳变量命名规范的Consul集群章节，包含：
  - 部署流程说明
  - 部署脚本使用方法
  - 配置模板示例
  - Nomad作业配置示例
  - 验证部署方法
  - 动态更新配置方法
  - 环境隔离实现方法

## 使用方法

### 1. 设置Consul变量

```bash
# 设置Consul集群变量
./deployment/scripts/setup_consul_cluster_variables.sh
```

### 2. 生成配置文件

```bash
# 生成Consul配置文件
./deployment/scripts/generate_consul_config.sh
```

### 3. 部署集群

```bash
# 部署遵循最佳变量命名规范的Consul集群
./deployment/scripts/deploy_consul_cluster_kv.sh
```

### 4. 验证部署

```bash
# 检查Consul集群配置
curl -s http://localhost:8500/v1/kv/config/dev/consul/?keys | jq '.'

# 检查集群leader
curl -s http://localhost:8500/v1/status/leader

# 检查集群节点
curl -s http://localhost:8500/v1/status/peers

# 验证生成的配置文件语法
consul validate /root/mgmt/components/consul/configs/consul.hcl
```

### 5. 动态更新配置

```bash
# 更新日志级别
curl -X PUT http://localhost:8500/v1/kv/config/dev/consul/cluster/log_level -d "DEBUG"

# 更新快照间隔
curl -X PUT http://localhost:8500/v1/kv/config/dev/consul/snapshot/interval -d "12h"

# 重新生成配置文件
./deployment/scripts/generate_consul_config.sh

# 重新加载Consul配置
consul reload
```

## 环境隔离

通过使用环境变量和不同的配置路径，您可以轻松实现不同环境的隔离：

```bash
# 开发环境
ENVIRONMENT=dev ./deployment/scripts/setup_consul_cluster_variables.sh

# 生产环境
ENVIRONMENT=prod ./deployment/scripts/setup_consul_cluster_variables.sh
```

这样，不同环境的配置将存储在不同的路径下：
- 开发环境: `config/dev/consul/...`
- 生产环境: `config/prod/consul/...`

## 文件结构

```
/root/mgmt/
├── components/consul/
│   ├── configs/
│   │   ├── consul.hcl              # 原始配置文件
│   │   └── consul.hcl.tmpl         # Consul配置模板
│   └── jobs/
│       ├── consul-cluster-simple.nomad    # 原始Nomad作业配置
│       ├── consul-cluster-dynamic.nomad   # 动态配置Nomad作业
│       └── consul-cluster-kv.nomad       # KV存储配置Nomad作业
├── deployment/scripts/
│   ├── setup_consul_cluster_variables.sh  # 设置Consul变量脚本
│   ├── generate_consul_config.sh         # 生成配置文件脚本
│   └── deploy_consul_cluster_kv.sh       # 部署Consul集群脚本
└── docs/setup/
    └── consul_variables_and_storage_guide.md  # 更新的指南文档
```

## 总结

通过实施这些改进，我们确保了Consul集群完全遵循最佳变量命名规范，实现了以下目标：

1. **标准化**: 所有Consul配置变量都遵循统一的命名规范
2. **灵活性**: 可以轻松修改配置而无需重新部署整个集群
3. **可维护性**: 配置结构清晰，易于理解和维护
4. **环境隔离**: 支持不同环境的配置隔离
5. **自动化**: 提供了完整的自动化部署和管理脚本

这些改进使Consul集群的配置管理更加高效和可靠，为整个基础设施的稳定运行提供了坚实的基础。