Kemungkinan + git otomatis menarik sekelompok mesin virtual di cloud

Kemungkinan + git otomatis menarik sekelompok mesin virtual di cloud

Selamat hari

Kami memiliki beberapa cluster cloud dengan sejumlah besar mesin virtual di setiap cluster. Kami menyelenggarakan seluruh bisnis ini di Hetzner. Di setiap cluster kami memiliki satu mesin master, snapshot diambil darinya dan secara otomatis didistribusikan ke semua mesin virtual dalam cluster.

Skema ini tidak memungkinkan kami untuk menggunakan gitlab-runners secara normal, karena banyak masalah muncul ketika banyak runner terdaftar yang identik muncul, yang mendorong kami untuk mencari solusi dan menulis artikel/panduan ini.

Ini mungkin bukan praktik terbaik, namun solusi ini tampak senyaman dan sesederhana mungkin.

Untuk tutorialnya silahkan lihat cat.

Paket yang diperlukan pada mesin master:

  • ular sanca
  • git
  • file dengan kunci ssh

Prinsip umum penerapan gut pull otomatis pada semua mesin virtual adalah Anda memerlukan mesin tempat Ansible akan diinstal. Dari mesin ini, kemungkinan akan mengirimkan perintah git pull dan memulai ulang layanan yang telah diperbarui. Untuk tujuan ini, kami membuat mesin virtual terpisah di luar cluster dan menginstal di dalamnya:

  • ular sanca
  • ansible
  • pelari gitlab

Dari masalah organisasi - Anda perlu mendaftarkan gitlab-runner, membuat ssh-keygen, mengunggah kunci ssh publik mesin ini ke .ssh/authorized_keys pada mesin master, buka port 22 untuk memungkinkan pada mesin master.

Sekarang mari kita konfigurasikan mungkin

Karena tujuan kami adalah mengotomatiskan segala sesuatu yang mungkin. Dalam berkas /etc/ansible/ansible.cfg kami akan menghapus komentar pada baris tersebut host_key_checking = Falsesehingga mungkin tidak meminta konfirmasi mesin baru.

Selanjutnya, Anda perlu secara otomatis membuat file inventaris jika memungkinkan, dari mana ia akan mengambil ip mesin yang perlu Anda lakukan git pull.

Kami membuat file ini menggunakan API Hetzner, Anda dapat mengambil daftar host dari database AWS, Asure, Anda (Anda memiliki API di suatu tempat untuk menampilkan mesin yang sedang berjalan, bukan?).

Struktur file inventaris sangat penting bagi Ansible; akan terlihat seperti ini:

[группа]
ip-адрес
ip-адрес

[группа2]
ip-адрес
ip-адрес

Untuk menghasilkan file seperti itu, kita akan membuat skrip sederhana (sebut saja 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

Saatnya memeriksa apakah Ansible berfungsi dan ramah dalam menerima alamat IP:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group

Outputnya harus berisi nama host mesin tempat perintah dijalankan.
Beberapa kata tentang sintaksis:

  • /etc/ansible/./vm_list - menghasilkan daftar mesin
  • -i - jalur absolut ke file inventaris
  • -m - beri tahu kemungkinan untuk menggunakan modul shell
  • -a adalah argumennya. Perintah apa pun dapat dimasukkan di sini
  • grup — nama cluster Anda. Jika Anda perlu melakukan ini pada semua cluster, ubah grup menjadi semua

Mari melangkah lebih jauh - coba lakukan git pull di mesin virtual kita:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group 

Jika pada output kita melihat sudah up to date atau dibongkar dari repositori, maka semuanya berfungsi.

Sekarang, untuk inilah semua itu dimaksudkan

Mari kita ajarkan skrip kita untuk berjalan secara otomatis saat melakukan komitmen ke cabang master di gitlab

Pertama, mari kita buat skrip kita lebih indah dan masukkan ke dalam file yang dapat dieksekusi (sebut saja exec_pull) -

#!/bin/bash

/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"

Mari buka gitlab kita dan buat file di proyek .gitlab-ci.yml
Kami memasukkan yang berikut ini ke dalam:

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 

Semuanya sudah siap. Sekarang -

  • membuat komitmen
  • Saya senang semuanya berfungsi

Saat mentransfer .yml ke proyek lain, Anda hanya perlu mengubah nama layanan yang akan dimulai ulang dan nama cluster tempat perintah yang memungkinkan akan dijalankan.

Sumber: www.habr.com

Tambah komentar