Ansible + Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ git pull Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° ΠΎΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² ΠΎΠ±Π»Π°ΠΊΠ°.

Ansible + Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ git pull Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° ΠΎΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² ΠΎΠ±Π»Π°ΠΊΠ°.

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

Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ с няколко ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° с голям Π±Ρ€ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² всСки ΠΎΡ‚ тях. Всичко Ρ‚ΠΎΠ²Π° сС хоства Π² Hetzner. Π’ΡŠΠ² всСки ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠΎ Π΅Π΄Π½Π° мастСр машина, ΠΎΡ‚ която сС ΠΏΡ€Π°Π²ΠΈ snapshot ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ сС разпространява ΠΏΠΎ всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΊΠΈ Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°.

Π’Π°Π·ΠΈ схСма Π½Π΅ Π½ΠΈ позволява Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ gitlab-runner-ΠΈΡ‚Π΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡ€ΠΈ появата Π½Π° мноТСство Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΈ рСгистрирани Ρ€ΡŠΠ½Π΅Ρ€ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½Π°ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Ρ…ΠΎΠ΄Π΅Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈ написванСто Π½Π° Ρ‚Π°Π·ΠΈ статия/Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ.

ВСроятно Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π°Ρ‚Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, Π½ΠΎ Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ изглСТдашС максимално ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ простичко.

Моля, слСдвайтС инструкциитС Π² Π΄ΠΎΠ»Π½Π°Ρ‚Π° част.

НСобходими ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π½Π° мастСр ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π°:

  • python
  • git
  • Ρ„Π°ΠΉΠ» с ssh ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅

ΠžΠ±Ρ‰ΠΈΡΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅Π½ git pull Π½Π° всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΊΠΈ Π΅, Ρ‡Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° машина, Π½Π° която Ρ‰Π΅ бъдС инсталиран Ansible. ΠžΡ‚ Ρ‚Π°Π·ΠΈ машина ansible Ρ‰Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ git pull ΠΈ рСстарт Π½Π° услугата, която Π΅ ΠΎΠ±Π½ΠΎΠ²Π΅Π½Π°. Π‘ΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ спСциална Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина извън ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈΡ‚Π΅, Π½Π° която инсталирахмС:

  • python
  • ansible
  • gitlab-runner

По ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π²ΡŠΠΏΡ€ΠΎΡΠΈ β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΅ Π΄Π° рСгистриратС gitlab-runner, Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ssh-keygen ΠΈ Π΄Π° ΠΊΠ°Ρ‡ΠΈΡ‚Π΅ публичния ssh ΠΊΠ»ΡŽΡ‡ Π½Π° Ρ‚Π°Π·ΠΈ машина Π² .ssh/authorized_keys Π½Π° мастСр ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° ΠΈ Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΡ€Ρ‚ 22 Π½Π° мастСр ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° Π·Π° ansible.

Π‘Π΅Π³Π° Ρ‰Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ ansible

Въй ΠΊΠ°Ρ‚ΠΎ Ρ†Π΅Π»Ρ‚Π° Π½ΠΈ Π΅ Π΄Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅. Π’ Ρ„Π°ΠΉΠ»Π° /etc/ansible/ansible.cfg Ρ‰Π΅ Ρ€Π°Π·ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Ρ€Π΅Π΄Π° host_key_checking = False, Π·Π° Π΄Π° Π½Π΅ поиска ansible ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° Π½ΠΎΠ²ΠΈ машини.

Π‘Π»Π΅Π΄Π²Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π΅Π½ Ρ„Π°ΠΉΠ» Π·Π° ansible, ΠΎΡ‚ ΠΊΠΎΠΉΡ‚ΠΎ Ρ‚ΠΎΠΉ Ρ‰Π΅ Π²Π·Π΅ΠΌΠ° ip адрСситС Π½Π° ΠΌΠ°ΡˆΠΈΠ½ΠΈΡ‚Π΅, Π½Π° ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° git pull.

Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° API Π½Π° Hetzner, Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ списък с хостовС ΠΎΡ‚ Π²Π°ΡˆΠ°Ρ‚Π° AWS, Azure, Π‘Π” (със сигурност ΠΈΠΌΠ°Ρ‚Π΅ 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 Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠΎΠ΄ΡƒΠ»Π° shell
  • -a β€” Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Π’ΡƒΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ всяка ΠΊΠΎΠΌΠ°Π½Π΄Π°
  • group β€” ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° вашия ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€. Ако искатС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Π½Π° всички ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈ, смСнСтС group с all

ΠŸΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ β€” Ρ‰Π΅ ΠΏΡ€ΠΎΠ±Π²Π°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ git pull Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини:

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

Ако Π² Π°ΡƒΡ‚ΠΏΡƒΡ‚Π° Π²ΠΈΠ΄ΠΈΠΌ already up to date ΠΈΠ»ΠΈ изтСглянС ΠΎΡ‚ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π·Π½Π°Ρ‡ΠΈ всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ.

Π‘Π΅Π³Π° Ρ‚ΠΎΠ²Π°, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ всичко Ρ‚ΠΎΠ²Π° бСшС замислСно

Π©Π΅ Π½Π°ΡƒΡ‡ΠΈΠΌ нашия скрипт Π΄Π° сС изпълнява Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΈΡ‚ Π² главния ΠΊΠ»ΠΎΠ½ Π² 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.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster