맘가는 대로

베이그런트 멀티 노드 생성 본문

자동화/베이그런트

베이그런트 멀티 노드 생성

ALIVEisANSWER 2019. 6. 1. 15:18

앞서

베이그런트를 통해 서버를 생성하다 보면 한 대가 아닌 여러대의 서버를 생성해야 할 때가 분명 있을 것이다. 단일 서버가 아닌 여러대의 서버를 생성하고, 이중화, 부하 분산, 클러스터링 등 다양한 목적으로 여러대의 서버를 사용해야할 때가 있을 것이다.

 

물론, 여러개의 Vagrantfile 을 작성하고 네트워크 대역을 동일하게 하는 식으로 할 수도 있지만, 베이그런트는 멀티 노드 구성을 지원하고 있다. 따라서 어렵지 않게 코딩을 하듯 자연스럽게 멀티 노드를 구성할 수 있다. 

 

간단한 구성부터 시작해보자

 

가볍게 2 대 부터

한 Vagrantfile 에서 여러대의 가상 머신을 만들기 위해 사용되는 베이그런트의 문법은 define 이다. 

 

LAMP 시스템 구성을 위해 1 대의 웹 서버와 1 대의 DB 서버를 구현한다고 해보자. define 을 통해 2 개의 서버 설정 구획을 작성한다.

 

define 문구 뒤의 문자열이 베이그런트에서 관리하는 서버명이 된다.

 

2 개의 구획을 마련했다. 이 구획들은 다시 별도의 변수를 사용해서 서버를 설정해간다. 각 구획의 'w' 와 'd' 는 상위 구획의 'config' 와 같은 역할을 한다.

 

그리고 각 서버의 용도에 맞게 환경을 적절히 설정해보자. 주의할 점은 end 구문을 통해 구획의 끝남을 반드시 표시해주어야 한다.

 

Vagrantfile 작성을 완료하고 명령어를 입력하여 베이그런트를 실행한다.

 

이전과는 다르게 서버명이 default 가 아닌 define 에서 지정한 서버명인 web 이 뜬다. 이미지는 일부만 있어 나오지 않았지만 db 서버도 표시된다.

 

아래의 명령어를 입력하여 전체 현황을 확인해보자

 

vagrant status

 

 

지정한 서버명과 함께 서버의 상태, 가상화로 사용되는 프로그램의 이름이 나온다.

 

버추얼박스로 생성하였으니 버추얼박스 UI 를 통해서도 확인이 가능하다.

 

 

이 방법을 이용하면 2 대든 3 대든 그 이상이든 자원이 허용하는 만큼 여러대의 서버를 생성할 수 있다.

 

접속을 할 때에는 이전에 쓰던 방법만 쓰면 서버를 지정하라고 할 것이다. 지정한 호스트명이 아닌 베이그런트에서 관리하는 서버명을 사용해야 한다.

 

vagrant ssh web

 

 

 

다만, 베이그런트가 만들어진 이유를 조금 생각하다보면 2 대까지는 어지저찌 쓰더라도 3 대부터는 귀찮음이 생길 수 있다. 다음 방법을 보자.

 

다음으로 넘어가기 전 VM 을 빠르게 지우자. 다음 명령어를 친다.

 

vagrant destroty -f

 

 

가상 머신을 깔끔하게 지우되 -f 옵션을 통해 묻지 않고 바로 지운다. 삭제 순서는 서버가 생성된 순서와 반대이다.

 

쉽게 더 많이

베이그런트도 결국 Ruby 언어로 작성된 것을 기억하면 된다. 반복문을 통해 귀찮은 define 구획을 보다 적게 쓸수도 있고, 가상 머신의 속성들을 상속하거나 오버라이드하여 좀 더 편하게 여러대의 가상 머신을 작성할 수 있다.

 

우선, 같은 속성의 서버를 4 대 만들기로 해보자.

 

진행하기 위해 속성을 정의한다. 속성을 정의하는 방법은 단일 서버를 만들 때와 비슷하다.

 

눈치가 빠르거나 여러번 속성 입력을 해본 사람이라면 어떠한 속성을 작성하지 않았는지 바로 알아볼 수 있을 것이다. 맞다. 겹치면 안되거나 관리에 어려움을 주는 속성들을 제외했다. 네트워크 주소는 동일 네트워크 대역에서 겹쳐야 하지 않으며, 호스트명은 겹치게 되면 안되는 것은 아니지만 시스템에 매우 많은 문제를 초래할 것이다. 

 

자, 이제 겹치면 안되는 속성들을 위해 define 구획에서 구분해주자.

 

쓰긴 썼는데, 4 대가 아닌 1 대밖에 쓰지 못하였다. 여기서 반복문이 힘을 발휘한다. 

 

define 구획의 앞과 뒤에 반복문을 위한 구문을 넣고 간단한 변수를 통해 동일한 속성의 가상 머신을 4 대 구성할 수 있는 Vagrantfile 이 완성됐다.

 

각 반복이 진행될 때 변수 사용을 위해 do 문을 통해 변수를 받고 문자열 내에서 #{} 구문을 통해 해당 변수를 사용할 수 있다. 만약 그냥 i 만 넣는다면 동일한 서버명이 되기 때문에 문제가된다. 안되는 것은 아니지만 4 번째의 반복만이 적용되어 서버가 1 대만 생성된다. 다음에 관련 내용이 있기 때문에 거기서 설명하도록 하겠다.

 

이제 가상 머신을 생성하고 확인해보자.

 

과연 4 대에 대해 직접 4 개의 구획을 작성해서 쓰는 것이 좋았을까, 아니면 반복문이 좋을까? 아직 4 대까지는 직접 쓰는 방법이 더 편할 수 있다. 하지만 더 많은 대수가 필요하기 시작하다면 달라질 수 있다. 물론, 컴퓨팅 자원이 부족할 수도 있다. 하지만, 더 현실적인 이의 제기는 항상 같은 서버를 만들수 만도 없다는 것일 것이다. 

 

한 대의 마스터 - 여러 대의 슬레이브

멀티 노드를 생성할 때 모든 서버를 항상 같게 만드는 것은 자신의 목적과 맞지 않을 수 있다. 그래서 베이그런트는 속성을 정의될 때 항상 마지막에 지정한 속성이 적용되도록 하였다. 즉, 각 define 구획에서 최종적으로 정의된 속성만 적용된다. 달리 말하자면 필요하다면 define 구획에서 다르게 쓰면 된다.

 

바로 확인해보자.

 

설명보다 간단할 것이다. 단순하게 define 구획을 하나 더 추가해서 또 서버 설정만 해줬다. 다만, 네트워크와 서버의 사양을 달리 썼다. 마지막의 define 구획에서 master 서버에 대해 한번 더 속성을 정의했기 때문에 마지막으로 정의해준 구획내의 속성이 최종적으로 적용된다.

따라서 아까 서버명에 변수가 올바르게 적용되지 않으면 단 1 대만 생성되는 이유도 이 때문이다. 이름이 같기 때문에 같은 서버에 대해 여러번 설정을 한 것이 되버리며, 마지막 반복의 설정만이 적용된다.

 

서버가 생성되는 순서는 코드의 순서와 동일하여 node 서버들이 1 에서 4 까지 차례대로 생성되고 마지막으로 master 서버가 생성된다.

 

 

서버를 확인하면 ip 와 서버 사양, 호스트명이 서로 다른 것을 볼 수 있다.

 

물론, 서버에 프로비저닝까지 고려하여 서버 부팅 순서가 중요하다면, 이전에도 말했듯이 코드의 순서를 바꾸면 된다. 즉, 먼저 올라와야 할 서버에 대해서 먼저 작성하면 된다.

 

목적에 맞게

더 많은 설정들이 있지만 이정도 원리만 안다면 충분히 다양하게 많은 종류의 시스템 구성을 위해 조금의 코드 변경만으로 멀티 노드를 작성할 수 있을 것이다. 물론, 모든 시스템 구성에 적합하게 사용할 수 없는 방법이지만, 원할 경우 모든 서버에 대해 각 define 구획을 작성하면 되므로 한 Vagrantfile 에 대해서는 거의 모든 필요한 환경을 구현할 수 있을 것이다.

 

마치며

로컬 환경에서 빠르게 클러스터링 환경을 구성해야 할 때, 이 방법들이 도움이 되었으면 한다. 

 

출처

매뉴얼 - https://www.vagrantup.com/docs/index.html

 

Documentation - Vagrant by HashiCorp

Welcome to the documentation for Vagrant - the command line utility for managing the lifecycle of virtual machines. This website aims to document every feature of Vagrant from top-to-bottom, covering as much detail as possible.

www.vagrantup.com

 

'자동화 > 베이그런트' 카테고리의 다른 글

베이그런트 파일 설정  (0) 2019.06.01
베이그런트 설치 및 실행  (0) 2019.06.01
Comments