良い一日
それぞれに多数の仮想マシンを備えたクラウド クラスターがいくつかあります。 私たちはこのビジネス全体を Hetzner でホストしています。 各クラスターにはマスター マシンが XNUMX 台あり、そこからスナップショットが取得され、クラスター内のすべての仮想マシンに自動的に配布されます。
このスキームでは gitlab-runners を通常に使用することはできません。同一の登録済みランナーが多数出現すると多くの問題が発生するため、回避策を見つけてこの記事/マニュアルを作成することになりました。
これはおそらくベスト プラクティスではありませんが、この解決策は可能な限り便利で簡単だと思われました。
チュートリアルについては、cat を参照してください。
マスター マシンに必要なパッケージ:
- パイソン
- git
- SSHキーを含むファイル
すべての仮想マシンに自動ガット プルを実装する一般原則は、Ansible がインストールされるマシンが必要であるということです。 このマシンから、ansible は git pull コマンドを送信し、更新されたサービスを再起動します。 これらの目的のために、クラスターの外部に別の仮想マシンを作成し、そこにインストールしました。
- パイソン
- アンシブル
- gitlab ランナー
組織的な問題から - 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 に指示します
- -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 コマンドが実行されるクラスターの名前を変更するだけです。
出所: habr.com