Ansible + avtomatik git buludda virtual maşınlar toplusunda pull

Ansible + avtomatik git buludda virtual maşınlar toplusunda pull

Yaxşı gün

Hər birində çoxlu sayda virtual maşın olan bir neçə bulud klasterimiz var. Biz bütün bu işi Hetzner-də keçiririk. Hər klasterdə bir master maşınımız var, ondan bir şəkil götürülür və avtomatik olaraq klasterdəki bütün virtual maşınlara paylanır.

Bu sxem bizə gitlab-runners-dən normal istifadə etməyə imkan vermir, çünki bir çox eyni qeydiyyatdan keçmiş qaçışçılar peyda olanda çoxlu problemlər yaranır ki, bu da bizi həll yolu tapmağa və bu məqaləni/təlimat yazmağa sövq etdi.

Bu, yəqin ki, ən yaxşı təcrübə deyil, lakin bu həll mümkün qədər rahat və sadə görünürdü.

Dərslik üçün pişiyə baxın.

Master maşında tələb olunan paketlər:

  • python
  • git
  • ssh düymələri ilə fayl

Bütün virtual maşınlarda avtomatik gut pull tətbiqinin ümumi prinsipi ondan ibarətdir ki, sizə Ansible-ın quraşdırılacağı maşın lazımdır. Bu maşından ansible git pull əmrləri göndərəcək və yenilənmiş xidməti yenidən işə salacaq. Bu məqsədlər üçün biz klasterlərdən kənarda ayrıca virtual maşın yaratdıq və ona quraşdırdıq:

  • python
  • ansible
  • gitlab-runner

Təşkilati məsələlərdən - gitlab-runner-ı qeydiyyatdan keçirməli, ssh-keygen yaratmalı, bu maşının ictimai ssh açarını yükləməlisiniz. .ssh/authorized_keys master maşında, master maşında ansible üçün port 22-ni açın.

İndi ansible-i konfiqurasiya edək

Çünki bizim məqsədimiz mümkün olan hər şeyi avtomatlaşdırmaqdır. Faylda /etc/ansible/ansible.cfg xəttin şərhini ləğv edəcəyik host_key_checking = Falsebelə ki, ansible yeni maşınların təsdiqini tələb etməsin.

Sonra, avtomatik olaraq ansible üçün inventar faylı yaratmalısınız, oradan git pull etməli olduğunuz maşınların ipini götürəcək.

Biz bu faylı Hetzner API-dən istifadə edərək yaradırıq, siz hostların siyahısını AWS, Asure, verilənlər bazanızdan götürə bilərsiniz (işləyən maşınlarınızı göstərmək üçün haradasa API-niz var, elə deyilmi?).

İnventar faylının strukturu Ansible üçün çox vacibdir; o, belə görünməlidir:

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

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

Belə bir fayl yaratmaq üçün sadə bir skript hazırlayacağıq (gəlin onu çağıraq 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-ın işlədiyini və IP ünvanlarını qəbul etməklə dost olduğunu yoxlamağın vaxtıdır:

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

Çıxışda əmrin yerinə yetirildiyi maşınların host adları olmalıdır.
Sintaksis haqqında bir neçə söz:

  • /etc/ansible/./vm_list - maşınların siyahısını yaradır
  • -i - inventar faylına mütləq yol
  • -m - ansible-a qabıq modulundan istifadə etməyi söyləyin
  • -a arqumentdir. Burada istənilən əmr daxil edilə bilər
  • qrup — klasterinizin adı. Bunu bütün klasterlərdə etmək lazımdırsa, qrupu hamıya dəyişin

Gəlin daha da irəli gedək - virtual maşınlarımızda git pull etməyə çalışaq:

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

Çıxışda artıq aktual olduğunu və ya depodan boşaldılmasını görürüksə, deməli hər şey işləyir.

İndi bütün bunlar bunun üçün nəzərdə tutulmuşdu

Skriptimizi gitlab-da master filialına bağlayarkən avtomatik işləməyi öyrədək

Əvvəlcə skriptimizi daha da gözəlləşdirək və onu icra olunan fayla yerləşdirək (gəlin buna exec_pull deyək) -

#!/bin/bash

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

Gəlin gitlabımıza keçək və layihədə fayl yaradaq .gitlab-ci.yml
İçərisinə aşağıdakıları qoyuruq:

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 

Hamısı hazırdır. İndi -

  • öhdəlik götürmək
  • Hər şeyin işlədiyinə şadam

.yml-ni başqa layihələrə köçürərkən, sadəcə olaraq yenidən işə salınacaq xidmətin adını və ansible əmrlərin yerinə yetiriləcəyi klasterin adını dəyişmək kifayətdir.

Mənbə: www.habr.com

Добавить комментарий