Ansible + auto git pull hodeiko makina birtualen multzo batean

Ansible + auto git pull hodeiko makina birtualen multzo batean

Egun ona

Hainbat hodei-kluster ditugu bakoitzean makina birtual ugarirekin. Hetzner-en antolatzen dugu gauza hau guztia. Kluster bakoitzean makina maisu bat dugu, bertatik argazki bat ateratzen da eta automatikoki klusterreko makina birtual guztietara banatzen da.

Eskema honek ez digu gitlab-runners normalean erabiltzen uzten, izan ere, arazo asko sortzen dira erregistratutako korrikalari berdin-berdinak agertzen direnean, eta horrek konponbidea bilatu eta artikulu/eskuliburu hau idaztera bultzatu gaitu.

Hau ez da praktikarik onena ziurrenik, baina irtenbide hau ahalik eta erosoena eta sinpleena zirudien.

Tutoriala ikusteko, ikusi cat.

Beharrezko paketeak makina nagusian:

  • python
  • git
  • fitxategia ssh gakoekin

Makina birtual guztietan gut pull automatikoa ezartzeko printzipio orokorra da Ansible instalatuko den makina bat behar duzula. Makina honetatik, ansiblek git pull komandoak bidaliko ditu eta eguneratu den zerbitzua berrabiaraziko du. Helburu horietarako, makina birtual bereizi bat sortu dugu klusterretatik kanpo eta bertan instalatu dugu:

  • python
  • ansible
  • gitlab-runner

Antolakuntza arazoetatik: gitlab-runner erregistratu, ssh-keygen egin, makina honen ssh gako publikoa kargatu behar duzu. .ssh/authorized_keys makina maisuan, ireki 22 ataka makina maisuan ansiblerako.

Orain konfigura dezagun ansible

Gure helburua posible den guztia automatizatzea baita. Fitxategian /etc/ansible/ansible.cfg lerroa komentatuko dugu host_key_checking = Falseberaz, ansiblek ez du eskatu makina berrien berrespena.

Ondoren, automatikoki sortu behar duzu ansible-rako inbentario-fitxategi bat, bertatik git pull egin behar duzun makinen ip-a hartuko du.

Fitxategi hau Hetzner-en APIa erabiliz sortzen dugu, zure AWS, Asure, datu-baseko ostalarien zerrenda har dezakezu (API bat duzu nonbait martxan dauden makinak bistaratzeko, ezta?).

Inbentario-fitxategiaren egitura oso garrantzitsua da Ansiblerentzat; honelakoa izan beharko luke:

[Π³Ρ€ΡƒΠΏΠΏΠ°]
ip-адрСс
ip-адрСс

[Π³Ρ€ΡƒΠΏΠΏΠ°2]
ip-адрСс
ip-адрСс

Horrelako fitxategi bat sortzeko, script soil bat egingo dugu (dei dezagun 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

Ansiblek funtzionatzen duela eta IP helbideak jasotzearekin atsegina dela egiaztatzeko garaia da:

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

Irteerak komandoa exekutatu den makinen ostalari-izenak izan behar ditu.
Sintaxiari buruzko hitz batzuk:

  • /etc/ansible/./vm_list - sortu makinen zerrenda
  • -i - inbentario fitxategirako bide absolutua
  • -m - esan ansible shell modulua erabiltzeko
  • -a da argumentua. Hemen edozein komando sar daiteke
  • taldea β€” zure kluster izena. Hau kluster guztietan egin behar baduzu, aldatu taldea guztietara

Goazen harago - saia gaitezen git pull egiten gure makina birtualetan:

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

Irteeran dagoeneko eguneratuta edo biltegitik deskargatzen ikusten badugu, dena funtzionatzen ari da.

Orain honetarako zen guztia

Irakatsi diezaiogun gure script-a automatikoki exekutatzen gitlab-en adar nagusiarekin konprometitzean

Lehenik eta behin, egin dezagun gure script-a ederragoa eta jar ditzagun fitxategi exekutagarri batean (dei dezagun exec_pull) -

#!/bin/bash

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

Goazen gure gitlab-era eta sortu fitxategi bat proiektuan .gitlab-ci.yml
Barruan honako hauek jarri ditugu:

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 

Dena prest dago. Orain -

  • konpromisoa hartu
  • Pozten naiz dena funtzionatzen ari delako

.yml beste proiektu batzuetara transferitzean, berrabiarazteko zerbitzuaren izena eta ansible komandoak exekutatuko diren kluster izena aldatu besterik ez duzu behar.

Iturria: www.habr.com

Gehitu iruzkin berria