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 = False
belə 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