这篇文章主要介绍“怎么使用Ansible同步GitHub”,在日常操作中,相信很多人在怎么使用Ansible同步GitHub问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Ansible同步GitHub”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
使用 Ansible 管理 Git
Git 的去中心方式对于解决这个问题很有用。使用纯 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: localhost tasks:
Git 拉取和克隆
如果要进行备份,则需要最新代码的副本。明显,在 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 的操作系统 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 [...]
如果你再次运行该剧本,Ansible 会正确检测到自上次运行以来没有任何更改,并且会报告未执行任何操作:
localhost: ok=2 changed=0 failed=0 [...]
接下来,必须指示 Ansible 将存储库推送到另一个 Git 服务器。
Git 推送
Ansible 中的 Git 模块不提供 push 功能,因此该过程的一部分是手动的。但是,在将存储库推送到备用镜像之前,你必须具有一个镜像,并且必须将镜像配置为备用远程服务器remote。
首先,必须将备用的远程服务器添加到 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'
到此,关于“怎么使用Ansible同步GitHub”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!