Ansible + auto git tynnu mewn clwstwr o beiriannau rhithwir yn y cwmwl

Ansible + auto git tynnu mewn clwstwr o beiriannau rhithwir yn y cwmwl

Diwrnod da

Mae gennym sawl clwstwr cwmwl gyda nifer fawr o beiriannau rhithwir ym mhob un. Rydym yn cynnal y busnes cyfan hwn yn Hetzner. Ym mhob clwstwr mae gennym un prif beiriant, cymerir ciplun ohono a'i ddosbarthu'n awtomatig i bob peiriant rhithwir yn y clwstwr.

Nid yw'r cynllun hwn yn caniatáu i ni ddefnyddio rhedwyr gitlab fel arfer, gan fod llawer o broblemau'n codi pan fydd llawer o redwyr cofrestredig union yr un fath yn ymddangos, a ysgogodd ni i ddod o hyd i ateb ac ysgrifennu'r erthygl / llawlyfr hwn.

Mae'n debyg nad yw hyn yn arfer gorau, ond roedd yr ateb hwn yn ymddangos mor gyfleus a syml â phosibl.

Ar gyfer y tiwtorial, gweler cath.

Pecynnau gofynnol ar y prif beiriant:

  • python
  • git
  • ffeil gydag allweddi ssh

Yr egwyddor gyffredinol o weithredu tynnu perfedd awtomatig ar bob peiriant rhithwir yw bod angen peiriant arnoch y bydd Ansible yn cael ei osod arno. O'r peiriant hwn, bydd Ansible yn anfon gorchmynion tynnu git ac yn ailgychwyn y gwasanaeth sydd wedi'i ddiweddaru. At y dibenion hyn, fe wnaethom greu peiriant rhithwir ar wahân y tu allan i'r clystyrau a'i osod arno:

  • python
  • ansible
  • gitlab-redwr

O faterion trefniadol - mae angen i chi gofrestru gitlab-runner, gwneud ssh-keygen, lanlwytho allwedd ssh cyhoeddus y peiriant hwn i .ssh/authorized_keys ar y peiriant meistr, agor porthladd 22 ar gyfer ansible ar y peiriant meistr.

Nawr gadewch i ni ffurfweddu ansible

Gan mai ein nod yw awtomeiddio popeth sy'n bosibl. Mewn ffeil /etc/ansible/ansible.cfg byddwn yn dadwneud y llinell host_key_checking = Falsefel nad yw Ansible yn gofyn am gadarnhad o beiriannau newydd.

Nesaf, mae angen i chi gynhyrchu ffeil rhestr eiddo yn awtomatig ar gyfer anible, lle bydd yn cymryd ip y peiriannau y mae angen i chi dynnu git arnynt.

Rydyn ni'n cynhyrchu'r ffeil hon gan ddefnyddio API Hetzner, gallwch chi gymryd y rhestr o westeion o'ch cronfa ddata AWS, Asure (mae gennych chi API yn rhywle i arddangos eich peiriannau rhedeg, dde?).

Mae strwythur y ffeil rhestr eiddo yn bwysig iawn i Ansible; dylai edrych fel hyn:

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

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

I gynhyrchu ffeil o'r fath, byddwn yn gwneud sgript syml (gadewch i ni ei galw 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

Mae'n bryd gwirio bod Ansible yn gweithio a'i fod yn gyfeillgar â derbyn cyfeiriadau IP:

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

Dylai'r allbwn gynnwys enwau gwesteiwr y peiriannau y gweithredwyd y gorchymyn arnynt.
Ychydig eiriau am gystrawen:

  • /etc/ansible/./vm_list - cynhyrchu rhestr o beiriannau
  • -i - llwybr absoliwt i'r ffeil rhestr eiddo
  • -m - dweud wrth anible i ddefnyddio'r modiwl cragen
  • -a yw'r ddadl. Gellir nodi unrhyw orchymyn yma
  • grŵp—enw eich clwstwr. Os oes angen i chi wneud hyn ar bob clwstwr, newidiwch y grŵp i bawb

Awn ymhellach - gadewch i ni geisio tynnu git ar ein peiriannau rhithwir:

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

Os ydym yn gweld yn yr allbwn eisoes yn gyfredol neu'n dadlwytho o'r ystorfa, yna mae popeth yn gweithio.

Nawr dyma beth oedd y cyfan yn ei olygu

Gadewch i ni ddysgu ein sgript i redeg yn awtomatig wrth ymrwymo i'r brif gangen yn gitlab

Yn gyntaf, gadewch i ni wneud ein sgript yn fwy prydferth a'i roi mewn ffeil gweithredadwy (gadewch i ni ei alw'n exec_pull) -

#!/bin/bash

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

Gadewch i ni fynd i'n gitlab a chreu ffeil yn y prosiect .gitlab-ci.yml
Rydyn ni'n rhoi'r canlynol y tu mewn:

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 

Mae'r cyfan yn barod. Nawr -

  • gwneud ymrwymiad
  • Rwy'n falch bod popeth yn gweithio

Wrth drosglwyddo .yml i brosiectau eraill, does ond angen i chi newid enw'r gwasanaeth i ailgychwyn ac enw'r clwstwr y bydd y gorchmynion ansible yn cael eu gweithredu arno.

Ffynhonnell: hab.com

Ychwanegu sylw