PC, Laptop, Notebook, Macbook, Localhost 내가 쓰는 컴퓨터의 이름들이다.
우리는 내 컴퓨터로 개발한 Code를 내 컴퓨터와 다른 서버에 릴리즈한다.
내 컴퓨터에서 잘되던 Code가 왜 운영 서버에서 문제가 될까?
이유는 다양하나 환경부터 맞춰야한다. 콩심은데 콩나고 팥심은데 팥나게 되어있다.
우리 팀은 Confluence, Jira Addon 개발 초기부터 이러한 고민을 했다.
구축하고 있는 환경을 소개한다.
내 컴퓨터상태 부터 보자 이것저것 설치했다가 지웠다가 다운로드 받았다가 지웠다가 매우 지저분한 상태이다.
▲ 내 컴퓨터 상태..
▲ 바탕화면은 지못미
이런 지저분한 환경에서 벗어나 순정의 상태? Java Application이라면 Nginx Tomcat만 설치되어 있는 깨긋한 상태가 되어야 한다.
운영 환경에서 문제가 발생하면 개발환경에서도 발생하는 재연환경을 만들어 보겠다.
우리 개발팀은 Atlassian 제품 addon을 개발하고 있으니 Confluence 개발환경을 만들어보겠다.
여기서 포인트는 우리가 팀원이 새로 추가되거나 컴퓨터를 포맷하거나 등등 여러 이벤트가 발생할 때마다
개발환경을 하나하나 다시 설치하고 설정해주는건 매우 엔지니어 스럽지 않다.
엔지니어는 1시간만에 끝낼 엑셀 작업을 자동화 하겠다고 6시간 코딩하는 쓸때없는 열정이 필요하다.
▲ 자…동화!!
우리는 이런 자동화를 셋트로 만들어 놓을건데 이걸 프로비저닝(provisioning)이라 부른다.
프로비저닝 (provisioning )은 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것을 말한다. 서버 자원 프로비저닝, OS 프로비저닝, 소프트웨어 프로비저닝, 스토리지 프로비저닝, 계정 프로비저닝 등이 있다. 수동으로 처리하는 ‘수동 프로비저닝’과 자동화 툴을 이용해 처리하는 ‘자동 프로비저닝’이 있다. – 위키 백과 –
시작은 개발, 테스트 환경이지만 AWS에서 운영 서버를 자동으로 만들면서 배포등 여러가지를할 수 있다.
이것이!! 클라우드 컴퓨팅의 장점 아니겠습니꽈!!
▲ 프로비저닝 하려고 있는데~
준비물은 컴퓨터 + VirtualBox + Vagrant 끝.
VirtualBox
Oracle이 개발한 VirtualBox는 x86 가상화 소프트웨어다.
우리는 버추얼박스 오픈소스에디션(OSE)을 사용해서 가상화 환경을 뚝딱 만들어 보겠다.
다른 상용 가상화 소프트웨어와 견주어 볼 때, 버추얼박스는 기능이 부족한 편이지만 개발환경 구성하는데 부족하지 않다.
또한 인텔 VT 및 AMD AMD-V 하드웨어 보조 가상화를 지원한다.
어라 6.0이 나왔다. https://www.virtualbox.org/wiki/Downloads
다운 받아서 설치해 보자. macOS 사용자는 설치 중간에 보안에 막히니 설치 전에 마음의 자물쇠를 풀어주자.
▲ 자물쇠 풀고 가실게요~
Vagrant
Vagrant는 개발환경을 쉽게 만들어 준다. 참으로 고마운놈이다.
HashiCrop은 다양한 툴이있는데 운영환경 배포할 때는 테라포오오오옴을 써보자. https://www.hashicorp.com/products/terraform
각설하고 Vagrant 일단 설치
Ubuntu bionic
Virtualbox, Vagrant를 설치 했다면 Linux띄우는건 이제 일도 아니다.
Terminal에서 다음과 같이 명령어를 쳐보자.
→ vagrant init ubuntu/bionic64
Vagrantfile이 생성됐다. vagrant는 Vagrantfile을 참조하여 Virtualbox를 띄운다.
지금은 init으로 기본 설정으로 생성했지만 직접 작성해도 된다. Ruby언어로 Ruby를 몰라도 설정이 간단해서 쉽게할 수 있다.
자 이제 박스를 띄워볼까.
→ vagrant up
처음 띄우면 vagrant cloud에서 해당 이미지를 다운로드 받는다.
내가 갖고있는 이미지보다 최신버전이 있다면 알려주기도 한다.
여기서 잠깐!
Software CICD, 인프라 프로비저닝을 잘 준비한다면 최신버전의 OS를 언제든 테스트하고 적용을 쉽게할 수 있다.
보안 및 성능 이슈 해결을 쫄지말고 개발 – 테스트를 거쳐 운영에 적용해 보자.
박스가 다 뜨면 (엔지니어끼리 뜬다는 표현 ㅇㅈ?)
→ vagrant ssh
로 ssh 접속을 해보자. 윈도우 cmd에서도 가능하다.
cmd에서 Linux 명령어를!!!
Provisioning
이제 Box를 띄우면서 Confluence 설치까지 해보겠다.
설치 스크립트는 shell 스크립트로 작성되며 이 스크립트 기반으로 운영에 자동으로 설치할 수 있다.
기존 박스는 부셔버리자.
→ vagrant destroy
Vagrantfile
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.provider "virtualbox" do |v|
v.name = 'wiki'
v.cpus = 2
v.memory = 1024
end
config.vm.network "private_network", ip: "192.168.1.101"
config.vm.provision "shell", path: "provisioning.sh"
end
박스 이미지는 ubuntu bionic64로 설정한다.
다른 이미지를 사용하고 싶다면 google에 vagrant centos 7.3 검색해보면 나온다.
박스 이름은 wiki, cpu는 2개 메모리는 1G를 사용한다.
ip 주소도 할당할 수있는데 public, private 모두 가능하다.
나만 쓸꺼니 private로.. 부끄럽네요..
제일 중요한 provision shell에 provisining.sh를 사용하겠다. 명시를 한다.
같은 위치에 provisioning.sh 파일을 작성한다.
provisioning.sh
박스가 뜨고 실행되는 스크립트로 여러가지를할 수 있다.
nginx도 설치하고~ mysql도 설치하고~ 손으로 하던걸 스크립트로할 수 있다.
#!/usr/bin/env bash
set -e
echo -e "##############################\nLINE NUMBER: "$LINENO"\n##############################"
HOSTNAME="wiki"
echo ${HOSTNAME} > /etc/hostname
echo "127.0.0.1 ${HOSTNAME}" >> /etc/hosts
hostname ${HOSTNAME}
echo -e "##############################\nLINE NUMBER: "$LINENO"\n##############################"
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo "/swapfile none swap sw 0 0" >> /etc/fstab
echo "root:1234qwer" | chpasswd
sed -i 's/^PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
service ssh restart
cp /etc/apt/sources.list /etc/apt/sources.list.backup
sed -i -e '/^deb/s#http://.*archive.ubuntu.com/ubuntu#http://ftp.daumkakao.com/ubuntu#' -e '/^deb/s#http://.*security.ubuntu.com/ubuntu#http://ftp.daumkakao.com/ubuntu#' /etc/apt/sources.list
apt-get -y clean
apt-get -y update
echo -e "##############################\nLINE NUMBER: "$LINENO"\n##############################"
echo "install oracle java 1.8"
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
add-apt-repository -y ppa:webupd8team/java && \
apt-get update && \
apt-get install -y oracle-java8-installer && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /var/cache/oracle-jdk8-installer
echo 'export JAVA_HOME=/usr/lib/jvm/java-8-oracle' >> ~/.profile
echo 'export PATH=$PATH:/usr/lib/jvm/java-8-oracle/bin' >> ~/.profile
source ~/.profile
echo -e "make home directory"
mkdir /opt/confluence-home
cd /opt
wget https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-6.13.0.tar.gz
tar xvf atlassian-confluence-6.13.0.tar.gz
echo 'confluence.home=/opt/confluence-home/' >> \
/opt/atlassian-confluence-6.13.0/confluence\
/WEB-INF/classes/confluence-init.properties
/opt/atlassian-confluence-6.13.0/bin/start-confluence.sh
echo -e ' ___ ____ ____ ___ _ __ ____'
echo -e ' / _ \ / ___| / ___| |_ _| | |/ / | _ \'
echo -e '| | | | \___ \ | | | | | / | |_) |'
echo -e '| |_| | ___) | | |___ | | _ | . \ | _ <'
echo -e ' \___/ |____/ \____| |___| (_) |_|\_\ |_| \_\'
이 스크립트는 host를 설정, swap, ssh 설정같은 리눅스 기본 설정을 하고
Oracle JDK 1.8을 설치한다.
JAVA_HOME설정이 필요하다. Confluence installer로 설치하는게 아니라 tar.gz 압축 파일을 풀어서 실행하기 때문이다.
Confluence 6.13 최신 버전을 wget으로 다운받고
압축을 풀어준다.
그리고 Confluence Home을 지정해준다.
그리고 Confluence를 실행한다.
그러면 마지막 Command line에 osci.kr 짜잔~
그리고 Vagrantfile에 설정한 ip 8090 포트로 접속해 보면 또 짜잔~
마무리
동일한 환경에서 개발, 테스트하고 운영환경에 배포한다면 버그도 동일하게 재연되고 빠르게 고칠 수 있다.
(내 컴퓨터에서 잘되는데.. 이젠 그만!!)
더 나아가 AWS Cloud9같은 서비스는 개발환경을 Saas로 제공한다. 개발환경 구성하는 시간 조차 아까운 비즈니스 환경이 되가고 있다.
빨리 개발해서 빨리 시장에 내놓고 좋은 반응이 있는지 빠르게 확인해야 한다.
VirtualBox + Vagrant를 활용해서 개발환경 프로비저닝으로 인원이 추가되거나 환경이 변할 때 모두가 같은 환경으로 개발하는건 어떨까.
우리팀은 인프라 프로비저닝 스크립트를 Bitbucket(Git)로 관리하고 Bamboo로 빌드, 테스트, 실행한다.
저희팀은 Atlassian 제품으로 팀의 협업, 프로젝트관리, 빌드, 배포에 도움을 주고있습니다. 물론! OpenSource도 같이 활용하고 있습니다.
팀에게 좋은 문화, 기술, 인프라, OS, Middleware 필요하시다면 #오픈소스컨설팅 이있습니다.
감사합니다.