Laba diena
Mums ir vairākas mākoņu kopas ar lielu skaitu virtuālo mašīnu katrā. Mēs uzņemam visu šo uzņēmumu Hetzner. Katrā klasterī mums ir viena galvenā mašīna, no tās tiek uzņemts momentuzņēmums un automātiski izplatīts visām klastera virtuālajām mašīnām.
Šī shēma neļauj mums normāli izmantot gitlab-runners, jo, parādoties daudziem identiski reģistrētiem skrējējiem, rodas daudz problēmu, kas lika mums atrast risinājumu un uzrakstīt šo rakstu/rokasgrāmatu.
Iespējams, ka šī nav labākā prakse, taču šis risinājums šķita pēc iespējas ērtāks un vienkāršāks.
Apmācību skatiet sadaļā kat.
Nepieciešamās paketes galvenajā mašīnā:
- pitons
- iet
- failu ar ssh atslēgām
Vispārīgais automātiskās gut pull ieviešanas princips visās virtuālajās mašīnās ir tāds, ka jums ir nepieciešama mašīna, kurā tiks instalēta Ansible. No šīs mašīnas ansible nosūtīs git pull komandas un restartēs atjaunināto pakalpojumu. Šiem nolūkiem mēs izveidojām atsevišķu virtuālo mašīnu ārpus klasteriem un instalējām tajā:
- pitons
- ansible
- gitlab-runner
No organizatoriskām problēmām - jāreģistrē gitlab-runner, jāizveido ssh-keygen, jāaugšupielādē šīs mašīnas publiskā ssh atslēga uz .ssh/authorized_keys
galvenajā iekārtā atveriet 22. portu, lai nodrošinātu iespēju galvenajā mašīnā.
Tagad konfigurēsim ansible
Tā kā mūsu mērķis ir automatizēt visu iespējamo. Failā /etc/ansible/ansible.cfg
mēs atcelsim rindiņas komentārus host_key_checking = False
lai ansible neprasa apstiprinājumu jaunām mašīnām.
Tālāk jums ir automātiski jāģenerē ansible inventāra fails, no kura tas paņems to mašīnu IP adreses, kurās jums jāveic git pull.
Mēs ģenerējam šo failu, izmantojot Hetzner API, jūs varat ņemt resursdatoru sarakstu no savas AWS, Asure, datu bāzes (jums kaut kur ir API, lai parādītu jūsu darbojošās mašīnas, vai ne?).
Inventāra faila struktūra ir ļoti svarīga Ansible; tai vajadzētu izskatīties šādi:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
Lai ģenerētu šādu failu, mēs izveidosim vienkāršu skriptu (sauksim to 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
Ir pienācis laiks pārbaudīt, vai Ansible darbojas un ir draudzīgs ar IP adrešu saņemšanu:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Izvadā jāiekļauj to mašīnu resursdatora nosaukumi, kurās komanda tika izpildīta.
Daži vārdi par sintaksi:
- /etc/ansible/./vm_list — izveido mašīnu sarakstu
- -i - absolūtais ceļš uz inventāra failu
- -m - norāda, ka ir iespējams izmantot čaulas moduli
- -a ir arguments. Šeit var ievadīt jebkuru komandu
- grupa — jūsu klastera nosaukums. Ja jums tas jādara visos klasteros, mainiet grupu uz visiem
Dosimies tālāk — mēģināsim veikt git pull mūsu virtuālajās mašīnās:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Ja izvadā mēs redzam jau atjauninātu vai izkraušanu no repozitorija, tad viss darbojas.
Tagad tas viss bija paredzēts
Mācīsim mūsu skriptu palaist automātiski, uzņemoties galveno zaru programmā gitlab
Vispirms padarīsim savu skriptu skaistāku un ievietosim to izpildāmā failā (sauksim to par exec_pull) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Dosimies uz mūsu Gitlab un izveidosim failu projektā .gitlab-ci.yml
Iekšā ievietojam sekojošo:
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
Viss ir gatavs. Tagad -
- apņemties
- Priecājos, ka viss strādā
Pārsūtot .yml uz citiem projektiem, jums vienkārši jāmaina restartējamā pakalpojuma nosaukums un klastera nosaukums, kurā tiks izpildītas iespējamās komandas.
Avots: www.habr.com