Ansible + aŭtomata git tiras aron da virtualaj maŝinoj en la nubo

Ansible + aŭtomata git tiras aron da virtualaj maŝinoj en la nubo

Bonan tagon

Ni havas plurajn nubaj aretojn kun granda nombro da virtualaj maŝinoj en ĉiu. Ni gastigas ĉi tiun tutan komercon ĉe Hetzner. En ĉiu areto ni havas unu majstran maŝinon, momentfoto estas prenita de ĝi kaj aŭtomate distribuita al ĉiuj virtualaj maŝinoj ene de la areto.

Ĉi tiu skemo ne permesas al ni uzi gitlab-runners normale, ĉar multaj problemoj aperas kiam multaj identaj registritaj kuristoj aperas, kio instigis nin trovi solvon kaj skribi ĉi tiun artikolon/manlibron.

Ĉi tio verŝajne ne estas plej bona praktiko, sed ĉi tiu solvo ŝajnis kiel eble plej oportuna kaj simpla.

Por la lernilo, bonvolu vidi katon.

Bezonataj pakaĵoj sur la majstra maŝino:

  • python
  • iri
  • dosiero kun ssh-klavoj

La ĝenerala principo por efektivigi aŭtomatan guttiron sur ĉiuj virtualaj maŝinoj estas, ke vi bezonas maŝinon sur kiu Ansible estos instalita. De ĉi tiu maŝino, ansible sendos git-tiri komandojn kaj rekomencos la servon, kiu estis ĝisdatigita. Por ĉi tiuj celoj, ni kreis apartan virtualan maŝinon ekster la aretoj kaj instalis sur ĝi:

  • python
  • ansible
  • gitlab-kuristo

Pri organizaj aferoj, vi devas registri gitlab-runner, fari ssh-keygen, alŝuti la publikan ssh-ŝlosilon de ĉi tiu maŝino al .ssh/authorized_keys sur la majstra maŝino, malfermu havenon 22 por ansible sur la majstra maŝino.

Nun ni agordu ansible

Ĉar nia celo estas aŭtomatigi ĉion, kio eblas. En dosiero /etc/ansible/ansible.cfg ni malkomentos la linion host_key_checking = Falsetiel ke ansible ne petas konfirmon de novaj maŝinoj.

Poste, vi devas aŭtomate generi inventardosieron por ansible, de kie ĝi prenos la ip de la maŝinoj sur kiuj vi devas fari git pull.

Ni generas ĉi tiun dosieron per la API de Hetzner, vi povas preni la liston de gastigantoj el via datumbazo AWS, Asure (vi havas API ie por montri viajn kurantajn maŝinojn, ĉu ne?).

La strukturo de la inventardosiero estas tre grava por Ansible; ĝi devus aspekti jene:

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

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

Por generi tian dosieron, ni faros simplan skripton (ni nomu ĝin 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

Estas tempo kontroli, ke Ansible funkcias kaj amikas ricevi IP-adresojn:

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

La eligo devus enhavi la gastigajn nomojn de la maŝinoj sur kiuj la komando estis efektivigita.
Kelkaj vortoj pri sintakso:

  • /etc/ansible/./vm_list - generi liston de maŝinoj
  • -i - absoluta vojo al la inventardosiero
  • -m - diru al ansible uzi la ŝelan modulon
  • -a estas la argumento. Ajna komando povas esti enigita ĉi tie
  • grupo — la nomo de via areto. Se vi devas fari tion sur ĉiuj aretoj, ŝanĝu grupon al ĉiuj

Ni iru plu - ni provu fari git pull sur niaj virtualaj maŝinoj:

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

Se en la eligo ni vidas jam ĝisdatigita aŭ malŝarĝo de la deponejo, tiam ĉio funkcias.

Nun ĉi tio estas por kio ĉio estis celita

Ni instruu nian skripton ruliĝi aŭtomate kiam oni transdonas al la majstra branĉo en gitlab

Unue, ni faru nian skripton pli bela kaj metu ĝin en ruleblan dosieron (ni nomu ĝin exec_pull) -

#!/bin/bash

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

Ni iru al nia gitlab kaj kreu dosieron en la projekto .gitlab-ci.yml
Ni enmetas la jenon:

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 

Ĉio estas preta. Nun -

  • fari kompromiton
  • Mi ĝojas, ke ĉio funkcias

Kiam vi transdonas .yml al aliaj projektoj, vi nur bezonas ŝanĝi la nomon de la servo por rekomenci kaj la nomon de la areto sur kiu la ansible-komandoj estos ekzekutitaj.

fonto: www.habr.com

Aldoni komenton