您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)怎么使用Ansible同步GitHub和GitLab,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
通過使用 Ansible 鏡像 Git 存儲庫,保護(hù)對重要項(xiàng)目的訪問。
開源無處不在。它在家里的計(jì)算機(jī)上、在工作場所的計(jì)算機(jī)上、在互聯(lián)網(wǎng)上,并且很多都由 Git 管理。由于 Git 是分布式的,因此許多人也將其視為一種眾包的備份解決方案。從理論上講,每當(dāng)有人將 Git 存儲庫克隆到其本地計(jì)算機(jī)時,他們就創(chuàng)建了該項(xiàng)目源代碼的備份。如果有 100 個人這樣做,則存儲庫就有 100 個備份副本。
從理論上講,這可以緩解“災(zāi)難”的影響,例如當(dāng)項(xiàng)目維護(hù)者突然決定刪除存儲庫或莫名其妙地阻止所有流量,導(dǎo)致開發(fā)人員們無頭蒼蠅般地尋找誰擁有主分支的最新版本。類似的,整個代碼托管站點(diǎn)也會消失。沒有人會想到 Google Code、Microsoft CodePlex 或 Gitorious 會在鼎盛時期將被關(guān)閉。
簡而言之,如果在過去的幾十年中互聯(lián)網(wǎng)教給了我們一些東西,那就是依靠互聯(lián)網(wǎng)神奇地創(chuàng)建備份并不是冗余的最可靠途徑。
此外,對于許多人來說,很多開源項(xiàng)目都托管在 GitHub 上是個問題 —— GitHub 并不是開放平臺。許多開發(fā)人員和用戶都希望支持諸如 GitLab 之類的堆棧并與之交互,它具有開源社區(qū)版本。
Git 的去中心方式對于解決這個問題很有用。使用純 Git,你可以使用一個 push
命令輕松地將其推到兩個或多個存儲庫。但是,為了使其在發(fā)生意外故障時有用,你必須經(jīng)常與 Git 存儲庫進(jìn)行交互(特別是推送)。此外,即使你可能永遠(yuǎn)不會自己推送或拉出代碼,也可能有一些要備份的存儲庫。
但是,使用 Ansible,你可以自動執(zhí)行項(xiàng)目主分支(或其他任何分支)的 Git 拉取,然后自動進(jìn)行存儲庫到“異地”鏡像的 Git 推送。換句話說,你可以讓你的計(jì)算機(jī)定期從 GitHub 拉取并推送到 GitLab 或 Gitolite 或 Gitea(或你喜歡的任何 Git 托管主機(jī))。
如果不是因其出色的模塊集合,那么 Ansible 就沒那么出色。像 Python 的第三方庫或 Linux 的應(yīng)用程序一樣,這個技術(shù)引擎的一個有用而令人驚訝的簡單技巧是,Ansible 以其他人貢獻(xiàn)的組件而聞名。因?yàn)楸疚恼谘芯咳绾斡行Ш涂煽康貍浞? Git 存儲庫,所以這里使用的模塊是 Git 模塊和 ini_file 模塊。
首先,創(chuàng)建一個名為 mirror.yaml
的文件作為劇本。你可以像通常使用 Ansible 一樣,從 name
和 task
條目開始。本示例將 localhost
添加到 hosts
列表中,以便在控制器計(jì)算機(jī)(你現(xiàn)在坐在前面的計(jì)算機(jī))上運(yùn)行動作,但是在現(xiàn)實(shí)生活中,你可能會在特定的主機(jī)或一組網(wǎng)絡(luò)上的主機(jī)上運(yùn)行它。
---- name: "Mirror a Git repo with Ansible" hosts: localhost tasks:
如果要進(jìn)行備份,則需要最新代碼的副本。明顯,在 Git 倉庫中實(shí)現(xiàn)這一目標(biāo)的方法是執(zhí)行 git pull
。 但是,pull
會假定克隆已經(jīng)存在,而寫得很好的 Ansible 動作(Ansible 腳本)則盡可能少的假定。最好告訴 Ansible 先克隆存儲庫。
將你的第一個任務(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
這個例子使用了開源的、類似于 Unix 的操作系統(tǒng) soso 作為我要鏡像的存儲庫。這是一個完全任意的選擇,絕不意味著我對該存儲庫的未來缺乏信心。它還使用變量來引用目標(biāo)文件夾 /tmp/soso.git
,這很方便,并且如果以后你希望將它擴(kuò)展為一個通用的鏡像腳本也會受益。在現(xiàn)實(shí)生活中,你的工作機(jī)上可能會比 /tmp
具有更永久的位置,例如 /home/gitmirrors/soso.git
或 /opt/gitmirrors/soso.git
。
運(yùn)行你的劇本:
$ ansible-playbook mirror.yaml
首次運(yùn)行該劇本時,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 [...]
如果你再次運(yùn)行該劇本,Ansible 會正確檢測到自上次運(yùn)行以來沒有任何更改,并且會報(bào)告未執(zhí)行任何操作:
localhost: ok=2 changed=0 failed=0 [...]
接下來,必須指示 Ansible 將存儲庫推送到另一個 Git 服務(wù)器。
Ansible 中的 Git 模塊不提供 push
功能,因此該過程的一部分是手動的。但是,在將存儲庫推送到備用鏡像之前,你必須具有一個鏡像,并且必須將鏡像配置為備用遠(yuǎn)程服務(wù)器。
首先,必須將備用的遠(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='git@gitlab.com:example/soso-mirror.git' tags: configuration
為此,你必須在目標(biāo)服務(wù)器上有一個空的存儲庫(在本例中為 GitLab.com)。如果需要在劇本中創(chuàng)建目標(biāo)存儲庫,可以按照 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)行該劇本,然后使該過程自動化,這樣你就不必再次直接運(yùn)行它了。你可以使用變量和特定的 Git 命令來調(diào)整腳本以適應(yīng)你的需求,但是通過常規(guī)的拉取和推送操作,可以確保駐留在一臺服務(wù)器上的重要項(xiàng)目可以安全地鏡像到另一臺服務(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='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'
關(guān)于“怎么使用Ansible同步GitHub和GitLab”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。