添加 Nezha Agent 管理功能和完整文档系统

- 新增 Nezha Agent client_secret 更新 playbook(两种实现方案)
- 建立三层文档架构:docs/(用户文档)、examples/(配置示例)、llmdoc/(技术文档)
- 添加项目主 README.md 和配置示例文件
- 初始化 .gitignore 保护敏感信息
This commit is contained in:
Wang Defa
2025-12-16 10:52:38 +08:00
parent f08326fec3
commit 167fad20eb
32 changed files with 2090 additions and 0 deletions

200
docs/QUICKSTART_nezha.md Normal file
View File

@@ -0,0 +1,200 @@
# Nezha Agent Secret 更新 - 快速开始
## 🚀 5分钟快速上手
### 步骤 1: 准备 Inventory 文件
```bash
# 复制示例文件
cp inventory.example.ini inventory.ini
# 编辑 inventory.ini添加你的服务器信息
vim inventory.ini
```
最简单的 inventory.ini 示例:
```ini
[nezha_agents]
your-server.com ansible_host=1.2.3.4 ansible_user=root
```
### 步骤 2: 测试连接
```bash
# 测试 Ansible 连接
ansible nezha_agents -i inventory.ini -m ping
```
如果成功,你会看到:
```
your-server.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
```
### 步骤 3: 执行更新
#### 方式A强制更新推荐用于首次使用
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=你的新密钥"
```
#### 方式B安全更新推荐用于生产环境
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=新密钥" \
-e "old_client_secret=旧密钥"
```
### 步骤 4: 验证结果
执行成功后,你会看到类似输出:
```
TASK [显示更新结果] ****************************************************
ok: [your-server.com] => {
"msg": "client_secret 已成功更新"
}
TASK [显示服务状态] ****************************************************
ok: [your-server.com] => {
"msg": "Nezha Agent 服务状态: active"
}
```
## 🎯 常见使用场景
### 场景 1: 单台服务器更新
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
--limit your-server.com \
-e "client_secret=NewSecret123"
```
### 场景 2: 先测试,后执行
```bash
# 1. 测试模式(不实际执行,只显示会做什么)
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=NewSecret123" \
--check --diff
# 2. 确认无误后,去掉 --check 实际执行
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=NewSecret123"
```
### 场景 3: 批量更新多台服务器
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=NewSecret123"
```
### 场景 4: 使用变量文件(保护敏感信息)
创建 `secret_vars.yml`:
```yaml
client_secret: "你的新密钥"
```
执行:
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e @secret_vars.yml
```
## ⚠️ 注意事项
1. **备份**: 每次执行都会自动备份配置文件
2. **重启**: 更新后会自动重启 nezha-agent 服务(服务会短暂中断几秒)
3. **权限**: 确保你有 root 或 sudo 权限
4. **验证**: 使用 `-e "old_client_secret=旧值"` 可以避免误操作
## 🔧 故障排查
### 问题:连接失败
```bash
# 检查 SSH 连接
ssh root@your-server.com
# 测试 Ansible 连接
ansible nezha_agents -i inventory.ini -m ping -vvv
```
### 问题:权限不足
```bash
# 如果不是 root 用户,确保在 inventory.ini 中添加
ansible_become=yes
# 或在命令中添加
ansible-playbook nezha_update_secret.yml -i inventory.ini -b -K
# -b: 使用 become (sudo)
# -K: 询问 sudo 密码
```
### 问题:配置文件路径不同
```bash
# 指定自定义路径
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=NewSecret" \
-e "config_file=/custom/path/config.yml"
```
## 📚 更多信息
- 详细文档: [nezha_update_secret_README.md](nezha_update_secret_README.md)
- 查看其他 playbook 示例: `ls *.yml *.yaml`
## 💡 专业提示
1. **使用 Ansible Vault 保护密钥**:
```bash
ansible-vault encrypt_string 'YourSecret' --name 'client_secret'
```
2. **保存执行日志**:
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=NewSecret" | tee update.log
```
3. **并行执行(多台服务器)**:
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=NewSecret" \
-f 10 # 同时处理10台服务器
```
## ✅ 检查清单
- [ ] 已准备 inventory.ini 文件
- [ ] 已测试 SSH/Ansible 连接 (`ansible -m ping`)
- [ ] 已准备新的 client_secret 值
- [ ] 在生产环境前已在测试环境验证
- [ ] 已使用 `--check --diff` 预览变更
- [ ] 已准备回滚方案(保留旧密钥值)
准备就绪?执行以下命令开始:
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=你的新密钥"
```

106
docs/README.md Normal file
View File

@@ -0,0 +1,106 @@
# Docs - 文档目录
本目录包含项目的详细文档。
## 📚 文档列表
### Nezha Agent 管理
- **[nezha_update_secret_README.md](nezha_update_secret_README.md)** - Nezha Agent Client Secret 更新工具完整文档
- 详细的使用方法和参数说明
- 安全性和可靠性特性
- 错误处理和故障排查
- 最佳实践建议
- **[QUICKSTART_nezha.md](QUICKSTART_nezha.md)** - Nezha Agent 5分钟快速开始
- 快速上手步骤
- 常见使用场景
- 故障排查指南
## 🔍 查找文档
### 按需求查找
| 我想... | 查看文档 |
|---------|----------|
| 快速更新 Nezha Agent | [快速开始](QUICKSTART_nezha.md) |
| 了解所有功能和参数 | [完整文档](nezha_update_secret_README.md) |
| 查看配置示例 | [examples/](../examples/) |
| 了解项目架构 | [llmdoc/architecture/](../llmdoc/architecture/) |
| 学习最佳实践 | [llmdoc/guides/](../llmdoc/guides/) |
## 📖 文档组织
本项目采用分层文档结构:
```
docs/ # 用户文档(人类友好)
├── nezha_update_secret_README.md
└── QUICKSTART_nezha.md
llmdoc/ # LLM 文档系统AI 友好)
├── index.md # 文档索引
├── overview/ # 项目概览
├── guides/ # 操作指南
├── architecture/ # 架构文档
└── reference/ # 参考文档
```
### docs/ vs llmdoc/
- **docs/** - 面向人类用户的详细文档
- 更注重实用性和可读性
- 包含大量示例和使用场景
- 适合快速上手和日常使用
- **llmdoc/** - 面向 LLM 的结构化文档
- 更注重系统性和完整性
- 按架构/指南/参考分类
- 适合深入理解和检索
## 🚀 快速导航
### 新手入门
1. 阅读 [项目 README](../README.md)
2. 查看 [快速开始指南](QUICKSTART_nezha.md)
3. 参考 [示例配置](../examples/)
### 深入学习
1. 浏览 [LLM 文档索引](../llmdoc/index.md)
2. 学习 [Ansible 最佳实践](../llmdoc/guides/ansible-best-practices.md)
3. 了解 [项目架构](../llmdoc/architecture/)
### 问题解决
1. 查看文档中的"故障排查"章节
2. 检查 [示例配置](../examples/)是否正确
3. 参考 [安全最佳实践](../llmdoc/guides/security-best-practices.md)
## 🔄 文档更新
文档会随项目更新而更新。如发现文档问题:
- 提交 Issue 报告文档错误
- 直接提 PR 修正文档
## 📝 文档编写规范
如果您想贡献文档:
1. 遵循 Markdown 语法
2. 使用清晰的标题层级
3. 添加必要的代码示例
4. 包含实际使用场景
5. 保持简洁明了
## 🔗 相关资源
- [Ansible 官方文档](https://docs.ansible.com/)
- [YAML 语法指南](https://yaml.org/spec/1.2/spec.html)
- [Jinja2 模板文档](https://jinja.palletsprojects.com/)
---
有任何文档相关的问题?请提交 [Issue](../../issues)。

View File

@@ -0,0 +1,225 @@
# Nezha Agent Client Secret 更新工具
## 概述
本工具提供两个 Ansible Playbook用于安全地更新 Nezha Agent 配置文件中的 `client_secret` 字段。
## 文件说明
- **nezha_update_secret.yml** (推荐):使用 `lineinfile` 模块,简单可靠
- **nezha_update_secret_v2.yml** (备选):使用 `replace` 模块,正则表达式更灵活
## 使用方法
### 方式1强制更新不验证旧值
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=你的新密钥"
```
### 方式2安全更新验证旧值
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=你的新密钥" \
-e "old_client_secret=旧密钥值"
```
### 方式3使用变量文件
创建变量文件 `vars.yml`:
```yaml
client_secret: "HWzBMgbtWbSHdTyTVyh5U8bu3JhPmStw"
old_client_secret: "OldSecretValue123" # 可选
```
执行:
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e @vars.yml
```
### 方式4针对特定主机
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
--limit "server1,server2" \
-e "client_secret=你的新密钥"
```
## 参数说明
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `client_secret` | 字符串 | ✅ 是 | 新的 client_secret 值 |
| `old_client_secret` | 字符串 | ❌ 否 | 旧的 client_secret 值,用于验证。留空则强制更新 |
| `config_file` | 字符串 | ❌ 否 | 配置文件路径,默认 `/opt/nezha/agent/config.yml` |
| `service_name` | 字符串 | ❌ 否 | 服务名称,默认 `nezha-agent.service` |
## 功能特性
### ✅ 安全性保障
- ✔️ 自动备份配置文件(带时间戳)
- ✔️ 可选的旧值验证,防止误操作
- ✔️ 配置文件存在性检查
- ✔️ 参数完整性验证
### ✅ 可靠性保障
- ✔️ 幂等操作,可重复执行
- ✔️ 更新失败时不会重启服务
- ✔️ 服务状态验证和显示
### ✅ 自动化功能
- ✔️ 配置更新后自动重启 nezha-agent 服务
- ✔️ 使用 handler 机制,只在配置变更时重启
## 执行流程
1. **参数验证** - 检查必填参数是否提供
2. **文件检查** - 验证配置文件是否存在
3. **备份配置** - 创建带时间戳的备份文件
4. **更新配置** - 根据是否提供旧值选择更新策略
5. **触发重启** - 配置变更时触发服务重启handler
6. **状态验证** - 显示服务最终状态
## 备份说明
每次执行都会创建两个备份:
1. **时间戳备份**: `config.yml.backup.20231216T153045`
2. **Ansible 备份**: `config.yml.[随机后缀]~`
备份文件保存在与原配置文件相同的目录中。
## 错误处理
### 错误client_secret 参数为空
```
FAILED! => {"msg": "参数 client_secret 不能为空"}
```
**解决**: 确保提供了 `client_secret` 参数
### 错误:配置文件不存在
```
FAILED! => {"msg": "配置文件 /opt/nezha/agent/config.yml 不存在"}
```
**解决**: 检查 Nezha Agent 是否已安装,或使用 `-e config_file=路径` 指定正确路径
### 错误:未找到匹配的旧值
```
FAILED! => {"msg": "未找到匹配的旧 client_secret 值"}
```
**解决**: 检查 `old_client_secret` 参数是否正确,或使用强制更新模式(不提供旧值)
## 使用示例
### 示例1生产环境安全更新
```bash
# 先在测试环境验证
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
--limit test_servers \
-e "client_secret=NewSecret123" \
-e "old_client_secret=OldSecret456" \
--check --diff
# 确认无误后应用到生产环境
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
--limit prod_servers \
-e "client_secret=NewSecret123" \
-e "old_client_secret=OldSecret456"
```
### 示例2批量更新所有服务器
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=NewUnifiedSecret"
```
### 示例3测试模式不实际执行
```bash
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=TestSecret" \
--check --diff
```
## 回滚操作
如果更新后需要回滚:
```bash
# 方法1使用备份文件恢复
ansible all -i inventory.ini -b \
-m copy \
-a "src=/opt/nezha/agent/config.yml.backup.20231216T153045 \
dest=/opt/nezha/agent/config.yml \
remote_src=yes"
# 方法2使用原有的 client_secret 再次运行
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e "client_secret=原来的密钥"
```
## 注意事项
1. **权限要求**: 需要 root 或 sudo 权限
2. **服务中断**: 更新会导致 Nezha Agent 服务短暂重启(通常几秒钟)
3. **批量操作**: 建议先在小范围测试,再批量应用
4. **密钥安全**: 不要将密钥直接写在命令历史中,建议使用变量文件或 Ansible Vault
5. **幂等性**: 可以安全地重复执行,不会造成重复修改
## 与 Ansible Vault 结合使用
为保护敏感信息,建议使用 Ansible Vault
```bash
# 创建加密的变量文件
ansible-vault create secret_vars.yml
# 在文件中添加
client_secret: "你的密钥"
# 使用加密文件执行
ansible-playbook nezha_update_secret.yml \
-i inventory.ini \
-e @secret_vars.yml \
--ask-vault-pass
```
## 最佳实践
1. ✅ 在生产环境使用前,先在测试环境验证
2. ✅ 使用 `--check --diff` 模式预览变更
3. ✅ 使用 `old_client_secret` 参数进行安全验证
4. ✅ 使用 Ansible Vault 保护敏感信息
5. ✅ 定期清理旧的备份文件
6. ✅ 记录每次更新的时间和原因
## 技术细节
### 方案A (lineinfile) vs 方案B (replace)
| 特性 | lineinfile | replace |
|------|-----------|---------|
| 复杂度 | 简单 | 中等 |
| 灵活性 | 中等 | 高 |
| 适用场景 | 单行替换 | 复杂模式匹配 |
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
推荐使用 `nezha_update_secret.yml` (方案A),除非有特殊的正则表达式需求。
## 许可证
遵循项目主许可证