Ansible + 自動 git pull 到雲端中的虛擬機器叢集中

Ansible + 自動 git pull 到雲端中的虛擬機器叢集中

再會

我們有多個雲端集群,每個集群中都有大量虛擬機器。 我們在 Hetzner 主持整個業務。 在每個叢集中,我們有一台主機,從中取得快照並自動分發到叢集內的所有虛擬機器。

這個方案不允許我們正常使用 gitlab-runners,因為當出現許多相同的註冊運行器時會出現很多問題,這促使我們找到解決方法並寫了這篇文章/手冊。

這可能不是最佳實踐,但這個解決方案看起來盡可能方便和簡單。

教程請參考cat。

主機上需要的套件:

  • 蟒蛇
  • 混帳
  • 帶有 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

添加評論