<313033C8A35FB0F8C7D05FC6AEB7BBB5E55F E74BFCD5F416E C65C0BB5FC0CCBFEBC7D15FB0B3B9DF5FC8AFB0E65FB1B8C3E05F F E687770>

Similar documents
오픈소스배포툴 (propvision tool) 이며환경설정툴 (configuration management tool) 이고 remote 서버에접근후명령실행툴 (ad hoc task execution) 은 puppet, chef, ansible, salt 가유명하다. 여

< E74BFCD20416E C65C0BB20C0CCBFEBC7D120B0B3B9DF20C8AFB0E620B1B8C3E C6EDC1FD29322E687770>

opennaru

opennaru

untitled

1. efolder 시스템구성 A. DB B. apache - mod-perl - PHP C. SphinxSearch ( 검색서비스 ) D. File Storage 2. efolder 설치순서 A. DB (MySQL) B. efolder Service - efolder

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

PowerPoint 프레젠테이션

github_introduction.key

PowerPoint Presentation

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

PowerPoint 프레젠테이션

28 THE ASIAN JOURNAL OF TEX [2] ko.tex [5]

Secure Programming Lecture1 : Introduction

1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot)

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

/chroot/lib/ /chroot/etc/

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

<31332DB9E9C6AEB7A2C7D8C5B72D3131C0E528BACEB7CF292E687770>

을풀면된다. 2. JDK 설치 JDK 는 Sun Developer Network 의 Java( 혹은 에서 Download > JavaSE 에서 JDK 6 Update xx 를선택하면설치파일을

슬라이드 1

슬라이드 1

슬라이드 1

소프트웨어설치 1. 소프트웨어설치및제거 ( 소스코드 ) 소스코드컴파일을이용한 S/W 설치 1. 소스코드다운로드 - 예 ) httpd tar.gz - 압축해제 : #tar xzvf httpd tar.gz - INSTALL 또는 README파일참조

Remote UI Guide

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

chapter1,2.doc

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

OnTuneV3_Agent_Install

슬라이드 1

를 이용한 발 환 Ansible과 Vagrant 개 경구 김 ( 용환 축 #1 이 글은 양이 많은 관계로 다음 주소의 글에 게재된 내용으로 축소되었다. 오타가 많고 정리가 안되었으나, 배경지식을 많이 할애한 관계로 공개

MySQL-Ch10

Microsoft PowerPoint - chap01-C언어개요.pptx

PowerPoint 프레젠테이션

본문서는 초급자들을 대상으로 최대한 쉽게 작성하였습니다. 본문서에서는 설치방법만 기술했으며 자세한 설정방법은 검색을 통하시기 바랍니다. 1. 설치개요 워드프레스는 블로그 형태의 홈페이지를 빠르게 만들수 있게 해 주는 프로그램입니다. 다양한 기능을 하는 플러그인과 디자인


DE1-SoC Board

Microsoft PowerPoint - 10Àå.ppt

untitled

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc

Microsoft Word - CPL-TR OM2M.doc

Apache Ivy

Polly_with_Serverless_HOL_hyouk

Copyright 2012, Oracle and/or its affiliates. All rights reserved.,.,,,,,,,,,,,,.,...,. U.S. GOVERNMENT END USERS. Oracle programs, including any oper

단계

Apache2 + Tomcat 5 + JK2 를 사용한 로드밸런싱과 세션 복제 클러스터링 사이트 구축

Tcl의 문법

Copyright 2012, Oracle and/or its affiliates. All rights reserved.,,,,,,,,,,,,,.,..., U.S. GOVERNMENT END USERS. Oracle programs, including any operat

PowerPoint 프레젠테이션

표준프레임워크 Nexus 및 CI 환경구축가이드 Version 3.8 Page 1

Portal_9iAS.ppt [읽기 전용]

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

01Àå

Snort Install Manual Ad2m VMware libnet tar.gz DebianOS libpcap tar.gz Putty snort tar.gz WinSCP snort rules 1. 첫번째로네트워크설정 1) ifconf

본교재는수업용으로제작된게시물입니다. 영리목적으로사용할경우저작권법제 30 조항에의거법적처벌을받을수있습니다. [ 실습 ] 스위치장비초기화 1. NVRAM 에저장되어있는 'startup-config' 파일이있다면, 삭제를실시한다. SWx>enable SWx#erase sta

Microsoft Word - Armjtag_문서1.doc

<3833C8A35FB0F8C7D05FC6AEB7BBB5E55F F466C6F77B8A65FC8B0BFEBC7D15FC8BFB0FAC0FBC0CE5FBCD2BDBA5FC7FCBBF35FB0FCB8AE5F F322E687770>

게시판 스팸 실시간 차단 시스템

기존에 Windchill Program 이 설치된 Home Directory 를 선택해준다. 프로그램설치후설치내역을확인해보면 Adobe Acrobat 6.0 Support 내역을확인할수 있다.

USER GUIDE

ETL_project_best_practice1.ppt

Raspbian 설치 라즈비안 OS (Raspbian OS) 라즈베리파이 3 Model B USB 마우스 USB 키보드 마이크로 SD 카드 마이크로 SD 카드리더기 HDM I 케이블모니터

Microsoft PowerPoint - Smart CRM v4.0_TM 소개_ pptx


PowerPoint Template

블로그_별책부록

LXR 설치 및 사용법.doc

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

PowerPoint 프레젠테이션

Solaris Express Developer Edition

Windows 8에서 BioStar 1 설치하기

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

YUM(Yellowdog Updater,Modified) : RPM 패키지가저장된서버 ( 저장소 ) 로부터원하는패키지를자동으로설치한다. : YUM 도구는 RPM 의패키지의존성문제를해결

Microsoft Word - CAE 클러스터 환경 구축-ABAQUS.doc

소개 TeraStation 을 구입해 주셔서 감사합니다! 이 사용 설명서는 TeraStation 구성 정보를 제공합니다. 제품은 계속 업데이트되므로, 이 설명서의 이미지 및 텍스트는 사용자가 보유 중인 TeraStation 에 표시 된 이미지 및 텍스트와 약간 다를 수

Windows 10 General Announcement v1.0-KO

Microsoft PowerPoint - web-part03-ch19-node.js기본.pptx

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

Copyright 2004 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A..,,. Sun. Sun. Berkeley BSD. UNIX X/Open Company, Ltd.. Sun, Su

BEef 사용법.pages

Sena Technologies, Inc. HelloDevice Super 1.1.0

슬라이드 1

Microsoft Word - FunctionCall

리눅스설치가이드 3. 3Rabbitz Book 을리눅스에서설치하기위한절차는다음과같습니다. 설치에대한예시는우분투서버 기준으로진행됩니다. 1. Java Development Kit (JDK) 또는 Java Runtime Environment (JRE) 를설치합니다. 2.

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인

PCServerMgmt7

Microsoft PowerPoint - Chapter_03-1_DevEnv.pptx

6주차.key

1. Windows 설치 (Client 설치 ) 원하는위치에다운받은발송클라이언트압축파일을해제합니다. Step 2. /conf/config.xml 파일수정 conf 폴더에서 config.xml 파일을텍스트에디터를이용하여 Open 합니다. config.xml 파일에서, 아

Server Agent Guide

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Sun Java System Messaging Server 63 64

Spring Boot

Corporate PPT Template

Transcription:

Vagrant 와 Ansible 을이용한개발환경구축 Part 2 : Ansible 의이해 2014. 8. 19. [ 제 103 호 ] Ⅰ. ansible 의소개와설치 Ⅱ. ansible의 yaml과 playbook 소개 Ⅲ. vagrant/ansible 테스트시나리오 Ⅳ. 결론

SW 공학트렌드 동향분석 Webzine Ⅰ. ansible 의소개와설치 1.1 ansible 선택이유 필자는 agent 기반과 rsh/ssh 기반으로 provision 방식을개발 / 활용해상황에따라맞는 형태가있음을알게되었다. agent 기반이확장성이나추후대규모 provision 를할경우 매우효과적인측면이있다. 또한 agent 는 provision 뿐아니라다양한방식으로활용되 는장점이있다. 대신 provision 서버와통신하는부분이고도화되기때문에빠르고간 단한 provision 을할수없게된다. 반면, rsh/ssh provision 방식은빠른 provision 이가능 하다. 그러나수천대의서버를통제하려면 rsh/ssh 기반은한계가있다. 필자는주관적 으로 puppet 과 chef 와 ansible 을비교해보았다. 이름 puppet chef 개발언어 ruby ruby 정의 DSL ( 독자 ) DSL (ruby 기반 ) agent 인스톨여부통신방법공유리파지토리 ansible python yaml 불필요 ssh/json 학습시간 시스템복잡성 Github 활동성 필요 http ssl 존재중중중 필요 STOMP/rest 존재상상중 존재하지않음 하하상 가장많이사용하고있는 puppet 이나 chef 대신 ansible 을선택하게된배경은다음의조 건이었다. salt 라는 provision 툴도선택가능성안에있지만, ansible 이좀더 community 활동성이좋아서이를선택했다. Mac/Linux 환경을지원해야한다.( 윈도우환경은지원하지않아도됨 ) agent 기반이아니고 ssh 기반이어야한다.( 추후상용환경에서사용할때 agent 기반이면방화 벽이슈, agent 데몬관리라는불편한점이존재한다.) 쉽게사용할수있어야한다. Learning curve 가높지않아야한다. DSL 대신최대한 Standard 를사용해야한다. 테스트환경 (vagrant) 에서사용할수있어야하고서버배포환경에서도사용할수있어야한다. 설정내용은읽기쉬워야한다. 유지보수가편해야하며인수인계가쉽고가능해야한다. 자동배포환경이쉬워야한다. 병렬실행이되어야한다. 앞으로개발가능성이높은오픈소스 (Github 활동성 ) 여야한다. 멱등성 (idempotence) 이보장되어야한다. * 멱등성 (idempotence) 이란? 연산을여러번적용하더라도결과가달라지지않는성질을멱등성 (idempotence) 이라한다. puppet, chef, ansible 등은모두이런특성을가지고있다. 쉽게말하면, rest api 의경우 get, head, put, delete 메소드는멱등성을가지고있다. 그러나 post 는상태를변화시키기때문에멱등성이없다고할수있다. 즉, 서버에변화를주기때문이다. 01 2014 August (No.103)

공학트렌드 * ansible 툴에서의멱등성이란? 여러번 ansible 툴을사용하더라도동일한결과값을나올수있도록제공되는형태여야한다. 즉, 매번다른결과가나오거나에러가나온다면비멱등성 (non-idempotent) 하다고할수있다. ansible 툴의거의대부분의모듈은멱등성을제공한다. 또한멱등성을제공하기위해서는조건절을제공하고있다. 예를들면, 처음 ansible 스크립트를실행후다시실행을했다. 상황에따라서는파일이 append 가될수있다. 그러나멱등성의원칙은언제나실행은해도결과가동일하게나온다. 또한파일 / 디렉토리를생성또는삭제하는 create:, remove: 같은 ansible 모듈을실행할때 when: 조건절을이용할수있다. 상태가변경되면 changed_when: 또는 failed_when: 을사용할수있다. 대부분의 ansible 모듈이멱등성 (idempotence) 을보장한다는의미는상태 (status) 를파악할수있다는의미를가진다. 1.2 ansible 소개 ansible 은회사이름 (ansible inc) 으로 ansible 이라는이름의오픈소스 1) 를기반으로 ansible tower 2) 를판매하고있다. 여기서다루는내용은오픈소스버전의 ansible 이다. ansible tower 는 ansible 을쉽게사용할수있도록 UI 버전과 LDAP 을지원하고있다. ansible provision 툴은현재 Atlassian, Twitter, VeriSign, EA, Evernote, Nasa, Gopro, rackspace, juniper, mapr 등해외유명업체에서사용하고있다. ansible 은 application 과시스템을쉽게배포할수있도록한간단한 IT 자동화플랫폼이다. application 을배포, 업데이트할때마다매번서버에접속해서들어가서스크립트를실행하지않아도자동화된형태의언어로 agent 없는리모트환경에서 ssh 를통해접근하여작업할수있다. 현재 ansible 은오픈소스 (GNU GENERAL PUBLIC 라이선스 ) 이며, https://github.com/ansibl e/ansible 에서소스를제공하고있다. 특히 793 명의 contributer 가있는것은아주활발히움직이고있음을의미한다. puppet 이나 chef 에서비해서많은개발자들이참여하고있다. 현재 python 으로개발된 Github 프로젝트중 top 10 프로젝트중하나이다. 현재 (2014.7.23) 버전은 1.5.3 이며조만간 1.6.0 이출시될예정이다. 필자는 1.5.0 기준으로설명하였다. ansible 은 ssh( 디폴트 ) 로리모트서버로연결후, ansible module ( 이하 ansible 모듈 ) 이라불리는작은프로그램을전송해실행한다. 실행완료후에는해당 ansible 모듈은삭제한다. ssh로연결만된다면어떤서그림 1_ansible 아키텍처버에도접근하여라이브러리모듈을저장할수있다. ansible 모듈은 JSON 으로리턴만하면사용할수있기때문에 ruby, bash, ptyhon 등어떤언어에서라도사용될수있다. 그리고플러그인 (plugin) 을제공하여확장이가능하고 callback, python api 추가기능을구현할수있는큰특징들이있다. 최근에이출처 : http://terry.im/wiki/terry/ansible.html 1) https://github.com/ansible/ansible 2) http://www.ansible.com/home, 오픈소스 ansible 은무료이고 ansible tower 는유료임 02

SW 공학트렌드 동향분석 Webzine 런플러그인이확장되면서좋은기능이추가되고있다. ansible 은 YAML 이라는아주간단한포맷의언어를사용하고있다. 쉬운영문을기반으로한 YAML 을이용하여자동화 job 을기술할수있도록한다. YAML 에대한설명은다음장에서진행한다. ansible 은 YAML 기반으로된 playbook 이라는설정파일을자동화된 job 으로정의한다. 설치부터복사까지모든작업은이 playbook 에서정의할수있다. 그리고 inventory 라는파일을이용하여서버설정을할수있다. 지금까지설명한내용은위 < 그림 1> 과같이한장의 ansibile 아키텍처로설명할수있다. 1.3 ansible 설치 ansible 은 agent 가필요없기때문에서버에만설치하면된다. 서버를 ansible 에서는 control machine 이라부른다. 설치는소스, python, yum, apt, freebsd, mac osx 에서쉽게할수있다. 3) 필자는 Mac OSX 사용자이므로 homebrew 를이용하여 ansible 을설치했다. $ brew update $ brew install ansible OS X Mavericks 버전에서는 pip 설치시에는컴파일러이슈가발생할수있다. 이를해 결하기위해서는아래와같이사용하여 ansible 을설치한다. $ sudo CFLAGS= Qunused arguments CPPFLAGS= Qunused arguments pip install ansible 만약, 그래도 clang: error: unknown argument: '-mno-fused-madd' [-Wunused-comman d-line-argument-hard-error-in-future] 이라는에러문구가표시되며해결이되지않는 다면다음을실행하여 ansible 을설치한다. XCode 5.1.1. 부터는 unknown argument 는컴파 일에러가나도록바뀐듯하다. $ ARCHFLAGS= Wno error=unused command line argument hard error in future pip install ansible 참고로 ansible 의 windows 내설치를공식적으로지원하지는않지만, cygwin 을활용해 windows 에서도 ansible 을사용할수있도록작성한개인블로그가있으니참고바란다. 4) 그리고 ansible 의리모트호스트 (remote host), managed node 는특별히할것은없다. ansible 서버에서해당 node 로 ssh 연결이쉽게될수있도록해당 node 에서 ssh 인증키를 생성하고인증키를 ansible 서버에서갖고있도록하면된다. 그리고 node 에서는 python 2.4 이상의버전이설치되어있으면된다. 만약 2.4 버전미만의 python 버전이설치되어 있으면, 2.4 이상으로업그레이드하거나 python-simplejson 을반드시설치해야한다. $ pip install simplejson simplejson 으로눈치챘겠지만 json 형태로데이터가전달된다. 에러또는디버그시에 json 형태로결과를리턴한다. 아래예제는생각없는 copy & paste 를통해서발생한에 러정보를 json 으로보여주고있는것을볼수있다. 3) http://docs.ansible.com/intro_installation.html#installing-the-control-machine 4) https://servercheck.in/blog/running-ansible-within-windows 03 2014 August (No.103)

공학트렌드 TASK: [mysql start mysql] *************************************************** failed: [192.168.1.50] => {"failed": true, "item": ""} msg: service not found: tomcat Ⅱ. ansible 의 yaml 과 playbook 소개 2.1 YAML 소개 YAML 5) 은 xml, c, python, perl 에서정의된 email 양식에서개념을얻어만들어진 사람이쉽게읽을수있는 데이터직렬화 (serialization) 양식이다. 6) YAML 이라는이름은 YAML ain t Markup Language (YAML 은마크업언어가아님 ) 라는재귀적인이름에서유래되었으나, Yet Another Markup Language ( 또다른마크업언어 ) 가현재공식약자이다. YAML 은마크업보다는데이터중심, 즉 serialization format 이라는의미를강조하고있다. 야믈 이라발음하는데, 마치 camel 과음률을맞추려는의도를가지고있다. YAML 은 2001 년에 1.0 이퍼블리싱되었다. 7) 2009 년에는 1.2 가퍼블리싱되었는데, 8) 이때 json 간의관계가설명되어있다. 1.2 의변경은 yaml 과 json 의호환을위해서이다. json 과 yaml 은사람이읽기편한데이터교환포맷을목표로하고있다. json 은간결함과범용성에초점을둔다면, yaml 은 json 의장점을포함하고임의의고유데이터구조에대한직렬화를지원한다. yaml 은모든데이터를리스트, 해쉬, 스칼라데이터의조합으로적절히표현할수있다. 문법이상대적으로쉽고가독성이좋다. 주요특징은다음과같다. YAML 문자열은 UTF-8 또는 UTF-16 과같이출력가능한유니코드문자집합을이용한다. 공백문자를이용한들여쓰기로구조체를구분하나탭문자를이용하여들여쓰기에사용하지않는다. 리스트요소는여러줄에쓸때에는하이픈 (-) 으로시작하는한줄에하나의요소를표현하며, 한줄에모아쓸때에는대괄호 ([]) 를이용하며쉼표로각요소를구분한다. 해쉬는콜론기호를이용해서키 : 값의형태로한줄에하나를표현하거나, 한줄에모아쓸때에는중괄호 ({}) 를이용하며쉼표로각요소를구분한다. 간단한값 ( 스칼라값 ) 은보통아무표시를하지않으나따옴표 ("") 나작은따옴표 ( ) 를이용해값을표시한다. 따옴표안에서특수문자는 C언어스타일 ( 역슬래쉬키와함께쓰이는제어문자예. n) 로표시한다. 블록값은보존 ( ) 또는접기 (>) 의선택지시자로나눈다. 5) 공식사이트 http://yaml.org/ 6) http://ko.wikipedia.org/wiki/yaml 7) http://www.yaml.org/spec/history/2001-05-26.html 8) http://yaml.org/spec/1.2/spec.html#id2759572 04

SW 공학트렌드 동향분석 Webzine 하나의스트림에있는여러개의문서는하이픈 3 개 (---) 로나누며, 마침표세개 (...) 로스트림 의끝을나타낸다. 반복되는노드는기본적으로 & 를통해나타내며, * 문자이후의내용을참조한다. 주석은 # 으로표시하며, 한줄이끝날때까지유효하다. 노드들은타입과느낌표로시작해 URL 주소를지시하는태그를통해라벨이붙는다. xml 예제를 yaml 으로변경한사례를통해서 yaml 을이해한다. xml 예제는다음과같다. <recipe> <title>macaroni and Cheese</title> <description>my favorite comfort food.</description> <author>brian Genisio</author> <timetoprepare>30 Minutes</timeToPrepare> <ingredients> <ingredient> <name>cheese</name> <quantity>3</quantity> <units>cups</units> </ingredient> <ingredient> <name>macaroni</name> <quantity>16</quantity> <units>oz</units> </ingredient> </ingredients> </recipe> 이를 yaml 로바꾸면다음과같다. 특별한설명을하지않아도 attribute 의 key 와 value 값을콜론 (:) 단위로정의하고 list 에대해서는하이픈 (-) 으로표시한다. Recipe: Title: Macaroni and Cheese Description: My favorite comfort food. Author: Brian Genisio TimeToPrepare: 30 Minutes Ingredients: Name: Cheese Quantity: 3 Units: cups Name: Macaroni '[ ]' Quantity: 16 Units: oz json 예제를 yaml 로변경한사례를통해서 yaml 을이해한다. json 예제는다음과같다. "apple", { "bar": ["baz", "kwa", 3.0, 5] } 이를 yaml 예제로바꾼다면아래와같다. apple bar: baz kwa 3.0 5 ansible 뿐아니라대부분의소프트웨어에서는 yaml 설정파일의확장자는 yml 로정의 05 2014 August (No.103)

공학트렌드 해서사용하고있다. 참고로독자에게는생소해보일수있는 yaml 은 travis CI, redmine, google app engine, cassandra, google-code-prettify 외많은오픈소스및솔루션에서설정 파일을정의하는데사용하고있다. 2.2. jinja2 소개 yaml 은정적이다. ansible 에서는이를동적으로표현할수있는무엇인가가필요했다. jinja2(http://jinja.pocoo.org/docs/) 라는 python 라이브러리를이용해서 yaml 문법의단점 을보완했다. 일종의템플릿언어 (java 의 freemarker, rythm) 와같다. ntp server 1.1.1.1 로표현했던것을변수선언부에 ntp_variable = 2.2.2.2 를선언하고설정에는 ntp {{ntp_variable}} 로표현이가능하다. jinja2 파일의확장자는.j2 로지정한다. 그래서 ansible 예제에서종종보이는템플릿 (template) 디렉토리밑의파일들이.j2 로되어있는 것을볼수있다. 예를들어 mysql 의 client.cnf.j2 파일을아래예제와같이저장할수 있다. 만약 utf8 변수가 true 이면 default-character-set 의값을 utf8 로바꾸라는정보를 추가할수있다. [client] {% if utf8 %} # apply utf8 default character set = utf8 {% endif %} 단조로울수있는환경배포설정은 python 모듈 jinja2 를통해서쉽게배포환경을구성할수있다. 2.3. playbook 소개 playbook 은 ansible 의환경설정, 배포를가능케하는언어이다. 리모트서버에접속하여무언가를실행시키는정책을기술한다. 사람이쉽게읽을수있는 yaml 문법을채용하여정책을기술한다. playbook 은정책을기술하는데, ansible module 을활용한다. playbook 의기본레벨은환경설정이나배포에유용하게사용할수있다. 좀더고급단계에서는특정서버에무엇인가를전달하거나, 로드밸런서를모니터링하는복잡한환경에서사용할그림 2_ansible model 수있다. 각 playbook 은하나또는하나이상의 play 를둔다. play 의목적은여러호스트들에잘정의된 role 과 task 를매핑하는역할을한다. < 그림 2> 는 playbook 의구성요소를간단하게설명하고있다. role 은 file 들을 include 하거나하나로합칠수있는 (combile) 아이디어를기반으로만들어졌다. 재사용가능한추상화를가능케한다. 출처 : http://www.jedelman.com/home/ansible-for-networking 06

SW 공학트렌드 동향분석 Webzine task 는 ansible 모듈의호출을의미한다. role 의개념을예제를통해설명한다. tasks/foo.yml 이라는 task 를정의한파일이다. # possibly saved as tasks/foo.yml name: placeholder foo command: /bin/foo name: placeholder bar command: /bin/bar playbook 안에 task 를정의한 tasks/foo.yml 을 include 하는것이가능하다. tasks: include: tasks/foo.yml 다음은 playbook 안에는아래와같은형태로개발하는데, include 를활용하여복잡하 지않도록할수있다. name: this is a play at the top level of a file hosts: all remote_user: root tasks: name: say hi tags: foo shell: echo "hi..." include: load_balancers.yml include: webservers.yml include: dbservers.yml role 를좀더편하게관리하기위해사용할수있다. host inventory 파일에정의한서 버그룹별로각각나누어 provision 할수있도록할수있다. 예를들어 inventory 파일에 서 dbservers 와 webservers 로나눈경우라면 role 의개념을잘이용하여설치정보를디렉 토리로나눌수있다. common, dbservers, webservers 이렇게디렉토리를나누어서 DB 를 설치할때는 common 디렉토리의 yml 파일과 dbservers 의 yml 을읽어설치하게하고 web 서버를설치할때는 common 디렉토리의 yml 파일과 webservers 디렉토리의 yml 을설치 하게할수있다. 변수선언은 vars 문안에서정의한다. http_port 는 80 으로초기화한다. hosts: webservers vars: http_port: 80 미리정의된 base_path 변수의값의 app 디렉토리스트링값을 app_path 에저장한다. hosts: app_servers vars: app_path: "{{ base_path }}/app" 그것외에변수의디폴트값을넣는다거나, for 문을동작시킬수있다. {{ some_variable default(5) }} {% for host in groups['app_servers'] %} {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }} {% endfor %} 07 2014 August (No.103)

공학트렌드 command 바깥에서변수를받을수있다. $ ansible playbook release.yml extra vars "host=127.0.0.1 user=vagrant" playbook 파일 hosts: '{{ hosts }}' remote_user: '{{ user }}' 그리고조건문을제공한다. when, false_when 등다양한조건문을지원한다. ansible 노드가 Debian 이면운영체제를바로셧다운하도록지정한다. tasks: name: "shutdown Debian flavored systems" command: /sbin/shutdown t now when: ansible_os_family == "Debian" 마지막으로루프 (loop) 를제공한다. wheel 그룹으로 testuser1, testuser2 계정을추가하 는명령어를루프를통해서진행할수있다. name: add several users user: name={{ item }} state=present groups=wheel with_items: testuser1 testuser2 여러파라미터를두어 group 별로지정을할수있다. name: add several users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: { name: 'testuser1', groups: 'wheel' } { name: 'testuser2', groups: 'root' } 2.4 inventory 소개 inventory 파일은리모트서버에대한 meta 데이터를기술하는파일이다. ansible 에서는 inventory 파일에는 yaml 을적용하지않았다. 기본파일은 /etc/ansible/hosts 을읽게하거나, 따로 inventory 파일을만들고옵션을주어동작하게할수있다. 다음은 hosts 파일예제이 다. [, ] 안이그룹이름이고, 호스트명 (host) 은해당그룹에속한다. webservers 와 dbservers 로나누어서작업을할수있도록그룹핑되어있다. [webservers] foo.example.com bar.example.com [dbservers] one.example.com two.example.com three.example.com 만약고정 IP 를가지고있고 hosts 파일안에들어가있지않는서버가있다면아래와 같이설정파일을만들수있다. 192.168.1.50 ip 를가진서버에 22 번 ssh 포트로 vagrant 계정으로접근할수있도록한다. 이는테스트환경을만들때매우유용하다. 192.168.1.50 ansible_ssh_user=vagrant ansible_ssh_port=22 08

SW 공학트렌드 동향분석 Webzine 2.5. 명령어소개 ansible-playbook 과 ansible 명령어가있다. ansible-playbook 명령어는 playbook yaml 파일을 실행한다. 아래예제는 /etc/ansible/hosts inventory 파일을사용하지않고, 따로정의된 hosts inventory 파일을기반으로 playbook 으로정의한 webservers.yml 을실행시키라는명령어이다. $ ansible playbook i hosts webservers.yml 리모트호스트에접근하여특정명령어를실행할수있다. ansible 에서는 ad-hoc task 실 행이라한다. ansible-playbook 이아닌 ansible 명령어를이용해야한다. 아래예제는따로 정의된 production inventory 파일에저장된모든호스트에대해서재부팅을명령한다. $ ansible boston i production m command a '/sbin/reboot' 만약에러가발생하면 verbose 옵션을주어자세한내용을얻을수있다. $ ansible playbook i hosts playbook.yml vvvv PLAY [all] ******************************************************************** GATHERING FACTS *************************************************************** <192.168.1.50> ESTABLISH CONNECTION FOR USER: vagrant <192.168.1.50> REMOTE_MODULE setup <192.168.1.50> EXEC ['ssh', ' C', ' tt', ' vvv', ' o', 'ControlMaster=auto', ' o', 'ControlPersist=60s', ' o', 'ControlPath=/Users/knight/.ansible/cp/ansible ssh %h %p %r', ' o', 'Port=22', ' o', 'KbdInteractiveAuthentication=no', ' o', 'PreferredAuthentications=gssapi with mic,gssapi keyex,hostbased,publickey', ' o', 'PasswordAuthentication=no', ' o', 'User=vagrant', ' o', 'ConnectTimeout=10', '192.168.1.50', "/bin/sh c 'mkdir p $HOME/.ansible/tmp/ansible tmp 1406200040.69 215131276335574 && chmod a+rx $HOME/.ansible/tmp/ansible tmp 1406200040.69 215131276335574 && echo $HOME/.ansible/tmp/ansible tmp 1406200040.69 215131276335574'"] fatal: [192.168.1.50] => SSH encountered an unknown error. The output was:... Ⅲ. vagrant/ansible 테스트시나리오 3.1. 가상서버준비 virtualbox/vagrant 와 ansible 을간단하게연동하는예제를진행한다. 리눅스버전중 하나인 ubuntu 의 12.04 버전이며 64 비트버전인 precise64 를기반으로예제를준비했다. 가상서버 (192.168.1.50) 가실행중인상태에서 Vagrant 파일, hosts 파일, playbook.yml 을 추가하였다. 이해도를높이기위해서 vagrant 작업은두번진행한다. 먼저 Vagrant 파 일은아래와같이생성한다. $ mkdir p idp testbox $ cd idp testbox $ cat > Vagrantfile # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do config config.vm.box = "precise64" config.vm.box_url = "http://files.vagrantup.com/precise64.box" 09 2014 August (No.103)

공학트렌드 config.vm.hostname = "web" config.vm.network "private_network", ip: "192.168.1.50" config.vm.network :forwarded_port, guest: 9966, host: 8888 config.vm.provision "ansible" do ansible ansible.playbook = "playbook.yml" end end hosts 파일은다음과같이설정한다. 192.168.1.50 ansible_ssh_user=vagrant ansible_ssh_port=22 playbook.yml 파일은다음과같다. /user/local 디렉토리리스트업하고, ansible 로그 결과를로그로출력한다. $ cat playbook.yml hosts: all user: vagrant tasks: name : test action: command ls al /usr/local register: vagrant debug: var=vagrant.stdout_lines vagrant up 명령을실행하면. provision 까지진행하면성공하는결과화면이보인다. < 그림 3> 과같이 virtualbox 리스트화면을확인할수있다. $ vagrant up 그림 3_vagrant up 실행후 virtualbox 화면 이제는 web 이라는 virtualbox 의 gui 이름을주도록한다. Vagrant 파일을아래와같이 수정한다. config.vm.provider 의이름을 web 으로변경하도록한다. $ cat > Vagrantfile # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do config config.vm.box = "precise64" 10

SW 공학트렌드 동향분석 Webzine end config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.hostname = "web" config.vm.network "private_network", ip: "192.168.1.50" config.vm.network :forwarded_port, guest: 9966, host: 3333 config.vm.provider :virtualbox do vb vb.name = "web" end config.vm.provision "ansible" do ansible ansible.playbook = "playbook.yml" end vagrant reload 명령을내려서다시가상서버를실행한다. < 그림 4> 와같이 virtualbox 에 web 으로이름을변경했다. vagrant up 하면서 provision 했기때문에 provision 이진행하 지는않는다. $ vagrant reload 그림 4_vagrant 설정의 provider 이름을변경하고, vagrant reload 실행한 virtualbox 화면 가장먼저 ssh 인증서를복사해서로컬장비에서가상서버로접근할수있도록한다. $ ssh copy id vagrant@192.168.1.50 그리고, playbook 을실행하였다. 다음의 provision 결과를얻을수있다. 3.2 가상서버에소프트웨어 /WAS/DB 설치 https://bitbucket.org/gerrytan/jpaminimal(jpaminimal 예제 ) 로공개한소스를가지고테스트를진행한다.( 자세한소스는 http://gerrydevstory.com/2014/03/03/creating-a-minimal-spr ing-mvc-jpa-hibernate-and-mysql-project/ 을참조 ) 이예제는 tomcat 위에서동작하는 was 는 JPA/Hibernate 를이용하여 mysql DB 를연결하고간단한 web UI 를보여주는웹어플리 11 2014 August (No.103)

공학트렌드 케이션이다. setup.yml 파일을만들어아래예제와같이설치할수있다. 모든 host invent ory 에정의된 host 파일에 vagrant user 로접근후, sudo 권한으로 Git 패키지외 3 종류의 소프트웨어를설치하고 mysql 5.5 서버를설치한후 mysql 데몬을시작하도록한다. hosts: all user: vagrant sudo: True tasks: name: common install apt: pkg={{ item }} state=latest update_cache=yes tags: packages with_items: maven ant zip git name: MySQL install apt: pkg=mysql server 5.5 state=present update_cache=yes tags: mysql name: MySQL start service: name=mysql state=started tags: mysql 설치소프트웨어가많아질수록라인수는점점커 지고길어질수있기때문에적절히디렉토리를나누 고설정파일을분할할필요가있다. ansible 에서정리 한 best practice 9) 와 role 모델 10) 정보를기반으로구성 하였다. ansible 예제로나온 role 단위별로정의한형 태 11) 로디렉토리구조와파일형태를최대한활용했 다. 이렇게사용하면분할된 role 로나뉘다보니복잡 성은사라지고유지보수관리가편해지는장점이있 다. < 그림 5> 와같은디렉토리와 playbook 파일 (role) 을 정의했다. 설치기본파일은 playbooks 디렉토리밑에 setup. yml 로한다. 아래는 playbooks/setup.yml 파일이다. v agrant user 로 sudo 권한으로 common, java, compile, mysql, tomcat role 순서대로설치하도록한다. hosts: all user: vagrant sudo: True roles: common java 그림 5_ 필자가구성한 playbooks 예제디렉토리구조 9) http://docs.ansible.com/playbooks_best_practices.html 10) http://docs.ansible.com/playbooks_roles.html 11) http://docs.ansible.com/playbooks_roles.htm 12

SW 공학트렌드 동향분석 Webzine compile mysql tomcat common role 은가상서버에서사용할공통유틸리티를설치하는내용을정의한다. common 디렉토의 main.yml 파일을찾는다. common/vars/main.yml 파일이다. 유틸리티 zip, git, maven, ant 를정의한다. packages: zip git maven ant common/tasks/main.yml 파일에서는 packages.yml 파일을 include 하고 common/vars/mai n.yml 에서 packages 값을전달한다. include: packages.yml tags=packages common/tasks/packages.yml 파일은 apt-get 으로 zip, git, maven, ant 를설치하라고한다. name: install packages apt: pkg={{ item }} state=latest update_cache=yes with_items: packages 다음은 oracle 의 jdk 7 을설치하도록하는 java/tasks/main.yml 파일이다. oracle jdk 를 바로다운받기쉽지않다. apt-get 으로다운받을수있도록준비하고다운받도록한다. ( 가장좋은방법은미리 oracle jdk 를다운받은후가상서버로복사하는것일수있다.) name: ensuring add apt repository is installed apt: pkg=python software properties state=latest name: adding webupd8 ppa for java7 installer apt_repository: repo=ppa:webupd8team/java name: updating apt cache apt: update_cache=yes name: installing java7 shell: echo debconf shared/accepted oracle license v1 1 select true debconf set selections && echo debconf shared/accepted oracle license v1 1 seen true debconf set selections && apt get y install oracle java7 installer 지금까지공통유틸리티와 oracle java7 설치를완료했다. 이제는소스를 clone 하고 컴파일을한다. compile/vars/main.yml 파일이다. jpaminimal 예제의 git url 정보와 clone 되고난후저장할가상서버위치를변수로지정한다. git_clone_url: https://bitbucket.org/gerrytan/jpaminimal.git git_location: /app/git compile/tasks/main.yml 파일로서, 가상서버의 clone 된파일을모두지우고 clone 을진 행한후, maven 빌드를진행한후디렉토리 permission 을 vagrant.vagrant 로수정한다. name : delete git cloned directory shell: rm rf {{ git_location }} 13 2014 August (No.103)

공학트렌드 name : git clone git: repo={{ git_clone_url }} dest={{ git_location }} update=no name : mvn compile command: chdir={{ git_location}} mvn package name: change permission file: path=/app/git owner=vagrant group=vagrant state=directory recurse=yes 다음은 mysql 설치를진행한다. mysql/vars/main.yml 파일이다. utf8 로설정했고 mysqld 설정으로 bind_adress 를지정한다. utf8: true mysqld: bind_address: 127.0.0.1 mysql/tasks/main.yml 파일이다. /usr/bin/mysqld 파일이있으면 mysql 을설치하지않도 록했다. 그리고 templates/mysqld.conf.j2 (jinja2 파일 ) 을가성서버에 mysqld.conf 파일로 복사하도록하였다. 이렇게하여변수나이벤트시설정파일을동적으로변경시킬수 있도록하였다. ( 예, utf8 변수선언 ) was 에서사용할논리 DB 의 table 을매번삭제하고 재생성하도록한후 mysqld 데몬을재실행하도록하였다. stat: path=/usr/bin/mysqld register: mysqld_exist name: mysql 5.5 installation apt: pkg=mysql server 5.5 state=present update_cache=yes when: mysqld_exist.stat.exists == false name: copy conf.d/mysqld.cnf action: template src=mysqld.cnf.j2 dest=/etc/mysql/conf.d/mysqld.cnf notify: restart mysql shell: /usr/bin/mysql u root password= e "DROP TABLE IF EXISTS hello ; CREATE DATABASE IF NOT EXISTS hello; USE hello; CREATE TABLE person (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50));" ignore_errors: True when: mysqld_exist.stat.exists == true name: start mysql service: name=mysql state=restarted enabled=yes sudo: True mysql/template/mysql.conf.j2 파일이다. jinja2 의스크립트가사용되었다. utf8 변수가 정의되어있다면언어설정에 utf8 을설정값을저장하도록한다. [mysqld] {% if utf8 %} character set server = utf8 collation server = utf8_unicode_ci {% endif %} mysql/handlers/handlers.yml 파일은 tasks.yml 에서정의한 copy conf.d/mysqld.cnf 이름을 가진 task 가완료되면 handler 로 notify 할수있다. mysql 데몬을재시작하도록한다. 14

SW 공학트렌드 동향분석 Webzine name: restart mysql action: service name=mysql state=restarted enabled=yes 마지막은 tomcat 설치부분이다. tomcat/vars/main.yml 에는가상서버에 tomcat 이저장 할위치를지정한다. tomcat_dir: /app/tomcat tomcat/tasks/main.yml 파일은톰캣설치에대한정보를언급하고있다. 웹에서다운받 아서 tomcat_dir 에저장하도록한후, compile 된 war 파일을 webapps 디렉토리에복사한다. 그리고 tomcat 실행파일 (tomcat-initscript.sh) 과 tomcat 설정파일 (server.xml) 을가상서버 에잘복사하도록한다. 그리고 service 데몬으로 tomcat 을실행한다. 마지막으로는톰캣 이제대로실행되어 8080 포트가 alive 한지 wait 한다. 만약정상이면 play 를종료한다. name: check if tomcat path exists stat: path=/app/src name: if tomcat dir exists stat: path=/app/tomcat name: download Tomcat get_url: url=http://archive.apache.org/dist/tomcat/tomcat 7/v7.0.54/bin/apache tomcat 7.0.54.tar.gz dest=/app/src/apache tomcat 7.0.54.tar.gz name: extract archive tomcat command: chdir=/app /bin/tar xvf /app/src/apache tomcat 7.0.54.tar.gz C /app/ creates=/app/apache tomcat 7.0.54 name: symlink install directory file: src=/app/apache tomcat 7.0.54 path=/app/tomcat state=link name: change ownership of Tomcat installation file: path=/app/tomcat owner=vagrant group=vagrant state=directory recurse=yes name: configure Tomcat server template: src=server.xml dest={{ tomcat_dir }}/conf/ notify: restart tomcat name: copy war to webapps command: cp {{ git_location }}/target/hello 1.0.war {{ tomcat_dir }}/webapps name: install Tomcat init script copy: src=tomcat initscript.sh dest=/etc/init.d/tomcat mode=0755 name: start Tomcat service: name=tomcat state=restarted enabled=yes register: result debug: var=result name: wait for tomcat to start wait_for: port=8080 tomcat/handlers/handlers.yml 은다음과같다. tomcat task 에서정의한설정파일복사 task 가완료되면아래이벤트가 notify 되어재시작하도록한다. 15 2014 August (No.103)

공학트렌드 name: restart tomcat service: name=tomcat state=restarted tomcat/templates/server.xml 은사용자정의된형태로저장한다. 데모에서는특별히 바꾼것은없다. 그리고 service 데몬으로쓰기위해서 tomcat/files/tomcat-initscript.sh 파일은다음과같다. 이파일은 https://gist.github.com/valotas/1000094 파일을그대로 활용했다. tomcat 구동스크립트는 init.d 기준으로하지않으나, tomcat 을 service 명령어 를통해서사용할수있는좋은예제라서참고했다. 스크립트는 Miglen Evlogiev 의소스 를그대로활용했다. #!/bin/bash # # chkconfig: 345 99 28 # description: Starts/Stops Apache Tomcat # # Tomcat 7 start/stop/status script # Forked from: https://gist.github.com/valotas/1000094 # @author: Miglen Evlogiev <bash@miglen.com> # # Release updates: # Updated method for gathering pid of the current proccess # Added usage of CATALINA_BASE # Added coloring and additional status # Added check for existence of the tomcat user # #CATALINA_HOME is the location of the bin files of Tomcat export CATALINA_HOME=/app/tomcat #CATALINA_BASE is the location of the configuration files of this instance of Tomcat export CATALINA_BASE=/app/tomcat #TOMCAT_USER is the default user of tomcat export TOMCAT_USER=vagrant #TOMCAT_USAGE is the message if this script is called without any options TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m \e[00;31mstop\e[00m \e[00;32mstatus\e[00m \e[00;31mrestart\ e[00m}" export JAVA_OPTS=" Dname=tomcat" #SHUTDOWN_WAIT is wait time in seconds for java proccess to stop SHUTDOWN_WAIT=20 tomcat_pid() { echo `ps fe grep $CATALINA_BASE grep v grep tr s " " cut d" " f2` } start() { pid=$(tomcat_pid) if [ n "$pid" ] then echo e "\e[00;31mtomcat is already running (pid: $pid)\e[00m" else # Start tomcat echo e "\e[00;32mstarting tomcat\e[00m" #ulimit n 100000 #umask 007 #/bin/su p s /bin/sh tomcat if [ `user_exists $TOMCAT_USER` = "1" ] then su $TOMCAT_USER c $CATALINA_HOME/bin/startup.sh else sh $CATALINA_HOME/bin/startup.sh fi status fi return 0 16

SW 공학트렌드 동향분석 Webzine } status(){ pid=$(tomcat_pid) if [ n "$pid" ]; then echo e "\e[00;32mtomcat is running with pid: $pid\e[00m" else echo e "\e[00;31mtomcat is not running\e[00m" fi } stop() { pid=$(tomcat_pid) if [ n "$pid" ] then echo e "\e[00;31mstoping Tomcat\e[00m" #/bin/su p s /bin/sh tomcat sh $CATALINA_HOME/bin/shutdown.sh let kwait=$shutdown_wait count=0; until [ `ps p $pid grep c $pid` = '0' ] [ $count gt $kwait ] do echo n e "\n\e[00;31mwaiting for processes to exit\e[00m"; sleep 1 let count=$count+1; done if [ $count gt $kwait ]; then echo n e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m" kill 9 $pid fi else echo e "\e[00;31mtomcat is not running\e[00m" fi return 0 } user_exists(){ if id u $1 >/dev/null 2>&1; then echo "1" else echo "0" fi } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status esac exit 0 ;; *) ;; echo e $TOMCAT_USAGE 17 2014 August (No.103)

공학트렌드 playbook 결과는로그를확인하면된다. 특별히그림 6_jpaminimal 예제의웹 UI fail 된부분이없다. 이제가상서버의 was 서버에접근해서 host inventory 파일에서정한대로이용한다. http://192.168.1.50:8080/hello-1.0/ 을웹으로접속하면 < 그림 6> 과같이정상적으로작동하는지확인이가능하다. paminimal 예제는 https://github. com/knight1128/vagrant-ansible-testbox 를참조한다. 3.3 실제개발환경 3.2 의 jpaminimal 예제의경우는워낙간단해서가상환경이필요하지않을수있다그러나저자의경우는화이트박스테스트케이스가. 없는 Legacy 환경에서는반드시필요했다. 일반유틸리티에 java, mysql, tomcat, nodejs 소프트웨어를설치하고 java was 서버한대, java 프로세스 6대, node js 프로그림 7_jmeter 개발환경세스 6대, mysql 1 대설치도 4.2 에서언급한방식으로쉽게개발환경을구성할수있다. 이개발환경을그대로개발자끼리공유해서환경구성시간을최대한줄일수있었다. 또한 vagrant/ansible 가상서버테스트환경을바탕으로 API 테스트를진행할수있다. jmeter 나 soapui 를활용할수있다. < 그림 7> 처럼 jmeter 툴을이용하여테스트환경을구축할수있다. 만약 UI 가있는경우라면, acceptance 테스트또는 funtional 테스트가가능하다. HtmlUnit, Selenium 과같은툴로 UI 를테스트하며명확한테스트를진행할수있을것이다. 그리고 QA 나연동개발이필요한개발자에게는가상서버테스트환경기반의 UI admin 을따로둘수있다. 가상서버로 api 호출과응답을체크하는 admin 서버를만들수있다. 좀더고급스럽게개발한다면 facebook 의개발자센터와같은형태도가능하다. 18

SW 공학트렌드 동향분석 Webzine Ⅳ. 결론 지금까지 vagrant/ansible 을활용한개발자환경을구성해보았다. 가상머신을통제하는 vagrant 와환경구성툴인 ansible 을이용한다면개발자간, 또는개발자-QA, 개발자- 관리자간원활한소통을이어줄수있을것이다. ansible 은 vagrant 뿐아니라 docker 와도연동가능하기때문에다른개발환경을구축할수있다. 그리고 ansible 의고급기능은 production 레벨에서서버배포환경및서버모니터링연동도쓰일수있는훌륭한상용배포툴로사용이가능하다. 최근에트렌디하게사용하고있는 Continuous Deployment 를구현할수있다. 그리고 ansible 을 push 방식으로쓰기도하지만, pull 방식으로쓸수있다. 즉, 상용서버에서 git repository 로 cronjob 으로소스 checkout 을받아서버설정을현행화할수있다. ansible 은계속발전되고있기때문에틈틈이익혀두면, 업무에많은도움이될것이라생각한다. 참고자료 1. http://redmonk.com/sogrady/2013/12/06/configuration-management-2013/ 2. http://en.wikipedia.org 3. http://ko.wikipedia.org 19 2014 August (No.103)