两台Linux之间自动同步文件
背景
需求,服务器Linux A 更新SSL证书(Certbot renew)后,需要把证书自动同步到服务器Linux B
一、Linux B创建用户
创建用户
为Copy证书创建一个单独用户。利于权限控制
Markup 全选
# 添加用户 scpssl
useradd scpssl
# 设置用户scpssl密码
passwd scpssl
# 设置目录权限
setfacl -m u:scpssl:rwx /etc/nginx/ssl
# 设置子目录权限
setfacl -m d:u:scpssl:rwx /etc/nginx/ssl允许执行sudo nginx -s reload
用 visudo 编辑(必须这样)
Markup 全选
visudo不要用 vim 直接改 /etc/sudoers(容易写坏系统)
在文件最后加一行
Markup 全选
# 允许scpssl以root身份执行 nginx -s reload
scpssl ALL=(root) NOPASSWD: /usr/sbin/nginx -s reload
# 允许scpssl以root身份执行rsync
scpssl ALL=(root) NOPASSWD: /usr/sbin/rsync保存退出,切换到scpssl,验证scpssl 执行权限
Markup 全选
# 切换到scpssl用户
su - scpssl
# 执行 ngxin reload
sudo nginx -s reload
二、Linux A生成证书
因为我们要自动同步,所以需要服务器A利用SSH密钥来登录到服务器B。
服务器A中执行命令生成SSH证书,
Markup 全选
ssh-keygen -t rsa
三、Linux A中导入SSH证书到Linux B
copy证书到服务器B
Markup 全选
ssh-copy-id scpssl@10.8.0.3测试登录
Markup 全选
# 因为证书名字不是默认id_rsa名称,因此这里需要指定证书名字
ssh -i /root/.ssh/id_rsa_scpssl scpssl@10.8.0.3
四、Linux A创建同步脚本
新建文件
Markup 全选
vim /usr/local/bin/sync-cert.sh内容如下:
Markup 全选
#!/bin/bash
SRC="/etc/letsencrypt/live/"
DEST="scpssl@10.8.0.3:/etc/nginx/ssl/"
# rsync -avz --delete $SRC $DEST
rsync -avzL -e "ssh -i /root/.ssh/id_rsa_scpssl " $SRC $DEST --rsync-path="sudo rsync"
# 可选:重载目标服务器 nginx
# ssh -i /root/.ssh/id_rsa_scpssl scpssl@10.8.0.3 "sudo nginx -s reload"
if [ $? -eq 0 ]; then
ssh -i /root/.ssh/id_rsa_scpssl scpssl@10.8.0.3 "sudo nginx -s reload"
fi添加执行权限
Markup 全选
chmod +x /usr/local/bin/sync-cert.sh测试执行:
Markup 全选
rsync -avz -e "ssh -i /root/.ssh/id_rsa_scpssl " /etc/letsencrypt/live/ scpssl@10.8.0.3:/etc/nginx/ssl/ --rsync-path="sudo rsync"Markup 全选
# 测试rsync
rsync -avz -e "ssh -i /root/.ssh/id_rsa_scpssl " /etc/letsencrypt/live/ scpssl@10.8.0.3:/etc/nginx/ssl/ --rsync-path="sudo rsync"
# 测试整个脚本执行
/usr/local/bin/sync-cert.sh
五、绑定到certbot自动执行(重点)
certbot 有专门的 hook:--deploy-hook
执行
Markup 全选
certbot renew --deploy-hook "/usr/local/bin/sync-cert.sh"
或者写入配置(推荐)
Markup 全选
vim /etc/letsencrypt/renewal-hooks/deploy/sync-certs.sh内容:
Markup 全选
#!/bin/bash
/usr/local/bin/sync-cert.sh执行权限
Markup 全选
chmod +x /etc/letsencrypt/renewal-hooks/deploy/sync.sh
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post 张国生


