Ansible + auto git komek makîneyên virtual di ewr de dikişîne

Ansible + auto git komek makîneyên virtual di ewr de dikişîne

Roj baş

Me çend komikên ewr hene ku di her yekê de hejmareke mezin makîneyên virtual hene. Em vê karsaziyê li Hetzner mêvandar dikin. Di her komê de makîneyek me ya sereke heye, wêneyek jê tê girtin û bixweber li hemî makîneyên virtual yên di nav komê de tê belav kirin.

Ev nexşe rê nade me ku em gitlab-runners bi normalî bikar bînin, ji ber ku gelek pirsgirêk derdikevin dema ku gelek bezvanên qeydkirî yên wekhev xuya dibin, ku ji me re hişt ku em rêgezek bibînin û vê gotar/destûrê binivîsin.

Dibe ku ev ne pratîka çêtirîn e, lê ev çareserî bi qasî ku gengaz û hêsan xuya bû.

Ji bo dersê, ji kerema xwe pisîkê bibînin.

Pakêtên pêwîst ên li ser makîneya masterê:

  • python
  • git
  • pelê bi bişkojkên ssh

Prensîba gelemperî ya bicîhkirina kişandina gutê ya otomatîkî li ser hemî makîneyên virtual ev e ku hûn hewceyê makîneyek ku Ansible li ser wê were saz kirin hewce ye. Ji vê makîneyê, ansible dê fermanên git pullê bişîne û karûbarê ku hatî nûve kirin ji nû ve bide destpêkirin. Ji bo van armancan, me makîneyek virtual ya cihêreng li derveyî koman çêkir û li ser saz kir:

  • python
  • ansible
  • gitlab-runner

Ji pirsgirêkên rêxistinî - hûn hewce ne ku gitlab-runner tomar bikin, ssh-keygen çêbikin, mifteya giştî ya ssh ya vê makîneyê barkirin .ssh/authorized_keys li ser makîneya masterê, porta 22 vekin ji bo ansible li ser makîneya masterê.

Naha werin em ansible mîheng bikin

Ji ber ku armanca me ew e ku em her tiştê ku mimkun e otomatîk bikin. Di pelê de /etc/ansible/ansible.cfg em ê rêzê şîrove bikin host_key_checking = Falseda ku ansible erêkirina makîneyên nû nepirse.

Dûv re, hûn hewce ne ku ji bo ansible pelek tomarokek bixweber biafirînin, ji ku derê ew ê ip-ya makîneyên ku hûn hewce ne ku git pull li ser wan bikin bigirin.

Em vê pelê bi karanîna API-ya Hetzner-ê diafirînin, hûn dikarin navnîşa mêvandaran ji AWS, Asure, databasa xwe bigirin (we li cîhek API heye ku hûn makîneyên xweyên xebitandinê nîşan bidin, rast?).

Struktura pelê envanterê ji bo Ansible pir girîng e; divê bi vî rengî xuya bike:

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

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

Ji bo ku pelek wusa çêbikin, em ê skrîptek hêsan çêbikin (ka em jê re bibêjin 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

Wext e ku meriv kontrol bike ka Ansible kar dike û bi wergirtina navnîşanên IP-ê re heval e:

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

Pêdivî ye ku encam navên mazûban ên makîneyên ku ferman li ser hatine bicîh kirin hebin.
Çend gotin li ser hevoksaziyê:

  • /etc/ansible/./vm_list - navnîşek makîneyan çêbike
  • -i - riya bêkêmasî ya pelê envanterê
  • -m - ji ansible re bêje ku modula şêlê bikar bîne
  • -a arguman e. Her fermanek dikare li vir were nivîsandin
  • kom - navê koma we. Heke hûn hewce ne ku vê yekê li ser hemî koman bikin, grûpê bi hemî biguherînin

Ka em pêşdetir biçin - em hewl bidin ku git pull li ser makîneyên xweya virtual bikin:

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

Ger di encam de em berê nûvekirî bibînin an ji depoyê dakêşin, wê hingê her tişt dixebite.

Niha ev e ya ku ew hemî ji bo wê bû

Werin em skrîpta xwe hîn bikin ku dema ku di gitlab-ê de şaxa masterê dimeşîne bixweber bixebite

Pêşî, bila skrîpta xwe xweştir bikin û wê têxin pelek îcrakar (ka em jê re bibêjin exec_pull) -

#!/bin/bash

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

Werin em biçin gitlab-a xwe û di projeyê de pelek çêbikin .gitlab-ci.yml
Em tiştên jêrîn danîn hundur:

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 

Hemî amade ye. Niha -

  • peymanek çêbikin
  • Ez kêfxweş im ku her tişt dixebite

Dema ku .yml vediguhezînin projeyên din, hûn tenê hewce ne ku navê karûbarê ji nû ve dest pê bike û navê koma ku dê fermanên ansible li ser wê bêne bicîh kirin biguhezînin.

Source: www.habr.com

Add a comment