Ansible + auto git ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π° кластСр Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈ машини Π²ΠΎ ΠΎΠ±Π»Π°ΠΊΠΎΡ‚

Ansible + auto git ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π° кластСр Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈ машини Π²ΠΎ ΠΎΠ±Π»Π°ΠΊΠΎΡ‚

Π”ΠΎΠ±Π°Ρ€ Π΄Π΅Π½

ИмамС Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΎΠ±Π»Π°ΠΊ кластСри со Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈ машини Π²ΠΎ сСкоја ΠΎΠ΄ Π½ΠΈΠ². НиС смС домаќини Π½Π° Ρ†Π΅Π»ΠΈΠΎΡ‚ овој бизнис Π²ΠΎ Π₯Π΅Ρ†Π½Π΅Ρ€. Π’ΠΎ сСкој кластСр ΠΈΠΌΠ°ΠΌΠ΅ Π΅Π΄Π½Π° мастСр машина, ΠΎΠ΄ Π½Π΅Π° сС Π·Π΅ΠΌΠ° слика ΠΈ автоматски сС дистрибуира Π΄ΠΎ ситС Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈ машини Π²ΠΎ кластСрот.

Оваа шСма Π½Π΅ Π½ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ Π΄Π° Π³ΠΈ користимС gitlab-runners, бидСјќи ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ сС Ρ˜Π°Π²ΡƒΠ²Π°Π°Ρ‚ ΠΊΠΎΠ³Π° сС ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π°Π°Ρ‚ ΠΌΠ½ΠΎΠ³Ρƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ рСгистрирани Ρ‚Ρ€ΠΊΠ°Ρ‡ΠΈ, ΡˆΡ‚ΠΎ Π½Π΅ ΠΏΠΎΡ‚Ρ‚ΠΈΠΊΠ½Π° Π΄Π° најдСмС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π° Π³ΠΎ напишСмС овој напис/ΠΏΡ€ΠΈΡ€Π°Ρ‡Π½ΠΈΠΊ.

Ова Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ Π½Π΅ Π΅ Π½Π°Ρ˜Π΄ΠΎΠ±Ρ€Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, Π½ΠΎ ΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ изглСдашС ΡˆΡ‚ΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Сдноставно.

Π—Π° упатството, Π²Π΅ ΠΌΠΎΠ»ΠΈΠΌΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ΠΌΠ°Ρ‡ΠΊΠ°.

ΠŸΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π½Π° Π³Π»Π°Π²Π½Π°Ρ‚Π° машина:

  • python
  • ΠΎΠ΄ΠΈ
  • Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° со ssh ΠΊΠ»ΡƒΡ‡Π΅Π²ΠΈ

ΠžΠΏΡˆΡ‚ΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° автоматско ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ†Ρ€Π΅Π²Π°Ρ‚Π° Π½Π° ситС Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈ машини Π΅ Π΄Π΅ΠΊΠ° Π²ΠΈ Ρ‚Ρ€Π΅Π±Π° машина Π½Π° која ќС сС инсталира Ansible. Од ΠΎΠ²Π°Π° машина, ansible ќС испрати ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° git ΠΈ ќС ја рСстартира услугата ΡˆΡ‚ΠΎ Π΅ Π°ΠΆΡƒΡ€ΠΈΡ€Π°Π½Π°. Π—Π° ΠΎΠ²ΠΈΠ΅ Ρ†Π΅Π»ΠΈ, создадовмС посСбна Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ кластСритС ΠΈ инсталиравмС Π½Π° Π½Π΅Π°:

  • python
  • ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π΅Π½
  • gitlab-Ρ‚Ρ€ΠΊΠ°Ρ‡

Од организациски ΠΏΡ€Π°ΡˆΠ°ΡšΠ° - Ρ‚Ρ€Π΅Π±Π° Π΄Π° рСгистриратС gitlab-runner, Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ssh-keygen, Π΄Π° Π³ΠΎ поставитС Ρ˜Π°Π²Π½ΠΈΠΎΡ‚ ssh ΠΊΠ»ΡƒΡ‡ Π½Π° ΠΎΠ²Π°Π° машина Π½Π° .ssh/authorized_keys Π½Π° Π³Π»Π°Π²Π½Π°Ρ‚Π° машина, ΠΎΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ ја ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° 22 Π·Π° ансибил Π½Π° Π³Π»Π°Π²Π½Π°Ρ‚Π° машина.

Π‘Π΅Π³Π° ајдС Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ ansible

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Π½Π°ΡˆΠ°Ρ‚Π° Ρ†Π΅Π» Π΅ Π΄Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ сè ΡˆΡ‚ΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ. Π’ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° /etc/ansible/ansible.cfg ќС ја Π΄Π΅ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° host_key_checking = FalseΡ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ansible Π½Π΅ Π±Π°Ρ€Π° ΠΏΠΎΡ‚Π²Ρ€Π΄Π° Π·Π° Π½ΠΎΠ²ΠΈ машини.

Π‘Π»Π΅Π΄Π½ΠΎ, Ρ‚Ρ€Π΅Π±Π° автоматски Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° ansible, ΠΎΠ΄ ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ќС ја Π·Π΅ΠΌΠ΅ IP-Π°Ρ‚Π° Π½Π° ΠΌΠ°ΡˆΠΈΠ½ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ git pull.

НиС ја Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΎΠ²Π°Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ Hetzner's API, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја Π·Π΅ΠΌΠ΅Ρ‚Π΅ листата Π½Π° домаќини ΠΎΠ΄ Π²Π°ΡˆΠ°Ρ‚Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ AWS, Asure (ΠΈΠΌΠ°Ρ‚Π΅ API Π½Π΅ΠΊΠ°Π΄Π΅ Π·Π° ΠΏΡ€ΠΈΠΊΠ°ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ машини ΡˆΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚, Π½Π΅Π»ΠΈ?).

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° со Π·Π°Π»ΠΈΡ…ΠΈ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Π²Π°ΠΆΠ½Π° Π·Π° Ansible; Ρ‚Π°Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:

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

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

Π—Π° Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ Ρ‚Π°ΠΊΠ²Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, ќС Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Сдноставна скрипта (ајдС Π΄Π° ја Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ 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

Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Π΄Π°Π»ΠΈ Ansible Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ Π΅ ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π΅Π»ΡΠΊΠΈ со ΠΏΡ€ΠΈΠΌΠ°ΡšΠ΅ IP адрСси:

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

Π˜Π·Π»Π΅Π·ΠΎΡ‚ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΈ содрТи ΠΈΠΌΠΈΡšΠ°Ρ‚Π° Π½Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΈΡ‚Π΅ Π½Π° ΠΌΠ°ΡˆΠΈΠ½ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠΈ Π΅ ΠΈΠ·Π²Ρ€ΡˆΠ΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°.
НСколку Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ Π·Π° синтаксата:

  • /etc/ansible/./vm_list - Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° листа Π½Π° машини
  • -i - апсолутна ΠΏΠ°Ρ‚Π΅ΠΊΠ° Π΄ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° со Π·Π°Π»ΠΈΡ…ΠΈ
  • -m - ΠΊΠ°ΠΆΠΈ ansible Π΄Π° Π³ΠΎ користи ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ школка
  • -Π° Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΡ‚. БСкоја ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС внСсС ΠΎΠ²Π΄Π΅
  • Π³Ρ€ΡƒΠΏΠ° - ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π²Π°ΡˆΠΈΠΎΡ‚ кластСр. Ако Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΎΠ²Π° Π½Π° ситС кластСри, смСнСтС ја Π³Ρ€ΡƒΠΏΠ°Ρ‚Π° Π½Π° ситС

АјдС Π΄Π° ΠΎΠ΄ΠΈΠΌΠ΅ ΠΏΠΎΠ½Π°Ρ‚Π°ΠΌΡƒ - Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ git pull Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈ машини:

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

Ако Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ Π³Π»Π΅Π΄Π°ΠΌΠ΅ вСќС Π°ΠΆΡƒΡ€ΠΈΡ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΈΡΡ‚ΠΎΠ²Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ ΠΎΠ΄ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅Ρ‚ΠΎ, Ρ‚ΠΎΠ³Π°Ρˆ сè Ρ€Π°Π±ΠΎΡ‚ΠΈ.

Π‘Π΅Π³Π° сСто Ρ‚ΠΎΠ° бСшС Π½Π°ΠΌΠ΅Π½Π΅Ρ‚ΠΎ Π·Π° ΠΎΠ²Π°

АјдС Π΄Π° ја Π½Π°ΡƒΡ‡ΠΈΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° скрипта Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ автоматски ΠΊΠΎΠ³Π° сС ΠΎΠ±Π²Ρ€Π·ΡƒΠ²Π°ΠΌΠ΅ Π½Π° Π³Π»Π°Π²Π½Π°Ρ‚Π° Π³Ρ€Π°Π½ΠΊΠ° Π²ΠΎ gitlab

ΠŸΡ€Π²ΠΎ, Π΄Π° ја Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° скрипта ΠΏΠΎΡƒΠ±Π°Π²Π° ΠΈ Π΄Π° ја ставимС Π²ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠ½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° (Π΄Π° ја Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ exec_pull) -

#!/bin/bash

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

АјдС Π΄Π° ΠΎΠ΄ΠΈΠΌΠ΅ Π²ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° gitlab ΠΈ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΠΌΠ΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π²ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ .gitlab-ci.yml
Π’Π½Π°Ρ‚Ρ€Π΅ Π³ΠΎ ставамС слСдново:

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 

Π‘Γ¨ Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΎ. Π‘Π΅Π³Π° -

  • сС ΠΎΠ±Π²Ρ€Π·ΡƒΠ²Π°Π°Ρ‚
  • Мило ΠΌΠΈ Π΅ ΡˆΡ‚ΠΎ сС Ρ€Π°Π±ΠΎΡ‚ΠΈ

Кога ΠΏΡ€Π΅Ρ„Ρ€Π»Π°Ρ‚Π΅ .yml Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, само Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° услугата Π·Π° Π΄Π° сС рСстартира ΠΈ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° кластСрот Π½Π° кој ќС сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°Π°Ρ‚ ansible ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€