ํด๋ผ์šฐ๋“œ์˜ ๊ฐ€์ƒ ๋จธ์‹  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Ansible + ์ž๋™ git ํ’€

ํด๋ผ์šฐ๋“œ์˜ ๊ฐ€์ƒ ๋จธ์‹  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Ansible + ์ž๋™ git ํ’€

์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”.

์šฐ๋ฆฌ๋Š” ๊ฐ๊ฐ ๋‹ค์ˆ˜์˜ ๊ฐ€์ƒ ๋จธ์‹ ์„ ํฌํ•จํ•˜๋Š” ์—ฌ๋Ÿฌ ํด๋ผ์šฐ๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์„ Hetzner์—์„œ ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ ๋จธ์‹ ์ด ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์—์„œ ์Šค๋ƒ…์ƒท์ด ์ƒ์„ฑ๋˜์–ด ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋ชจ๋“  ๊ฐ€์ƒ ๋จธ์‹ ์— ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

์ด ์ฒด๊ณ„๋Š” gitlab-runner๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋“ฑ๋ก๋œ ๋Ÿฌ๋„ˆ๊ฐ€ ๋งŽ์ด ๋‚˜ํƒ€๋‚  ๋•Œ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์ด ๊ธฐ์‚ฌ/๋งค๋‰ด์–ผ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Š” ์•„๋งˆ๋„ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ์•„๋‹ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ์†”๋ฃจ์…˜์€ ๊ฐ€๋Šฅํ•œ ํ•œ ํŽธ๋ฆฌํ•˜๊ณ  ๊ฐ„๋‹จํ•ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

ํŠœํ† ๋ฆฌ์–ผ์€ ๊ณ ์–‘์ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋งˆ์Šคํ„ฐ ๋จธ์‹ ์˜ ํ•„์ˆ˜ ํŒจํ‚ค์ง€:

  • ํŒŒ์ด์ฌ
  • ์ž์‹
  • SSH ํ‚ค๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ

๋ชจ๋“  ๊ฐ€์ƒ ๋จธ์‹ ์— ์ž๋™ Gut Pull์„ ๊ตฌํ˜„ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์›์น™์€ Ansible์„ ์„ค์น˜ํ•  ๋จธ์‹ ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋จธ์‹ ์—์„œ ansible์€ git pull ๋ช…๋ น์„ ๋ณด๋‚ด๊ณ  ์—…๋ฐ์ดํŠธ๋œ ์„œ๋น„์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชฉ์ ์„ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ๋ณ„๋„์˜ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•˜์—ฌ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ด์ฌ
  • ๋จน์„ ์ˆ˜์žˆ๋Š”
  • gitlab ๋Ÿฌ๋„ˆ

์กฐ์ง ๋ฌธ์ œ์—์„œ - gitlab-runner๋ฅผ ๋“ฑ๋กํ•˜๊ณ , ssh-keygen์„ ๋งŒ๋“ค๊ณ , ์ด ๋จธ์‹ ์˜ ๊ณต๊ฐœ SSH ํ‚ค๋ฅผ ์—…๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .ssh/authorized_keys ๋งˆ์Šคํ„ฐ ๋จธ์‹ ์—์„œ ๋งˆ์Šคํ„ฐ ๋จธ์‹ ์˜ ansible์„ ์œ„ํ•ด ํฌํŠธ 22๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

์ด์ œ Ansible์„ ๊ตฌ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์— ์žˆ์Œ /etc/ansible/ansible.cfg ์šฐ๋ฆฌ๋Š” ๊ทธ ์ค„์˜ ์ฃผ์„์„ ์ œ๊ฑฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค host_key_checking = False๊ทธ๋ž˜์„œ ansible์€ ์ƒˆ๋กœ์šด ๋จธ์‹ ์— ๋Œ€ํ•œ ํ™•์ธ์„ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ, git pull์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋จธ์‹ ์˜ IP๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” Ansible์šฉ ์ธ๋ฒคํ† ๋ฆฌ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” Hetzner์˜ 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์— ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.
  • -a๋Š” ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์–ด๋–ค ๋ช…๋ น์ด๋ผ๋„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฃน โ€” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฃน์„ all๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”.

๋” ๋‚˜์•„๊ฐ€์„œ ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ 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 ๋ช…๋ น์ด ์‹คํ–‰๋  ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€