295 lines
7.3 KiB
Markdown
295 lines
7.3 KiB
Markdown
# XXXigCC Pool URL 更新工具
|
||
|
||
## 概述
|
||
|
||
本工具提供一个 Ansible Playbook,用于安全地更新 XXXigCC 配置文件中的 Pool URL,并清理日志、重启服务。
|
||
|
||
## 功能特性
|
||
|
||
- ✅ 支持条件更新(可选验证旧 URL)
|
||
- ✅ 自动备份配置文件
|
||
- ✅ 清理日志目录
|
||
- ✅ 自动重启服务
|
||
- ✅ 详细的操作日志和结果验证
|
||
|
||
## 使用方法
|
||
|
||
### 方式1:无条件更新(推荐)
|
||
|
||
适用于快速更新 Pool URL,不验证当前值:
|
||
|
||
```bash
|
||
ansible-playbook xxxigcc_update_pool_url.yaml \
|
||
-i inventory.ini \
|
||
-e "new_url=xxxigcc-proxy.ca.vvvo.net:8443"
|
||
```
|
||
|
||
### 方式2:条件更新(更安全)
|
||
|
||
只有当前 URL 等于 `old_url` 时才执行更新,适用于批量更新时确保只更新特定主机:
|
||
|
||
```bash
|
||
ansible-playbook xxxigcc_update_pool_url.yaml \
|
||
-i inventory.ini \
|
||
-e "new_url=xxxigcc-proxy.ca.vvvo.net:8443" \
|
||
-e "old_url=old-proxy.example.com:8443"
|
||
```
|
||
|
||
### 方式3:使用变量文件
|
||
|
||
创建变量文件 `xxxigcc_update_pool_url_vars.yml`:
|
||
```yaml
|
||
new_url: "xxxigcc-proxy.ca.vvvo.net:8443"
|
||
old_url: "old-proxy.example.com:8443" # 可选
|
||
```
|
||
|
||
执行:
|
||
```bash
|
||
ansible-playbook xxxigcc_update_pool_url.yaml \
|
||
-i inventory.ini \
|
||
-e @xxxigcc_update_pool_url_vars.yml
|
||
```
|
||
|
||
### 方式4:针对特定主机
|
||
|
||
```bash
|
||
ansible-playbook xxxigcc_update_pool_url.yaml \
|
||
-i inventory.ini \
|
||
--limit "server1,server2" \
|
||
-e "new_url=xxxigcc-proxy.ca.vvvo.net:8443"
|
||
```
|
||
|
||
## 参数说明
|
||
|
||
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
||
|------|------|------|--------|------|
|
||
| `new_url` | 字符串 | ✅ 是 | - | 新的 Pool URL |
|
||
| `old_url` | 字符串 | ❌ 否 | "" | 旧的 Pool URL,用于条件验证。留空则无条件更新 |
|
||
| `config_file` | 字符串 | ❌ 否 | `/etc/xxxigcc/config.json` | 配置文件路径 |
|
||
| `log_dir` | 字符串 | ❌ 否 | `/var/log/xxxigcc` | 日志目录路径 |
|
||
| `service_name` | 字符串 | ❌ 否 | `xxxigcc-daemon.service` | 服务名称 |
|
||
|
||
## 执行流程
|
||
|
||
Playbook 将按以下顺序执行操作:
|
||
|
||
1. **参数验证** - 检查必填参数 `new_url` 是否提供
|
||
2. **工具检查** - 确保 `jq` 工具已安装(用于 JSON 处理)
|
||
3. **配置文件验证** - 检查配置文件是否存在
|
||
4. **备份配置** - 创建带时间戳的配置文件备份
|
||
5. **读取当前值** - 获取当前的 Pool URL
|
||
6. **条件判断** - 根据 `old_url` 参数决定是否执行更新
|
||
7. **更新 URL** - 修改配置文件中的 `pools[0].url` 字段
|
||
8. **清理日志** - 删除 `/var/log/xxxigcc` 下的所有日志文件
|
||
9. **重启服务** - 重启 `xxxigcc-daemon.service` 服务
|
||
10. **验证结果** - 显示操作总结和最终状态
|
||
|
||
## 配置文件示例
|
||
|
||
需要修改的配置文件结构(`/etc/xxxigcc/config.json`):
|
||
|
||
```json
|
||
{
|
||
"pools": [
|
||
{
|
||
"algo": "rx/0",
|
||
"url": "xxxigcc-proxy.ca.vvvo.net:8443",
|
||
"user": "empty_wallet_1764940944",
|
||
"pass": "25_187_cYwsT",
|
||
"tls": true,
|
||
...
|
||
}
|
||
],
|
||
...
|
||
}
|
||
```
|
||
|
||
Playbook 会修改 `pools[0].url` 字段的值。
|
||
|
||
## 安全特性
|
||
|
||
- ✅ **自动备份**:每次更新前创建带时间戳的配置文件备份
|
||
- ✅ **条件更新**:支持验证旧值,避免误更新
|
||
- ✅ **原子操作**:使用临时文件确保配置更新的原子性
|
||
- ✅ **权限管理**:使用 `become: yes` 确保有足够权限
|
||
|
||
## 故障排查
|
||
|
||
### 问题1:jq 命令未找到
|
||
|
||
**错误信息**:
|
||
```
|
||
jq: command not found
|
||
```
|
||
|
||
**解决方案**:
|
||
Playbook 会自动安装 jq,但如果失败,可以手动安装:
|
||
```bash
|
||
# Ubuntu/Debian
|
||
sudo apt-get install jq
|
||
|
||
# CentOS/RHEL
|
||
sudo yum install jq
|
||
```
|
||
|
||
### 问题2:配置文件不存在
|
||
|
||
**错误信息**:
|
||
```
|
||
配置文件 /etc/xxxigcc/config.json 不存在
|
||
```
|
||
|
||
**解决方案**:
|
||
- 确认 XXXigCC 已经正确安装
|
||
- 检查配置文件路径是否正确
|
||
- 如果路径不同,使用 `-e config_file=/path/to/config.json` 指定
|
||
|
||
### 问题3:服务重启失败
|
||
|
||
**错误信息**:
|
||
```
|
||
Failed to restart xxxigcc-daemon.service
|
||
```
|
||
|
||
**解决方案**:
|
||
- 检查服务是否存在:`systemctl status xxxigcc-daemon.service`
|
||
- 查看服务日志:`journalctl -u xxxigcc-daemon.service -n 50`
|
||
- 验证配置文件语法:`jq . /etc/xxxigcc/config.json`
|
||
|
||
### 问题4:条件更新未执行
|
||
|
||
**现象**:
|
||
提供了 `old_url` 参数,但没有执行更新
|
||
|
||
**原因**:
|
||
当前配置文件中的 URL 与提供的 `old_url` 不匹配
|
||
|
||
**解决方案**:
|
||
- 检查当前 URL:`jq -r '.pools[0].url' /etc/xxxigcc/config.json`
|
||
- 确认 `old_url` 参数是否正确
|
||
- 如需强制更新,不要提供 `old_url` 参数
|
||
|
||
## 备份和恢复
|
||
|
||
### 查看备份文件
|
||
|
||
备份文件保存在配置文件同目录下,格式为:
|
||
```
|
||
/etc/xxxigcc/config.json.backup.<timestamp>
|
||
```
|
||
|
||
查看所有备份:
|
||
```bash
|
||
ls -lh /etc/xxxigcc/config.json.backup.*
|
||
```
|
||
|
||
### 恢复配置
|
||
|
||
如果需要恢复到之前的配置:
|
||
|
||
```bash
|
||
# 查看备份内容
|
||
cat /etc/xxxigcc/config.json.backup.1734326400
|
||
|
||
# 恢复配置
|
||
sudo cp /etc/xxxigcc/config.json.backup.1734326400 /etc/xxxigcc/config.json
|
||
|
||
# 重启服务
|
||
sudo systemctl restart xxxigcc-daemon.service
|
||
```
|
||
|
||
## 最佳实践
|
||
|
||
1. **先测试,后批量**:
|
||
- 先在单个主机上测试:`--limit "test-server"`
|
||
- 验证成功后再批量执行
|
||
|
||
2. **使用条件更新**:
|
||
- 批量更新时使用 `old_url` 参数,避免误更新已经更新过的主机
|
||
|
||
3. **保留备份**:
|
||
- 定期清理旧备份,但保留最近几次的备份文件
|
||
|
||
4. **监控服务状态**:
|
||
- 更新后验证服务是否正常运行
|
||
- 检查日志确认连接到新的 Pool URL
|
||
|
||
5. **使用变量文件**:
|
||
- 对于复杂配置,使用变量文件更易于管理和版本控制
|
||
|
||
## 示例场景
|
||
|
||
### 场景1:迁移到新的 Pool 服务器
|
||
|
||
```bash
|
||
# 1. 更新 Pool URL
|
||
ansible-playbook xxxigcc_update_pool_url.yaml \
|
||
-i inventory.ini \
|
||
-e "new_url=new-pool.example.com:8443" \
|
||
-e "old_url=old-pool.example.com:8443"
|
||
|
||
# 2. 验证服务状态
|
||
ansible all -i inventory.ini -m shell -a "systemctl status xxxigcc-daemon.service" -b
|
||
```
|
||
|
||
### 场景2:批量更新多个区域的主机
|
||
|
||
```bash
|
||
# 区域1
|
||
ansible-playbook xxxigcc_update_pool_url.yaml \
|
||
-i inventory.ini \
|
||
--limit "region_us" \
|
||
-e "new_url=us-pool.example.com:8443"
|
||
|
||
# 区域2
|
||
ansible-playbook xxxigcc_update_pool_url.yaml \
|
||
-i inventory.ini \
|
||
--limit "region_eu" \
|
||
-e "new_url=eu-pool.example.com:8443"
|
||
```
|
||
|
||
### 场景3:紧急回滚
|
||
|
||
```bash
|
||
# 使用备份文件恢复
|
||
ansible all -i inventory.ini -m shell -a \
|
||
"cp /etc/xxxigcc/config.json.backup.1734326400 /etc/xxxigcc/config.json && \
|
||
systemctl restart xxxigcc-daemon.service" -b
|
||
```
|
||
|
||
## 相关文档
|
||
|
||
- [XXXigCC 部署指南](../llmdoc/guides/how-to-deploy-xxxigcc.md)
|
||
- [Ansible 最佳实践](../llmdoc/guides/ansible-best-practices.md)
|
||
- [配置示例](../examples/xxxigcc_update_pool_url_vars.example.yml)
|
||
|
||
## 技术细节
|
||
|
||
### JSON 处理
|
||
|
||
使用 `jq` 工具进行 JSON 文件的精确修改:
|
||
|
||
```bash
|
||
# 读取当前值
|
||
jq -r '.pools[0].url' /etc/xxxigcc/config.json
|
||
|
||
# 更新值(使用临时文件确保原子性)
|
||
jq '.pools[0].url = "new-url"' config.json > config.json.tmp
|
||
mv config.json.tmp config.json
|
||
```
|
||
|
||
### 服务管理
|
||
|
||
使用 Ansible 的 `systemd` 模块管理服务:
|
||
|
||
```yaml
|
||
- name: 重启服务
|
||
ansible.builtin.systemd:
|
||
name: xxxigcc-daemon.service
|
||
state: restarted
|
||
```
|
||
|
||
---
|
||
|
||
有任何问题?请查看 [故障排查](#故障排查) 章节或提交 [Issue](../../issues)。
|