如何使用 Ansible 同步 GitHub 和 GitLab


如何使用 Ansible 同步 GitHub 和 GitLab

文章插图
 
通过使用 Ansible 镜像 Git 存储库 , 保护对重要项目的访问 。-- Seth Kenlon(作者)
 
开源无处不在 。它在家里的计算机上、在工作场所的计算机上、在互联网上 , 并且很多都由 Git 管理 。由于 Git 是分布式的 , 因此许多人也将其视为一种众包的备份解决方案 。从理论上讲 , 每当有人将 Git 存储库克隆到其本地计算机时 , 他们就创建了该项目源代码的备份 。如果有 100 个人这样做 , 则存储库就有 100 个备份副本 。
从理论上讲 , 这可以缓解“灾难”的影响 , 例如当项目维护者 突然决定删除存储库 或 莫名其妙地阻止所有流量  , 导致开发人员们无头苍蝇般地寻找谁拥有主分支的最新版本 。类似的 , 整个代码托管站点也会消失 。没有人会想到 google Code、Microsoft CodePlex 或 Gitorious 会在鼎盛时期将被关闭 。
简而言之 , 如果在过去的几十年中互联网教给了我们一些东西 , 那就是依靠互联网神奇地创建备份并不是冗余的最可靠途径 。
此外 , 对于许多人来说 , 很多开源项目都托管在 GitHub 上是个问题 —— GitHub 并不是开放平台 。许多开发人员和用户都希望支持诸如 GitLab 之类的堆栈并与之交互 , 它具有开源社区版本 。
使用 Ansible 管理 GitGit 的去中心方式对于解决这个问题很有用 。使用纯 Git , 你可以使用一个 push 命令轻松地将其推到两个或多个存储库 。但是 , 为了使其在发生意外故障时有用 , 你必须经常与 Git 存储库进行交互(特别是推送) 。此外 , 即使你可能永远不会自己推送或拉出代码 , 也可能有一些要备份的存储库 。
但是 , 使用 Ansible , 你可以自动执行项目主分支(或其他任何分支)的 Git 拉取 , 然后自动进行存储库到“异地”镜像的 Git 推送 。换句话说 , 你可以让你的计算机定期从 GitHub 拉取并推送到 GitLab 或 Gitolite 或 Gitea(或你喜欢的任何 Git 托管主机) 。
Ansible 模块如果不是因其出色的模块集合 , 那么 Ansible 就没那么出色 。像 Python 的第三方库或 linux 的应用程序一样 , 这个技术引擎的一个有用而令人惊讶的简单技巧是 , Ansible 以其他人贡献的组件而闻名 。因为本文正在研究如何有效和可靠地备份 Git 存储库 , 所以这里使用的模块是 Git 模块 和 ini_file 模块 。
首先 , 创建一个名为 mirror.yaml 的文件作为 剧本(playbook) 。你可以像通常使用 Ansible 一样 , 从 name 和 task 条目开始 。本示例将 localhost 添加到 hosts 列表中 , 以便在控制器计算机(你现在坐在前面的计算机)上运行 动作(play) , 但是在现实生活中 , 你可能会在特定的主机或一组网络上的主机上运行它 。
---- name: "Mirror a Git repo with Ansible"hosts: localhosttasks:Git 拉取和克隆如果要进行备份 , 则需要最新代码的副本 。明显 , 在 Git 仓库中实现这一目标的方法是执行 git pull 。但是 , pull 会假定克隆已经存在 , 而写得很好的 Ansible 动作(Ansible 脚本)则尽可能少的假定 。最好告诉 Ansible 先克隆存储库 。
将你的第一个任务添加到剧本:
---- name: "Mirror a Git repo with Ansible"hosts: localhostvars:git_dir: /tmp/soso.gittasks:- name: "Clone the git repo"git: repo: 'https://github.com/ozkl/soso.git' dest: '{{ git_dir }}' clone: yes update: yes这个例子使用了开源的、类似于 Unix 的操作系统 soso 作为我要镜像的存储库 。这是一个完全任意的选择 , 绝不意味着我对该存储库的未来缺乏信心 。它还使用变量来引用目标文件夹 /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 [...]


推荐阅读