开源无处不在。 它在家里的计算机中,在工作中的计算机中,在互联网中,并且很多都由Git管理。 由于Git是分散式的,因此许多人也将其视为一种众包的备份解决方案。 从理论上讲,每当有人将Git存储库克隆到其本地计算机时,他们都会创建项目源代码的备份。 如果有100个人这样做,则存储库有100个备份副本。
从理论上讲,这可以缓解“灾难”,例如项目维护人员突然决定删除存储库或莫名其妙地阻止所有流量 ,并使开发人员争先恐后找出谁拥有master分支的最新版本。 同样,整个代码托管站点在过去都已消失。 没有人会想到Google Code,Microsoft CodePlex或Gitorious在鼎盛时期将被关闭。
简而言之,如果在过去的几十年中互联网已经教会了我们任何东西,那就是依靠互联网神奇地创建备份并不是冗余的最可靠途径。
此外,对于许多人来说,很多开源项目都托管在GitHub上是个问题,而GitHub不是开放平台。 许多开发人员和用户都希望支持诸如GitLab之类的堆栈并与之交互,该堆栈具有开源社区版。
使用Ansible for Git
Git的权力下放对于解决这个问题很有用。 使用纯Git,您可以通过一个push命令轻松地将其推入两个或多个存储库。 但是,为了使该功能在发生意外故障时有用,您必须经常与Git存储库进行交互(特别是推送)。 此外,即使您可能永远不会自己推送或拉出代码,也可能有一些要备份的存储库。
Gitolite或Gitea (或您喜欢的任何Git主机)。Ansible模块
如果Ansible不是因为其出色的模块集合,那么它就不会有太多。 像Python的第三方库或Linux的应用程序一样 ,Ansible有用且令人惊讶的简单技巧的技术驱动因素是别人已经为您找到的部分。 因为本文正在研究如何有效和可靠地备份Git存储库,所以这里使用的模块是Git模块和ini_file模块。
首先,创建一个名为mirror.yaml的文件作为剧本。 您可以像通常使用Ansible一样从名称和任务条目开始。 本示例将localhost添加到主机列表中,以便在控制器计算机(您现在坐在的计算机)上运行播放,但是在现实生活中,您可能会在网络上的特定主机或一组主机上运行该主机。
---
- name
:
"Mirror a Git repo with Ansible"
hosts
: localhost
tasks:
git pull和克隆
如果要进行备份,则需要最新代码的副本。 使用Git存储库实现此目的的明显方法是执行git pull 。 但是, pull假定克隆已经存在,而写得很好的Ansible 剧本 (Ansible脚本)则假定尽可能少。 最好先告诉Ansible 克隆存储库。
将您的第一个任务添加到您的剧本:
---
- name
:
"Mirror a Git repo with Ansible"
hosts
: localhost
vars :
git_dir
: /tmp/soso.git
tasks
:
- name
:
"Clone the git repo"
git :
repo
: 'https://github.com/ozkl/soso.git'
dest
: '
{
{ git_dir
}
} '
clone
:
yes
update
:
yes
此示例使用开源的,类似Unix的操作系统索索作为存储库我想镜。 这是一个完全任意的选择,绝不意味着对该存储库的未来缺乏信心。 它还使用变量来引用目标文件夹/tmp/soso.git ,这现在很方便,并且如果您希望将此范围扩展为通用镜像脚本,也将在以后受益。 在现实生活中,您的工作机上可能会比/ tmp拥有更永久的位置,例如/home/gitmirrors/soso.git或/opt/gitmirrors/soso.git 。
运行您的剧本:
$ ansible-playbook mirror.yaml
首次运行该剧本时,Ansible会正确检测到Git存储库在本地尚不存在,因此将其克隆。
PLAY
[ Ansible Git mirror
] ********
TASK
[ Gathering Facts
] ***********
ok
:
[ localhost
]
TASK
[ Clone git repo
] ************
changed
:
[ localhost
]
PLAY RECAP ***********************
localhost
: ok=2 changed=1 failed=0
[
...
]
如果您再次运行该剧本,Ansible会正确检测到自上次运行以来没有任何更改,并且报告未执行任何操作:
localhost: ok = 2 changed = 0 failed = 0 [ ... ]
接下来,必须指示Ansible将存储库推送到另一个Git服务器。
git推
Ansible中的Git模块不提供推送功能,因此该过程的一部分是手动的。 但是,在将存储库推送到备用镜像之前,您必须拥有一个镜像,并且必须将镜像配置为备用远程服务器。
首先,您必须向您的Git配置添加备用遥控器。 因为Git配置文件是INI样式的配置,所以您可以使用ini_file Ansible模块轻松地添加所需的信息。 将此添加到您的剧本:
- name
:
"Add alternate remote"
ini_file
: dest=
{
{ git_dir
}
} /.git/config section='remote \
"mirrored\" ' option=url value='git@gitlab.com:example/soso-mirror.git'
tags
: configuration
为此,您必须在目标服务器(本例中为GitLab.com )上有一个空的存储库。 如果您需要在剧本中创建目标存储库,可以按照Steve Ovens的出色文章“ 如何使用Ansible通过SSH设置Git服务器”来完成 。
最后,直接使用Git将HEAD推送到备用遥控器:
- name
:
"Push the repo to alternate remote"
shell
: 'git --verbose --git-dir=
{
{ git_dir
}
} /.git push mirrored HEAD'
像往常一样运行该剧本,然后使该过程自动化,这样您就不必再次直接运行它了。 您可以使用变量和特定的Git命令来调整脚本以适合您的需求,但是通过常规的拉动和推送操作,可以确保驻留在一台服务器上的重要项目可以安全地镜像到另一台服务器上。
这是完整的参考书:
---
- name
:
"Mirror a Git repository with Ansible"
hosts
: localhost
vars :
git_dir
: /tmp/soso.git
tasks
:
- name
:
"Clone the Git repo"
git :
repo
: 'https://github.com/ozkl/soso.git'
dest
: '
{
{ git_dir
}
} '
clone
:
yes
update
:
yes
- name
:
"Add alternate remote"
ini_file
: dest=
{
{ git_dir
}
} /.git/config section='remote \
"mirrored\" ' option=url value='git@gitlab.com:example/soso-mirror.git'
tags
: configuration
- name
:
"Push the repo to alternate remote"
shell
: 'git --verbose --git-dir=
{
{ git_dir
}
} /.git push mirrored HEAD'
翻译自: https://opensource.com/article/19/11/how-host-github-gitlab-ansible