Ansible + automatisk git pull i en kluster av virtuella maskiner i molnet

Ansible + automatisk git pull i en kluster av virtuella maskiner i molnet

God dag

Vi har flera molnkluster med ett stort antal virtuella maskiner i varje. Allt detta hostas hos Hetzner. I varje kluster har vi en master-maskin, frÄn vilken en snapshot tas och automatiskt sprids till alla virtuella maskiner inom klustret.

Denna lösning gör det omöjligt för oss att anvÀnda gitlab-runners korrekt, eftersom mÄnga problem uppstÄr nÀr flera identiska registrerade runners finns, vilket har lett till att vi letat efter en lösning och skrivit denna artikel/manual.

Detta kanske inte Àr best practice, men denna lösning verkar vara den mest bekvÀma och enkla.

För handledningen ber jag dig att lÀsa vidare.

NödvÀndiga paket pÄ master-maskinen:

  • python
  • git
  • fil med ssh-nycklar

Den allmÀnna principen för att implementera automatisk git pull pÄ alla virtuella maskiner innebÀr att det behövs en maskin dÀr Ansible Àr installerat. FrÄn denna maskin kommer ansible att skicka kommandon för git pull och starta om tjÀnsten som har uppdaterats. Vi har skapat en sÀrskild virtuell maskin utanför klustren för detta ÀndamÄl och installerat pÄ den:

  • python
  • ansible
  • gitlab-runner

NĂ€r det kommer till organisatoriska frĂ„gor — det Ă€r nödvĂ€ndigt att registrera gitlab-runner, göra ssh-keygen, och ladda upp den offentliga ssh-nyckeln frĂ„n denna maskin i .ssh/authorized_keys pĂ„ master-maskinen, öppna port 22 pĂ„ master-maskinen för ansible.

Nu ska vi konfigurera ansible

Eftersom vÄrt mÄl Àr att automatisera allt som möjligt. I filen /etc/ansible/ansible.cfg ska vi ta bort kommenteringen pÄ raden host_key_checking = False, sÄ att ansible inte frÄgar efter bekrÀftelse för nya maskiner.

DÀrefter Àr det nödvÀndigt att automatiskt generera en inventeringsfil för ansible, frÄn vilken den kommer att hÀmta ip-adresserna för maskinerna som behöver göra git pull.

Vi genererar denna fil med hjÀlp av API:et frÄn Hetzner, medan ni kan hÀmta listan med vÀrdar frÄn er AWS, Azure eller databas (ni har vÀl nÄgot API för att hÀmta era aktiva maskiner, eller?).

För Ansible Àr strukturen av inventeringsfilen mycket viktig, den ska se ut sÄ hÀr:

[grupp]
ip-adress
ip-adress

[grupp2]
ip-adress
ip-adress

För att generera en sÄdan fil ska vi göra ett enkelt skript (vi kallar det 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

Det Àr dags att kontrollera att ansible fungerar och vÀnjer sig vid att hÀmta ip-adresser:

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

I outputen ska vi fÄ vÀrdnamnen pÄ maskinerna dÀr kommandot utfördes.
NÄgra ord om syntaxen:

  • /etc/ansible/./vm_list — ĐłĐ”ĐœĐ”Ń€ĐžŃ€ŃƒĐ”ĐŒ ŃĐżĐžŃĐŸĐș ĐŒĐ°ŃˆĐžĐœ
  • -i — den absoluta sökvĂ€gen till inventeringsfilen
  • -m — berĂ€tta för Ansible att anvĂ€nda modulen shell
  • -a — argument. HĂ€r kan du skriva vilken kommando som helst
  • group — namnet pĂ„ din kluster. Om du vill göra det pĂ„ alla kluster, byt group till all

Vi gĂ„r vidare — lĂ„t oss försöka göra git pull pĂ„ vĂ„ra virtuella maskiner:

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

Om vi ser already up to date i output eller en nedladdning frÄn repositoryt, betyder det att allt fungerar.

Nu till det som det hÀr handlade om

LÄt oss lÀra vÄr skript att köras automatiskt vid commit i master-grenen i GitLab

Först gör vi vĂ„r skript snyggare och lĂ€gger den i en körbar fil (vi kallar den exec_pull) —

#!/bin/bash

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

Vi gÄr till vÄrt GitLab och skapar en fil i projektet .gitlab-ci.yml
Vi placerar följande inuti:

variabler:
  GIT_STRATEGY: none
  VM_GROUP: group

steg:
  - pull
  - restart

run_exec_pull:
  steg: pull
  skript:
  
   - /etc/ansible/exec_pull 'cd /path/to/project/'$CI_PROJECT_NAME' && git pull' $VM_GROUP
  
  endast:
  - master

run_service_restart:
  steg: restart
  skript:
 
   - /etc/ansible/exec_pull 'your_app_stop && your_app_start' $VM_GROUP
   
  endast:
  - master 

Allt Ă€r klart. Nu —

  • gör en commit
  • och förutsĂ€tter att allt fungerar

NÀr du flyttar .yml till andra projekt rÀcker det med att byta namn pÄ tjÀnsten för att starta om och namnet pÄ klustret dÀr Ansible-kommandon ska köras.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster