DevOps - Ansible
Ansible 이란
Ansible은 redhat
에서 제공하는 오픈소스 프로젝트이다.
개발 언어는 Python으로 개발되었고 모토는 “모든 사람을 위한 자동화”라는 철학을 갖고 있는 프로비저닝 툴이다.
Ansible은 YAML 파일로 정의된다. “모든 사람을 위한 자동화”라는 철학에 맞게 개발자가 아니더라도 쉽게 이해할 수 있는 포멧을 채택한 것으로 보인다.
그렇다면 이 Ansible은 대체 왜 쓰는 것일까?
Ansible Feature
만약 여러분이 10대의 물리적 장비(여기서는 컴퓨터가 되겠다.)를 갖고 있다고 가정하자.
그리고 Springboot 프로젝트로 만든 jar 파일을 10대의 서버에 배포하고 싶다고 해보자.
그러면 우선적으로 해야할 일은 Bash 쉘 스크립트를 사용해서 환경 설정 하는 것이 우선 첫 번째 작업일 것이다.
그 이후,
JDK를 비롯한 여러 패키지들을 설치해야할 것이며…
git clone 명령어로 프로젝트도 받아와야할 것이며…
받아온 프로젝트를 gradle wrapper로 빌드도 해야할 것이며…
빌드해서 만든 jar를 실행도 해야할 것이며…
등등등…
위의 일련의 작업들을 일일이 10대의 장비에 직접 수행한다고 생각해보자.
뭐 당연히 가장 먼저 떠오르는 방법은 “직접 수행하면 되는거 아냐?” 일 것이다.
최초 한번 정도이니까 직접 수행하는 것도 나쁘지 않을지도 모른다.
그러나 소프트웨어라는 것은 애초에 기본적으로 변경을 깔고 들어간다.
최초의 배포 이후 요구사항이나 버그라던지 여러가지 이유로 인해 변경 사항이 발생할 수 있다.
그래서 이러한 변경 사항에 대한 핫픽스나 업데이트가 정기적으로 또는 빈번하게 일어나는 경우라면?
그럼 저 일련의 과정을 매번 해야하는데?
이러한 상황에서는 어떻게 해야할까?
이럴 때 필요한 것이 바로 Ansible이다.
클러스터에 존재하는 다수의 서버들이 동일한 환경에서 배포해야하는 상황에서 Bash 쉘 스크립트는 한계를 갖는다.
이를 위해 고안된 아이디어가 바로 Infrastructure as a code이다.
Infrastructure as a code는 배포 환경 구성을 규격화된 코드로 정의해 사용하는 것을 의미한다.
이러한 자동화 도구 중 가장 대표적인 툴이 Ansible이다.
Ansible의 3 요소
Ansible이 왜 쓰는지는 알았으니 이제 어떻게 이루어져있는지를 알아보자.
Ansible은 크게 3 요소로 이루어져있다.
Inventroy
Playbook
Module
여기서 이는 각각 어디서 무엇을 어떻게 수행할지를 정의한다.
각각 하나씩 살펴보자.
Inventory
게임에서 인벤토리라고 하면 보통 아이템을 저장하는 장소 정도로 알고 있는 경우가 많다. 나 역시도 게임을 좋아하기 때문에 그렇게 알고 있다.
우리가 알고 있는 게임에서의 인벤토리의 개념과 흡사하다.
Ansible의 Inventory는 배포 환경 구성에 필요한 서버들의 목록을 정의해놓은 파일이다.
즉 Ansible에 배포할 물리적 장치들의 목록을 정의해두는 파일이다.
hosts.ini 파일에 정의해 사용하며, 접근할 물리적 장치들의 SSH 접근 ip, 포트, 리눅스 사용자 등과 같은 접속 정보를 아래와 같이 명시해둔다.
[webserver]
web1 ansible_host = aaa.app.host
web2 ansible_host = bbb.app.host
Playbook
Playbook은 Inventory 파일에서 정의한 대상들이 무엇을 수행할 것인지를 정의하는 역할을 담당하며 yaml
로 작성한다.
Ansible을 이용하려면 Playbook을 사용하는 법을 알아야한다.
예시는 아래와 같다.
- name: ngins install
hosts: all
become: true
tasks:
- name: ngix package install
yum:
name: nginx
state: installed
Module
Module은 tsak가 어떻게 수행될지를 정의하는 요소이다.
실제 작업을 처리하는 단위로, Module에 필요한 옵션들을 명시해주어 사용할 수 있다.
Ansible에서 제공하는 Module은 약 500개 정도지만 사용하는 Module은 한정되어있다고 한다.
그래서 Module을 사용할때는 반드시 모듈 사용법을 숙지해야만 사용이 가능하다.
Idempotence (멱등성)
멱등성이란 무엇일까?
멱등성이란 동일한 작업을 수행해도 항상 같은 결과를 내는 것을 의미한다.
가령 100*1은 항상 100이기 때문에 이는 멱등성을 지킨다고 할 수 있다.
Ansible에서 이러한 멱등성을 지원한다는 것의 의미는 한번 성공적으로 수행된 플레이북이 몇번이고 다시 수행되더라도 서버에 전혀 영향을 끼치지 않는다는 의미이다.
왜냐하면 Ansible은 변화가 있을때만 수행되고 변화가 없는 경우 수행하지 않는다.