Files
ansible-playbook/docs/nezha_update_secret_README.md
Wang Defa 167fad20eb 添加 Nezha Agent 管理功能和完整文档系统
- 新增 Nezha Agent client_secret 更新 playbook(两种实现方案)
- 建立三层文档架构:docs/(用户文档)、examples/(配置示例)、llmdoc/(技术文档)
- 添加项目主 README.md 和配置示例文件
- 初始化 .gitignore 保护敏感信息
2025-12-16 10:52:38 +08:00

226 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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),除非有特殊的正则表达式需求。
## 许可证
遵循项目主许可证