์ข์ ํ๋ฃจ ๋์ธ์.
์ฐ๋ฆฌ๋ ๊ฐ๊ฐ ๋ค์์ ๊ฐ์ ๋จธ์ ์ ํฌํจํ๋ ์ฌ๋ฌ ํด๋ผ์ฐ๋ ํด๋ฌ์คํฐ๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋ชจ๋ ๊ฒ์ 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