开发过程中,最令人头疼的事之一,就是本地配置文件和远程测试/生产环境不一致。比如你在 .env
文件里加了个新变量,忘了推给测试环境,结果联调的时候炸了。或者你改了 config.yaml
,上线才发现线上还是旧的。
这类问题说大不大,说小也够烦。手动维护配置同步成本高,而且容易出错。本文介绍一个实用脚本方案,帮你自动比对、备份并同步配置文件,支持 Shell 和 Python 两个版本,适用于 .env
、.json
、.yaml
等常见格式。
在微服务和多环境协同开发日渐普及的今天,环境一致性已经成为保障软件质量的基本要求。很多时候,代码逻辑是没问题的,出问题的反而是配置文件差异导致的运行异常。
而我们开发人员又很容易犯懒(当然也有忘记的时候),一个变量没同步、一个路径写错,就可能导致测试环境行为异常、线上出错还难排查。
所以,如果能写个小脚本,自动帮我们比对配置、备份旧配置并同步改动,岂不是美滋滋?
我们先确定目标:
实现方案:
Python
实现更强的比对逻辑和差异展示Shell
脚本适配更轻量的场景rsync
实现远程同步效率diff
命令判断文件是否有差异# sync_config.py
import os
import subprocess
import shutil
from pathlib import Path
# 配置
LOCAL_CONFIG_DIR = './configs/'
REMOTE_HOST = 'user@192.168.1.100'
REMOTE_CONFIG_DIR = '/home/user/project/configs/'
BACKUP_DIR = './backup/'
def backup_local():
os.makedirs(BACKUP_DIR, exist_ok=True)
for file in os.listdir(LOCAL_CONFIG_DIR):
src = os.path.join(LOCAL_CONFIG_DIR, file)
dst = os.path.join(BACKUP_DIR, file + '.bak')
shutil.copy2(src, dst)
print(f'备份本地文件:{file} -> {dst}')
def diff_and_sync():
for file in os.listdir(LOCAL_CONFIG_DIR):
local_file = os.path.join(LOCAL_CONFIG_DIR, file)
remote_file = f'{REMOTE_HOST}:{REMOTE_CONFIG_DIR}{file}'
diff_cmd = ['ssh', REMOTE_HOST, f'diff {REMOTE_CONFIG_DIR}{file} -'] # `-` 用于后续传入 stdin
with open(local_file, 'rb') as f:
result = subprocess.run(diff_cmd, input=f.read(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.stdout:
print(f'🔍 配置差异发现:{file}')
choice = input(f'是否同步 {file} 到远程?(y/n): ')
if choice.lower() == 'y':
subprocess.run(['scp', local_file, remote_file])
print(f'已同步:{file}')
else:
print(f'跳过:{file}')
else:
print(f'✔ 无差异:{file}')
if __name__ == "__main__":
backup_local()
diff_and_sync()
#!/bin/bash
LOCAL_DIR="./configs"
REMOTE_HOST="user@192.168.1.100"
REMOTE_DIR="/home/user/project/configs"
BACKUP_DIR="./backup"
mkdir -p "$BACKUP_DIR"
for file in "$LOCAL_DIR"/*; do
filename=$(basename "$file")
remote_file="$REMOTE_HOST:$REMOTE_DIR/$filename"
echo "📁 比对文件:$filename"
ssh "$REMOTE_HOST" "cat $REMOTE_DIR/$filename" > /tmp/remote_temp
diff "$file" /tmp/remote_temp > /dev/null
if [ $? -ne 0 ]; then
echo "🔍 差异发现:$filename"
cp "$file" "$BACKUP_DIR/$filename.bak"
read -p "是否同步 $filename 到远程?(y/n): " choice
if [ "$choice" == "y" ]; then
scp "$file" "$remote_file"
echo "同步完成:$filename"
else
echo "跳过文件:$filename"
fi
else
echo "✔ 文件一致:$filename"
fi
done
.env
文件同步(开发 → 测试服务器)开发本地:
.env
API_URL=http://localhost:3000
测试服务器:
.env
API_URL=http://test.example.com
使用脚本可快速发现差异,并提示是否同步,避免联调出错。
config.yaml
差异追踪本地版本:
debug: true
db:
host: localhost
远程版本:
debug: false
db:
host: prod-db
脚本可以展示差异并做备份同步,保障上线安全。
假设你有十几个服务共用一个 common.env
文件,可以用脚本批量同步到各个服务部署目录中,降低人肉复制出错的风险。
Q:配置文件改动很小也要同步吗?
A:脚本默认只有差异时才提示同步,而且有确认环节,避免误同步。
Q:远程文件不存在怎么办?
A:脚本中可增加远程文件存在性判断逻辑,首次同步可默认上传。
Q:支持增量同步目录吗?
A:推荐使用 rsync
加上 --dry-run
查看哪些文件将会被同步,也可以在脚本中嵌入 rsync
实现自动化。
环境配置同步这事,听起来小,但出问题就是“大杀器”。通过这篇文章你可以动手实现:
无论是 .env
、config.yaml
还是其他关键配置文件,都可以轻松做到一致性保障,避免“本地跑得好好的,测试就挂”的尴尬。
想让配置同步从此无忧,不妨把这个小脚本放进你的工程工具箱!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。