再會
我們有多個雲端集群,每個集群中都有大量虛擬機器。 我們在 Hetzner 主持整個業務。 在每個叢集中,我們有一台主機,從中取得快照並自動分發到叢集內的所有虛擬機器。
這個方案不允許我們正常使用 gitlab-runners,因為當出現許多相同的註冊運行器時會出現很多問題,這促使我們找到解決方法並寫了這篇文章/手冊。
這可能不是最佳實踐,但這個解決方案看起來盡可能方便和簡單。
- 蟒蛇
- 混帳
- 帶有 ssh 金鑰的文件
在所有虛擬機器上實現自動腸道拉取的一般原則是,您需要一台安裝 Ansible 的機器。 在這台機器上,ansible 將發送 git pull 命令並重新啟動已更新的服務。 為此,我們在叢集外部創建了一個單獨的虛擬機器並安裝在其上:
- 蟒蛇
- ansible
- gitlab-runner
從組織問題來看 - 您需要註冊 gitlab-runner,製作 ssh-keygen,將本機的公共 ssh 金鑰上傳到 .ssh/authorized_keys
在主機上,為主機上的 ansible 開啟連接埠 22。
現在讓我們來設定ansible
因為我們的目標是實現一切可能的自動化。 在文件中 /etc/ansible/ansible.cfg
我們將取消註解該行 host_key_checking = False
這樣 ansible 就不會要求確認新機器。
接下來,您需要自動產生 ansible 的清單文件,從該文件中它將獲取您需要執行 git pull 的機器的 IP。
我們使用 Hetzner 的 API 產生此文件,您可以從 AWS、Asure 資料庫中取得主機清單(您在某處有一個 API 可以顯示正在運行的機器,對吧?)。
庫存文件的結構對於 Ansible 非常重要;它應該如下所示:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
為了產生這樣的文件,我們將製作一個簡單的腳本(我們稱之為 vm_list
):
#!/bin/bash
echo [group] > /etc/ansible/cloud_ip &&
"ваш CLI запрос на получение IP запущенных машин в кластере" >> /etc/ansible/cloud_ip
echo " " >> /etc/ansible/cloud_ip
echo [group2] > /etc/ansible/cloud_ip &&
"ваш CLI запрос на получение IP запущенных машин в другом кластере" >> /etc/ansible/cloud_ip
現在是時候檢查 Ansible 是否正常運作並且是否能夠友善地接收 IP 位址:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
輸出應包含執行命令的電腦的主機名稱。
關於語法的幾句話:
- /etc/ansible/./vm_list - 產生機器列表
- -i - 庫存檔案的絕對路徑
- -m - 告訴ansible使用shell模組
- -a 是參數。 可以在這裡輸入任何命令
- group — 您的叢集的名稱。 如果需要在所有叢集上執行此操作,請將群組變更為 all
讓我們更進一步 - 讓我們嘗試在虛擬機器上執行 git pull :
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
如果在輸出中我們看到已經是最新的或從儲存庫中卸載,則一切正常。
現在這就是一切的目的
讓我們教導我們的腳本在提交到 gitlab 中的 master 分支時自動執行
首先,讓我們的腳本變得更漂亮,並將其放入可執行檔中(我們稱之為 exec_pull) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
我們去我們的gitlab,在專案中創建一個文件 .gitlab-ci.yml
我們將以下內容放入其中:
variables:
GIT_STRATEGY: none
VM_GROUP: group
stages:
- pull
- restart
run_exec_pull:
stage: pull
script:
- /etc/ansible/exec_pull 'cd /path/to/project/'$CI_PROJECT_NAME' && git pull' $VM_GROUP
only:
- master
run_service_restart:
stage: restart
script:
- /etc/ansible/exec_pull 'your_app_stop && your_app_start' $VM_GROUP
only:
- master
一切準備就緒。 現在 -
- 做出承諾
- 我很高興一切正常
將 .yml 轉移到其他項目時,只需更改要重新啟動的服務的名稱以及將執行 ansible 命令的群集的名稱。
來源: www.habr.com