안수찬의 개발이야기

Vagrant + Shell Provisioning 을 통한 개발 환경 자동화

Introduction

안수찬 @dobestan

안수찬 @dobestan

소프트웨어 생태계에 기여할 수 있는 실용주의 프로그래머가 되고자 합니다. 나는 안수찬이다. 그러므로 나는 할 수 있다.


Vagrant + Shell Provisioning 을 통한 개발 환경 자동화

Posted by 안수찬 @dobestan on .
Featured

Vagrant + Shell Provisioning 을 통한 개발 환경 자동화

Posted by 안수찬 @dobestan on .

개발을 시작한 이후로 지속적으로 관심을 가지고 있는 분야는 "자동화"에 대한 부분이다. Ruby on Rails 개발에 있어서는 매번 수동으로 테스트하는 것이 아니라 sporkguard를 이용해서 테스트를 자동화하거나, AWS EC2 배포를 위한 배포서버 구축에는 AMI(Amazon Machine Instance)를 이용한 자동화 등을 통해서 반복적으로 해야하는 일을 최소한으로 만들기 위해서 노력했다. 그러던 와중에 vagrant를 통한 개발 환경 자동화에 대한 관심을 갖고 사용할 기회를 찾고 있었다.

소프트웨어 마에스트로 배권한 멘토님께서 첫 과제로 "제로보드 설치하기"를 내주셨다. 과제에 대한 자세한 내용은 다음과 같다.

Virtual Machine ( VirtualBox, VMWare )를 이용해서 제로보드를 설치해보자. 단, 운영체제는 CentOS, Ubuntu 를 각각 사용하고 DB는 MySQLPostgresql을 사용하자.

목표

이 과제를 처음 듣고 이 생각이 떠올랐다. "귀찮다. 똑같은 작업을 3-4번 반복해야할 것 같다." 그래서 조금 더 편한 방법을 찾아보기로 했고 vagrant를 통해서 자동화해보기로 결정했다. 목표는 다음과 같게 설정했다.

vagrant base image는 순정 우분투 14.04 ( ubuntu/trusty64 )를 이용을 하되, 잘 만들어진 Vagrantfile을 이용해서 vagrant up 명령어로 초기화한다. 호스트 PC에서 localhost:8080으로 접속을 하면 바로 제로보드 설치화면으로 넘어가도록 하자.

해결방안

일단은 puppet을 이용하면 더 일관된 ( 일반적으로 외국 커뮤니티에서는 consistency 라고 표현했다. ) 개발 환경을 구축할 수 있을 것 같았지만 아직은 puppet으로 provisioning을 하기에는 익숙하지 않아 익숙한 shell script를 이용하기로 결정했다. 시작하기에 앞서 vagrant provisioning은 크게 2단계로 진행하기로 했다.

  1. init.sh : 기본적인 서버 셋팅과 Zeroboard Dependency에 대한 설치 ( Apache, PHP, MySQL )
  2. install_zeroboard.sh : 제로보드 셋팅을 위한 쉘 스크립트

소스코드

Ubuntu 14.04 LTSMySQL을 이용한 제로보드 설치에 대한 Vagrantfile이다.

./Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|  
  config.vm.box = "ubuntu/trusty64"

  config.vm.provision "shell", path: "init.sh"
  config.vm.provision "shell", path: "install_zeroboard.sh"

  config.vm.network "forwarded_port", guest: 80, host: 8080
end  

./init.sh

apt-get update  
apt-get upgrade -y

echo "**************************"  
echo "Installing Build-Essential"  
echo "**************************"  
apt-get install build-essential git -y

echo "***********************"  
echo "Installing MySQL"  
echo "init password as 'root'"  
echo "***********************"  
sudo apt-get install mysql-common -y  
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password root'  
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password root'  
sudo apt-get install mysql-client -y  
sudo apt-get install mysql-server -y

echo "*****************"  
echo "Installing Apache"  
echo "*****************"  
sudo apt-get install apache2 -y  
sudo apt-get install libapache2-mod-auth-mysql -y  
sudo apt-get install libapache2-mod-php5 -y

echo "**************"  
echo "Installing PHP"  
echo "**************"  
sudo apt-get install php5 -y  
sudo apt-get install php5-mysql -y  
sudo apt-get install php5-gd -y  

./install_zeroboard.sh

// install_zeroboard.sh
sudo service mysql restart  
sudo service apache2 restart

rm -rf /var/www/html  
git clone https://github.com/xpressengine/xe-core.git /var/www/html  
sudo chmod 707 /var/www/html  

개선방안

사실 처음으로 vagrant를 사용했다는데 의의를 가진다. 실제로 지금 사용한 방식 ( shell provisioning )은 단순히 shell script를 만드는 방식과 큰 차이가 없다. 이렇게 되면 딱히 vagrant를 사용한 많은 장점들이 사라지게 된다. 심지어 모든 경우에 apt-get updategit clone ~을 수행하면서 Vagrantfile 변경 시에 불필요한 작업들이 많이 수행되게 된다.

내일은 이 방식에 추가적으로 puppet을 이용하면 많은 문제들을 해결할 수 있을 것 같다. 기대되는 장점은 다음과 같다.

  • ( 패키지나 서비스에 대한 ) 의존성에 대한 부분이 명확하게 결정되기 때문에 provisioning에 대한 설정값이 변경되더라도 필요한 작업만을 선택적으로 수행하여 초기 실행 속도가 향상될 것이다.
  • puppet manifests/default.pp 만을 가지고 UbuntuCentOS를 동시에 지원할 수 있을 것이다. ( 쉡 스크립트에 대한 의존성이 사라진다. )
안수찬 @dobestan

안수찬 @dobestan

https://dobest.io/

소프트웨어 생태계에 기여할 수 있는 실용주의 프로그래머가 되고자 합니다. 나는 안수찬이다. 그러므로 나는 할 수 있다.

View Comments...