通过使用Ansible镜像Git存储库来保护对重要项目的访问。开源无处不在。它在您的家庭计算机上,在您工作场所的计算机上,在Internet上,并且很多都是由Git管理的。因为Git是分布式的,所以很多人也将其视为众包备份解决方案。理论上,只要有人将Git存储库克隆到他们的本地计算机,他们就会创建项目源代码的备份。如果100人这样做,则存储库有100个备份副本。从理论上讲,这可以减轻“灾难”的影响,例如当项目维护者突然决定删除存储库或莫名其妙地阻止所有流量时,让开发人员争先恐后地找出谁拥有最新版本的master分支。同样,整个代码托管站点都会消失。没有人认为GoogleCode、MicrosoftCodePlex或Gitorious会在鼎盛时期被关闭。简而言之,如果互联网在过去几十年中教会了我们任何东西,那就是依靠互联网神奇地创建备份并不是实现冗余的最可靠途径。此外,对于许多人来说,许多开源项目都托管在GitHub上是一个问题——GitHub不是一个开放平台。许多开发人员和用户希望支持GitLab等堆栈并与之交互,它有一个开源社区版本。Git使用Ansible去中心化管理Git的方式对于解决这个问题很有用。使用纯Git,您可以使用单个推送命令轻松推送到两个或多个存储库。但是,为了使其在发生意外故障时有用,您必须经常与Git存储库交互(尤其是推送)。此外,即使您可能永远不会自己推送或拉取代码,也可能有您想要备份的存储库。但是,使用Ansible,您可以自动执行项目主分支(或任何其他分支)的Git拉取,然后将存储库Git推送到“异地”镜像。换句话说,您可以让您的计算机定期从GitHub拉取并推送到GitLab或Gitolite或Gitea(或您喜欢的任何Git托管主机)。Ansible模块如果没有大量的模块,Ansible就不会如此出色。与适用于Python的第三方库或适用于Linux的应用程序一样,此技术引擎的一个有用且非常简单的技巧是Ansible以其他人贡献的组件而闻名。由于本文研究的是如何有效且可靠地备份Git存储库,因此此处使用的模块是Git模块和ini_file模块。首先,创建一个名为mirror.yaml的文件作为剧本。您可以像通常使用Ansible一样从名称和任务条目开始。此示例将本地主机添加到主机列表以在控制器计算机(您现在坐在前面的那台)上运行动作游戏,但在现实生活中,您可能在特定主机上或网络上的一组主机上运行它。----name:"MirroraGitrepowithAnsible"hosts:localhosttasks:Gitpullandclone如果你想做备份,你需要最新代码的副本。在Git存储库中执行此操作的明显方法是执行gitpull。然而,pull假设克隆已经存在,而编写良好的Ansible操作(Ansible脚本)假设尽可能少。最好告诉Ansible先克隆存储库。将你的第一个任务添加到剧本中:----name:"MirroraGitrepowithAnsible"hosts:localhostvars:git_dir:/tmp/soso.gittasks:-name:"Clonethegitrepo"git:repo:'https://github.com/ozkl/soso.git'dest:'{{git_dir}}'clone:yesupdate:yes本例使用开源类Unix操作系统soso作为镜像仓库。这是一个完全随意的选择,绝不意味着我对这个存储库的未来缺乏信心。它还使用变量来引用目标文件夹/tmp/soso.git,这很方便,如果您以后想将其扩展为通用镜像脚本,也很有用。在现实生活中,您的工作机器上可能有一个比/tmp更永久的位置,例如/home/gitmirrors/soso.git或/opt/gitmirrors/soso.git。运行您的playbook:$ansible-playbookmirror.yaml第一次运行playbook时,Ansible正确检测到Git存储库在本地尚不存在,因此它会克隆它。PLAY[AnsibleGitmirror]*********TASK[GatheringFacts]*************ok:[localhost]TASK[Clonegitrepo]***********已更改:[localhost]PLAYRECAP*************************localhost:ok=2changed=1failed=0[...]如果您再次运行该剧本,并且Ansible正确检测到自上次运行以来没有任何变化,并报告未采取任何行动:localhost:ok=2changed=0failed=0[...]接下来,必须指示Ansible将存储库推送到另一个Git服务器。Git推送Ansible中的Git模块不提供推送功能,因此部分过程是手动的。但是,在将存储库推送到备用镜像之前,您必须有一个镜像,并且该镜像必须配置为备用远程。首先,必须将备用远程服务器添加到Git配置中。由于Git配置文件是INI风格的配置,您可以使用ini_fileAnsible模块轻松添加所需的信息。将此添加到您的剧本中:-name:"Addalternateremote"ini_file:dest={{git_dir}}/.git/configsection='remote\"mirrored\"'option=urlvalue='git@gitlab.com:example/soso-mirror.git'tags:configuration为此,您必须在目标服务器(本例中为GitLab.com)上有一个空存储库。如果您需要在您的playbook中创建一个目标存储库,您可以按照SteveOvens的优秀文章《如何使用 Ansible 通过 SSH 设置 Git 服务器》进行操作。最后,直接使用Git将HEAD推送到备用远程:-name:"Pushtherepotoalternateremote"shell:'git--verbose--git-dir={{git_dir}}/.gitpushmirroredHEAD'就像Run像往常一样运行playbook,然后自动执行该过程,这样您就不必再次直接运行它。您可以使用变量和特定的Git命令来调整脚本以满足您的需要,但通过定期的拉取和推送操作,您可以确保驻留在一台服务器上的重要项目可以安全地镜像到另一台服务器上。这是完整的参考手册:----name:"MirroraGitrepositorywithAnsible"hosts:localhostvars:git_dir:/tmp/soso.gittasks:-name:"ClonetheGitrepo"git:repo:'https://github.com/ozkl/soso.git'dest:'{{git_dir}}'clone:yesupdate:yes-name:"Addalternateremote"ini_file:dest={{git_dir}}/.git/configsection='remote\"mirrored\"'option=urlvalue='git@gitlab.com:example/soso-mirror.git'tags:configuration-name:"Pushtherepotoalternateremote"shell:'git--verbose--git-dir={{git_dir}}/.git推送镜像HEAD'
