很久没写博客了,虽然也没写几篇^_^...露个脸,表示还活跃在互联网行业中...不说没用的了,分享一下如何实现Git服务间的同步。
Git服务咱们通常多会使用gitlab-rake工具定时作备份,当出现问题时利用备份恢复,那是否有一种需求是另一个环境也须要部署一套Git服务,且须要和前一套Git服务去同步的,即便作冷备,既省去了恢复时间,也达到了定时作恢复演练的目的。
目前咱们另一个环境就遇到了这样的需求,固然能够研究学习Git API去实现,但因为目前需求对同步实时性要求不高,因而我准备用一个直接简单粗暴的方式来实现,其实就是拿Git备份去另一套环境作自动恢复,交互问题咱们交给expect工具来解决。
下面分别分享下Python和Shell脚本做为参考学习,同步时间则能够调整定时备份的时间及恢复时间便可,内容大同小异,思路基本一致:python
#!/usr/bin/python # -*- coding: utf-8 -*- import os import sys import pexpect import paramiko # 备份服务器的IP地址、用户名 git_src_host = "xxx.xxx.xxx.xxx" git_src_user = "xxx" git_src_port = "22" # 地址自行根据环境变动 private_key = paramiko.RSAKey.from_private_key_file('/xxx/xxx/xxx/.ssh/id_rsa') git_bak_dir = "/var/opt/gitlab/backups" # Copy backup to xxx.xxx.xxx.xxx(查找备份服务器一天之内的备份传到恢复服务器所在备份目录) try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect( hostname=git_src_host, username=git_src_user, port=git_src_port, password=private_key) cmd=("find " + git_bak_dir + " -type f -ctime -1") stdin, stdout, stderr = ssh.exec_command(cmd) for item in stdout.readlines(): chown_cmd="chown git:git " + git_bak_dir + "/*;chmod 700 " + git_bak_dir rsync_cmd=('rsync -avzP ' + git_src_user + '@' + git_src_host + ':' + item.strip('\n') + ' ' + git_bak_dir) #print(rsync_cmd) os.system(rsync_cmd) os.system(chown_cmd) ssh.close() except Exception, e: print e # Restore backup ls_cmd="ls -t " + git_bak_dir + " | \ head -n 1 | \ sed -r 's/^([0-9]+_[0-9]+_[0-9]+_[0-9]+_.*)_gitlab_backup.tar/\\1/g'" rs=os.popen(ls_cmd) restore_file=rs.read() # print(restore_file) os.system("gitlab-ctl stop unicorn;gitlab-ctl stop sidekiq") expectations=["Do you want to continue (yes/no)?","Do you want to continue (yes/no)?",] child = pexpect.spawn('gitlab-rake gitlab:backup:restore BACKUP=' + restore_file,timeout=1800) child.logfile = sys.stdout while True: try: i = child.expect(expectations) if i == 0: child.sendline('yes') elif i == 1: child.sendline('yes') except pexpect.EOF: print('Exiting fexpect for EOF.') break os.system("gitlab-ctl restart")
#!/bin/bash # git_src_host="xxx.xxx.xxx.xxx" git_src_user="xxx" git_bak_dir="/var/opt/gitlab/backups" git_bak_file=`ssh ${git_src_user}@${git_src_host} "find ${git_bak_dir} -type f -ctime -1"` # Copy backup to xxx.xxx.xxx.xxx for bakfiles in $git_bak_file ; do echo "------------------------------------" rsync -avzP ${git_src_user}@${git_src_host}:${bakfiles} ${git_bak_dir} echo $bakfiles echo "------------------------------------" done chown git:root $git_bak_dir chmod 700 $git_bak_dir # Restore backup restore_file=`ls -t $git_bak_dir | head -n 1 | sed -r 's/^([0-9]+_[0-9]+_[0-9]+_[0-9]+_.*)_gitlab_backup.tar/\1/g'` gitlab-ctl stop unicorn gitlab-ctl stop sidekiq /bin/expect <<EOF set time 30 spawn gitlab-rake gitlab:backup:restore BACKUP=$restore_file expect "Do you want to continue (yes/no)?" { send "yes\r"; } expect "Do you want to continue (yes/no)?" { send "yes\r"; } expect "Do you want to continue (yes/no)?" { send "yes\r"; } expect "Do you want to continue (yes/no)?" { send "yes\r"; } expect "Do you want to continue (yes/no)?" { send "yes\r"; } expect eof EOF #gitlab-ctl reconfigure gitlab-ctl restart