Ansible + auto git tarik dalam kelompok mesin maya dalam awan

Ansible + auto git tarik dalam kelompok mesin maya dalam awan

selamat hari

Kami mempunyai beberapa kluster awan dengan sejumlah besar mesin maya dalam setiap gugusan. Kami menganjurkan semua ini di Hetzner. Dalam setiap kluster kita mempunyai satu mesin induk, syot kilat diambil daripadanya dan diedarkan secara automatik kepada semua mesin maya dalam kluster.

Skim ini tidak membenarkan kami menggunakan gitlab-runners seperti biasa, kerana banyak masalah timbul apabila banyak pelari berdaftar yang sama muncul, yang mendorong kami untuk mencari penyelesaian dan menulis artikel/manual ini.

Ini mungkin bukan amalan terbaik, tetapi penyelesaian ini kelihatan semudah dan semudah mungkin.

Untuk tutorial, sila lihat kucing.

Pakej yang diperlukan pada mesin induk:

  • ular sawa
  • pergi
  • fail dengan kekunci ssh

Prinsip umum untuk melaksanakan tarikan usus automatik pada semua mesin maya ialah anda memerlukan mesin yang Ansible akan dipasang. Dari mesin ini, ansible akan menghantar arahan git pull dan memulakan semula perkhidmatan yang telah dikemas kini. Untuk tujuan ini, kami mencipta mesin maya yang berasingan di luar kelompok dan dipasang padanya:

  • ular sawa
  • ansible
  • gitlab-runner

Daripada isu organisasi - anda perlu mendaftar gitlab-runner, buat ssh-keygen, muat naik kunci ssh awam mesin ini ke .ssh/authorized_keys pada mesin induk, buka port 22 untuk ansible pada mesin induk.

Sekarang mari kita konfigurasikan ansible

Memandangkan matlamat kami adalah untuk mengautomasikan segala yang mungkin. Dalam fail /etc/ansible/ansible.cfg kami akan menyahkomen baris host_key_checking = Falsesupaya ansible tidak meminta pengesahan mesin baru.

Seterusnya, anda perlu menjana fail inventori secara automatik untuk ansible, dari mana ia akan mengambil ip mesin yang anda perlukan untuk melakukan git pull.

Kami menjana fail ini menggunakan API Hetzner, anda boleh mengambil senarai hos daripada pangkalan data AWS, Asure, anda (anda mempunyai API di suatu tempat untuk memaparkan mesin anda yang sedang berjalan, bukan?).

Struktur fail inventori adalah sangat penting untuk Ansible; ia sepatutnya kelihatan seperti ini:

[Π³Ρ€ΡƒΠΏΠΏΠ°]
ip-адрСс
ip-адрСс

[Π³Ρ€ΡƒΠΏΠΏΠ°2]
ip-адрСс
ip-адрСс

Untuk menjana fail sedemikian, kami akan membuat skrip mudah (mari namakannya 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

Sudah tiba masanya untuk menyemak bahawa ansible berfungsi dan mesra dengan menerima alamat IP:

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

Output harus mengandungi nama hos bagi mesin di mana perintah itu dilaksanakan.
Beberapa perkataan tentang sintaks:

  • /etc/ansible/./vm_list - jana senarai mesin
  • -i - laluan mutlak ke fail inventori
  • -m - beritahu ansible untuk menggunakan modul shell
  • -a ialah hujah. Sebarang arahan boleh dimasukkan di sini
  • kumpulan β€” nama kluster anda. Jika anda perlu melakukan ini pada semua kelompok, tukar kumpulan kepada semua

Mari pergi lebih jauh - mari cuba lakukan git pull pada mesin maya kami:

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

Jika dalam output kita melihat sudah dikemas kini atau memunggah dari repositori, maka semuanya berfungsi.

Sekarang ini adalah tujuan semua itu

Mari ajar skrip kami untuk dijalankan secara automatik apabila membuat komitmen kepada cawangan induk dalam gitlab

Mula-mula, mari kita jadikan skrip kita lebih cantik dan letakkannya dalam fail boleh laku (mari kita panggil exec_pull) -

#!/bin/bash

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

Mari pergi ke gitlab kami dan buat fail dalam projek .gitlab-ci.yml
Kami meletakkan perkara berikut di 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 

Semua dah siap. Sekarang -

  • buat komitmen
  • Saya gembira kerana semuanya berfungsi

Apabila memindahkan .yml ke projek lain, anda hanya perlu menukar nama perkhidmatan untuk dimulakan semula dan nama kluster di mana arahan ansible akan dilaksanakan.

Sumber: www.habr.com

Tambah komen