Ansible + auto git pull virtuālo mašīnu klasterī mākonī

Ansible + auto git pull virtuālo mašīnu klasterī mākonī

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 = Falselai 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

Pievieno komentāru