新聞中心
通過使用 Ansible 鏡像 Git 存儲(chǔ)庫,保護(hù)對(duì)重要項(xiàng)目的訪問。

開源無處不在。它在家里的計(jì)算機(jī)上、在工作場所的計(jì)算機(jī)上、在互聯(lián)網(wǎng)上,并且很多都由 Git 管理。由于 Git 是分布式的,因此許多人也將其視為一種眾包的備份解決方案。從理論上講,每當(dāng)有人將 Git 存儲(chǔ)庫克隆到其本地計(jì)算機(jī)時(shí),他們就創(chuàng)建了該項(xiàng)目源代碼的備份。如果有 100 個(gè)人這樣做,則存儲(chǔ)庫就有 100 個(gè)備份副本。
從理論上講,這可以緩解“災(zāi)難”的影響,例如當(dāng)項(xiàng)目維護(hù)者突然決定刪除存儲(chǔ)庫或莫名其妙地阻止所有流量,導(dǎo)致開發(fā)人員們無頭蒼蠅般地尋找誰擁有主分支的最新版本。類似的,整個(gè)代碼托管站點(diǎn)也會(huì)消失。沒有人會(huì)想到 Google Code、Microsoft CodePlex 或 Gitorious 會(huì)在鼎盛時(shí)期將被關(guān)閉。
簡而言之,如果在過去的幾十年中互聯(lián)網(wǎng)教給了我們一些東西,那就是依靠互聯(lián)網(wǎng)神奇地創(chuàng)建備份并不是冗余的最可靠途徑。
此外,對(duì)于許多人來說,很多開源項(xiàng)目都托管在 GitHub 上是個(gè)問題 —— GitHub 并不是開放平臺(tái)。許多開發(fā)人員和用戶都希望支持諸如 GitLab 之類的堆棧并與之交互,它具有開源社區(qū)版本。
使用 Ansible 管理 Git
Git 的去中心方式對(duì)于解決這個(gè)問題很有用。使用純 Git,你可以使用一個(gè) push 命令輕松地將其推到兩個(gè)或多個(gè)存儲(chǔ)庫。但是,為了使其在發(fā)生意外故障時(shí)有用,你必須經(jīng)常與 Git 存儲(chǔ)庫進(jìn)行交互(特別是推送)。此外,即使你可能永遠(yuǎn)不會(huì)自己推送或拉出代碼,也可能有一些要備份的存儲(chǔ)庫。
但是,使用 Ansible,你可以自動(dòng)執(zhí)行項(xiàng)目主分支(或其他任何分支)的 Git 拉取,然后自動(dòng)進(jìn)行存儲(chǔ)庫到“異地”鏡像的 Git 推送。換句話說,你可以讓你的計(jì)算機(jī)定期從 GitHub 拉取并推送到 GitLab 或 Gitolite 或 Gitea(或你喜歡的任何 Git 托管主機(jī))。
Ansible 模塊
如果不是因其出色的模塊集合,那么 Ansible 就沒那么出色。像 Python 的第三方庫或 Linux 的應(yīng)用程序一樣,這個(gè)技術(shù)引擎的一個(gè)有用而令人驚訝的簡單技巧是,Ansible 以其他人貢獻(xiàn)的組件而聞名。因?yàn)楸疚恼谘芯咳绾斡行Ш涂煽康貍浞?Git 存儲(chǔ)庫,所以這里使用的模塊是 Git 模塊和 ini_file 模塊。
首先,創(chuàng)建一個(gè)名為 mirror.yaml 的文件作為劇本playbook。你可以像通常使用 Ansible 一樣,從 name 和 task 條目開始。本示例將 localhost 添加到 hosts 列表中,以便在控制器計(jì)算機(jī)(你現(xiàn)在坐在前面的計(jì)算機(jī))上運(yùn)行動(dòng)作play,但是在現(xiàn)實(shí)生活中,你可能會(huì)在特定的主機(jī)或一組網(wǎng)絡(luò)上的主機(jī)上運(yùn)行它。
---
- name: "Mirror a Git repo with Ansible"
hosts: localhost
tasks:Git 拉取和克隆
如果要進(jìn)行備份,則需要最新代碼的副本。明顯,在 Git 倉庫中實(shí)現(xiàn)這一目標(biāo)的方法是執(zhí)行 git pull。 但是,pull 會(huì)假定克隆已經(jīng)存在,而寫得很好的 Ansible 動(dòng)作(Ansible 腳本)則盡可能少的假定。最好告訴 Ansible 先克隆存儲(chǔ)庫。
將你的第一個(gè)任務(wù)添加到劇本:
---
- 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這個(gè)例子使用了開源的、類似于 Unix 的操作系統(tǒng) soso 作為我要鏡像的存儲(chǔ)庫。這是一個(gè)完全任意的選擇,絕不意味著我對(duì)該存儲(chǔ)庫的未來缺乏信心。它還使用變量來引用目標(biāo)文件夾 /tmp/soso.git,這很方便,并且如果以后你希望將它擴(kuò)展為一個(gè)通用的鏡像腳本也會(huì)受益。在現(xiàn)實(shí)生活中,你的工作機(jī)上可能會(huì)比 /tmp 具有更永久的位置,例如 /home/gitmirrors/soso.git 或 /opt/gitmirrors/soso.git。
運(yùn)行你的劇本:
$ ansible-playbook mirror.yaml首次運(yùn)行該劇本時(shí),Ansible 會(huì)正確檢測到 Git 存儲(chǔ)庫在本地尚不存在,因此將其克隆。
PLAY [Ansible Git mirror] ********
TASK [Gathering Facts] ***********
ok: [localhost]
TASK [Clone git repo] ************
changed: [localhost]
PLAY RECAP ***********************
localhost: ok=2 changed=1 failed=0 [...]如果你再次運(yùn)行該劇本,Ansible 會(huì)正確檢測到自上次運(yùn)行以來沒有任何更改,并且會(huì)報(bào)告未執(zhí)行任何操作:
localhost: ok=2 changed=0 failed=0 [...]接下來,必須指示 Ansible 將存儲(chǔ)庫推送到另一個(gè) Git 服務(wù)器。
Git 推送
Ansible 中的 Git 模塊不提供 push 功能,因此該過程的一部分是手動(dòng)的。但是,在將存儲(chǔ)庫推送到備用鏡像之前,你必須具有一個(gè)鏡像,并且必須將鏡像配置為備用遠(yuǎn)程服務(wù)器remote。
首先,必須將備用的遠(yuǎn)程服務(wù)器添加到 Git 配置。因?yàn)?Git 配置文件是 INI 樣式的配置,所以你可以使用 ini_file Ansible 模塊輕松地添加所需的信息。將此添加到你的劇本:
- name: "Add alternate remote"
ini_file: dest={{ git_dir }}/.git/config section='remote \"mirrored\"' option=url value='[email protected]:example/soso-mirror.git'
tags: configuration為此,你必須在目標(biāo)服務(wù)器上有一個(gè)空的存儲(chǔ)庫(在本例中為 GitLab.com)。如果需要在劇本中創(chuàng)建目標(biāo)存儲(chǔ)庫,可以按照 Steve Ovens 的出色文章《如何使用 Ansible 通過 SSH 設(shè)置 Git 服務(wù)器》來完成。
最后,直接使用 Git 將 HEAD 推送到備用遠(yuǎn)程服務(wù)器:
- name: "Push the repo to alternate remote"
shell: 'git --verbose --git-dir={{ git_dir }}/.git push mirrored HEAD'像往常一樣運(yùn)行該劇本,然后使該過程自動(dòng)化,這樣你就不必再次直接運(yùn)行它了。你可以使用變量和特定的 Git 命令來調(diào)整腳本以適應(yīng)你的需求,但是通過常規(guī)的拉取和推送操作,可以確保駐留在一臺(tái)服務(wù)器上的重要項(xiàng)目可以安全地鏡像到另一臺(tái)服務(wù)器上。
這是完整的劇本,供參考:
---
- 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='[email protected]:example/soso-mirror.git'
tags: configuration
- name: "Push the repo to alternate remote"
shell: 'git --verbose --git-dir={{ git_dir }}/.git push mirrored HEAD'文章標(biāo)題:如何使用 Ansible 同步 GitHub 和 GitLab
當(dāng)前地址:http://fisionsoft.com.cn/article/cosjgsd.html


咨詢
建站咨詢
