# 🏗️ 基础设施管理项目 这是一个现代化的多云基础设施管理平台,专注于 OpenTofu、Ansible 和 Nomad + Podman 的集成管理。 ## 🎯 项目特性 - **🌩️ 多云支持**: Oracle Cloud, 华为云, Google Cloud, AWS, DigitalOcean - **🏗️ 基础设施即代码**: 使用 OpenTofu 管理云资源 - **⚙️ 配置管理**: 使用 Ansible 自动化配置和部署 - **🐳 容器编排**: Nomad 集群管理和 Podman 容器运行时 - **🔄 CI/CD**: Gitea Actions 自动化流水线 - **📊 监控**: Prometheus + Grafana 监控体系 - **🔐 安全**: 多层安全防护和合规性 ## 📁 项目结构 ``` mgmt/ ├── .gitea/workflows/ # CI/CD 工作流 ├── tofu/ # OpenTofu 基础设施代码 │ ├── environments/ # 环境配置 (dev/staging/prod) │ ├── modules/ # 可复用模块 │ ├── providers/ # 云服务商配置 │ └── shared/ # 共享配置 ├── configuration/ # Ansible 配置管理 │ ├── inventories/ # 主机清单 │ ├── playbooks/ # 剧本 │ ├── templates/ # 模板文件 │ └── group_vars/ # 组变量 ├── jobs/ # Nomad 作业定义 │ ├── consul/ # Consul 集群配置 │ └── podman/ # Podman 相关作业 ├── configs/ # 配置文件 │ ├── nomad-master.hcl # Nomad 主节点配置 │ └── nomad-ash3c.hcl # Nomad 客户端配置 ├── docs/ # 文档 ├── security/ # 安全配置 │ ├── certificates/ # 证书文件 │ └── policies/ # 安全策略 ├── tools/ # 工具和实用程序 ├── playbooks/ # 核心Ansible剧本 └── Makefile # 项目管理命令 ``` **注意:** 项目已从 Docker Swarm 迁移到 Nomad + Podman,原有的 swarm 目录已不再使用。所有中间过程脚本和测试文件已清理,保留核心配置文件以符合GitOps原则。 ## 🔄 GitOps 原则 本项目遵循 GitOps 工作流,确保基础设施状态与 Git 仓库中的代码保持一致: - **声明式配置**: 所有基础设施和应用程序配置都以声明式方式存储在 Git 中 - **版本控制和审计**: 所有变更都通过 Git 提交,提供完整的变更历史和审计跟踪 - **自动化同步**: 通过 CI/CD 流水线自动将 Git 中的变更应用到实际环境 - **状态收敛**: 系统会持续监控实际状态,并自动修复任何与期望状态的偏差 ### GitOps 工作流程 1. **声明期望状态**: 在 Git 中定义基础设施和应用程序的期望状态 2. **提交变更**: 通过 Git 提交来应用变更 3. **自动同步**: CI/CD 系统检测到变更并自动应用到环境 4. **状态验证**: 系统验证实际状态与期望状态一致 5. **监控和告警**: 持续监控状态并在出现偏差时发出告警 这种工作流确保了环境的一致性、可重复性和可靠性,同时提供了完整的变更历史和回滚能力。 ## 🚀 快速开始 ### 1. 环境准备 ```bash # 克隆项目 git clone cd mgmt # 检查环境状态 ./mgmt.sh status # 快速部署(适用于开发环境) ./mgmt.sh deploy ``` ### 2. 配置云服务商 ```bash # 复制配置模板 cp tofu/environments/dev/terraform.tfvars.example tofu/environments/dev/terraform.tfvars # 编辑配置文件,填入你的云服务商凭据 vim tofu/environments/dev/terraform.tfvars ``` ### 3. 初始化基础设施 ```bash # 初始化 OpenTofu ./mgmt.sh tofu init # 查看执行计划 ./mgmt.sh tofu plan # 应用基础设施变更 cd tofu/environments/dev && tofu apply ``` ### 4. 部署 Nomad 服务 ```bash # 部署 Consul 集群 nomad run /root/mgmt/jobs/consul/consul-cluster.nomad # 查看 Nomad 任务 nomad job status # 查看节点状态 nomad node status ``` ### ⚠️ 重要提示:网络访问注意事项 **Tailscale 网络访问**: - 本项目中的 Nomad 和 Consul 服务通过 Tailscale 网络进行访问 - 访问 Nomad (端口 4646) 和 Consul (端口 8500) 时,必须使用 Tailscale 分配的 IP 地址 - 错误示例:`http://127.0.0.1:4646` 或 `http://localhost:8500` (无法连接) - 正确示例:`http://100.x.x.x:4646` 或 `http://100.x.x.x:8500` (使用 Tailscale IP) **获取 Tailscale IP**: ```bash # 查看当前节点的 Tailscale IP tailscale ip -4 # 查看所有 Tailscale 网络中的节点 tailscale status ``` **常见问题**: - 如果遇到 "connection refused" 错误,请确认是否使用了正确的 Tailscale IP - 确保 Tailscale 服务已启动并正常运行 - 检查网络策略是否允许通过 Tailscale 接口访问相关端口 ### 🔄 Nomad 集群领导者轮换与访问策略 **Nomad 集群领导者机制**: - Nomad 使用 Raft 协议实现分布式一致性,集群中只有一个领导者节点 - 领导者节点负责处理所有写入操作和协调集群状态 - 当领导者节点故障时,集群会自动选举新的领导者 **领导者轮换时的访问策略**: 1. **动态发现领导者**: ```bash # 查询当前领导者节点 curl -s http://<任意Nomad服务器IP>:4646/v1/status/leader # 返回结果示例: "100.90.159.68:4647" # 使用返回的领导者地址进行API调用 curl -s http://100.90.159.68:4646/v1/nodes ``` 2. **负载均衡方案**: - **DNS 负载均衡**:使用 Consul DNS 服务,通过 `nomad.service.consul` 解析到当前领导者 - **代理层负载均衡**:在 Nginx/HAProxy 配置中添加健康检查,自动路由到活跃的领导者节点 - **客户端重试机制**:在客户端代码中实现重试逻辑,当连接失败时尝试其他服务器节点 3. **推荐访问模式**: ```bash # 使用领导者发现脚本 #!/bin/bash # 获取任意一个Nomad服务器IP SERVER_IP="100.116.158.95" # 查询当前领导者 LEADER=$(curl -s http://${SERVER_IP}:4646/v1/status/leader | sed 's/"//g') # 使用领导者地址执行命令 nomad node status -address=http://${LEADER} ``` 4. **高可用性配置**: - 将所有 Nomad 服务器节点添加到客户端配置中 - 客户端会自动连接到可用的服务器节点 - 对于写入操作,客户端会自动重定向到领导者节点 **注意事项**: - Nomad 集群领导者轮换是自动进行的,通常不需要人工干预 - 在领导者选举期间,集群可能会短暂无法处理写入操作 - 建议在应用程序中实现适当的重试逻辑,以处理领导者切换期间的临时故障 ## 🛠️ 常用命令 | 命令 | 描述 | |------|------| | `make status` | 显示项目状态总览 | | `make deploy` | 快速部署所有服务 | | `make cleanup` | 清理所有部署的服务 | | `cd tofu/environments/dev && tofu ` | OpenTofu 管理命令 | | `nomad job status` | 查看 Nomad 任务状态 | | `nomad node status` | 查看 Nomad 节点状态 | | `podman ps` | 查看运行中的容器 | | `ansible-playbook playbooks/configure-nomad-clients.yml` | 配置 Nomad 客户端 | ## 🌩️ 支持的云服务商 ### Oracle Cloud Infrastructure (OCI) - ✅ 计算实例 - ✅ 网络配置 (VCN, 子网, 安全组) - ✅ 存储 (块存储, 对象存储) - ✅ 负载均衡器 ### 华为云 - ✅ 弹性云服务器 (ECS) - ✅ 虚拟私有云 (VPC) - ✅ 弹性负载均衡 (ELB) - ✅ 云硬盘 (EVS) ### Google Cloud Platform - ✅ Compute Engine - ✅ VPC 网络 - ✅ Cloud Load Balancing - ✅ Persistent Disk ### Amazon Web Services - ✅ EC2 实例 - ✅ VPC 网络 - ✅ Application Load Balancer - ✅ EBS 存储 ### DigitalOcean - ✅ Droplets - ✅ VPC 网络 - ✅ Load Balancers - ✅ Block Storage ## 🔄 CI/CD 流程 ### 基础设施部署流程 1. **代码提交** → 触发 Gitea Actions 2. **OpenTofu Plan** → 生成执行计划 3. **人工审核** → 确认变更 4. **OpenTofu Apply** → 应用基础设施变更 5. **Ansible 部署** → 配置和部署应用 ### 应用部署流程 1. **应用代码更新** → 构建容器镜像 2. **镜像推送** → 推送到镜像仓库 3. **Nomad Job 更新** → 更新任务定义 4. **Nomad 部署** → 滚动更新服务 5. **健康检查** → 验证部署状态 ## 📊 监控和可观测性 ### 监控组件 - **Prometheus**: 指标收集和存储 - **Grafana**: 可视化仪表板 - **AlertManager**: 告警管理 - **Node Exporter**: 系统指标导出 ### 日志管理 - **ELK Stack**: Elasticsearch + Logstash + Kibana - **Fluentd**: 日志收集和转发 - **结构化日志**: JSON 格式标准化 ## 🔐 安全最佳实践 ### 基础设施安全 - **网络隔离**: VPC, 安全组, 防火墙 - **访问控制**: IAM 角色和策略 - **数据加密**: 传输和静态加密 - **密钥管理**: 云服务商密钥管理服务 ### 应用安全 - **容器安全**: 镜像扫描, 最小权限 - **网络安全**: 服务网格, TLS 终止 - **秘密管理**: Docker Secrets, Ansible Vault - **安全审计**: 日志监控和审计 ## 🧪 测试策略 ### 基础设施测试 - **语法检查**: OpenTofu validate - **安全扫描**: Checkov, tfsec - **合规检查**: OPA (Open Policy Agent) ### 应用测试 - **单元测试**: 应用代码测试 - **集成测试**: 服务间集成测试 - **端到端测试**: 完整流程测试 ## 📚 文档 - [Consul集群故障排除](docs/consul-cluster-troubleshooting.md) - [磁盘管理](docs/disk-management.md) - [Nomad NFS设置](docs/nomad-nfs-setup.md) - [Consul-Terraform集成](docs/setup/consul-terraform-integration.md) - [OCI凭据设置](docs/setup/oci-credentials-setup.md) - [Oracle云设置](docs/setup/oracle-cloud-setup.md) ## 🤝 贡献指南 1. Fork 项目 2. 创建特性分支 (`git checkout -b feature/amazing-feature`) 3. 提交变更 (`git commit -m 'Add amazing feature'`) 4. 推送到分支 (`git push origin feature/amazing-feature`) 5. 创建 Pull Request ## 📄 许可证 本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。 ## 🆘 支持 如果你遇到问题或有疑问: 1. 查看 [文档](docs/) 2. 搜索 [Issues](../../issues) 3. 创建新的 [Issue](../../issues/new) ## 🎉 致谢 感谢所有为这个项目做出贡献的开发者和社区成员!