Computer Science

[Ansible] 개념 공부

환경 구성 자동화 도구로는 가장 기초적으로 bash shell script을 사용한다.

현재 필자도 팀에서 환경구성을 쉘스크립팅으로 하고 있고 안정화 단계에 이르렀지만, 쉘 스크립트로는 완전히 자동화할 수 없는 영역들이 분명히 있기에, 초기에 스크립팅을 했던 필자에게만 환경 구성에의 정보가  쏠려있다는 단점이 있었다.

또한 아무리 매뉴얼을 작성해놓았다고 해도, human error는 항상 존재했다. 작업이 복잡해질 수록 human error가 생길 수 있는 여지는 더 커졌고, 인프라에 맞게 확장하기 어려워졌다.

 

이러한 이슈를 해결할 수 있는 방법을 고안하다가 알게 된 것이 Infrastructure as Code였다. 처음에는 조금 더 팀원들이 직접 관여하고 이해하기 위해 스크립팅을 했다면, 이제는 자동화를 통해 더 안정화된 환경을 구성할 필요성을 느끼게 되었다.

 

 

 

Ansible 이란?

 

Ansible은 오픈소스 IT 환경 구성 관리/자동화 툴이다. 서버, 네트워크 및 애플리케이션을 프로비저닝, 배포, 관리하는 데 사용됩니다.

Ansible은 매우 확장성이 높으며, 수천 대의 서버를 동시에 관리할 수 있게 하며, 다양한 클라우드 플랫폼, 컨테이너 관리 도구 및 다양한 기존 시스템과 통합되는 다양한 모듈을 제공합니다.

더 자세히 ansible에 대해 알고싶다면 RedHat에서 읽어볼 수 있다.

 

💡 알아야할 개념들

- managed node(host): 환경 구성의 대상이 되는 컴퓨터들. Host, Target 등등으로도 표현한다.

-
control node: 앤서블 플레이북을 수행하는 서버. linux/unix 계열 + python 이 설치되어있어야 함.

 

 

Ansible의 특징

 

1. 멱등성

멱등성을 갖도록 설계됨. 멱등성이란 연산을 여러번 적용하더라도 결과가 달라지지않는 성질을 의미한다.

ansible의 기능들은 모두 멱등성을 갖는다. 동일한 task는 여러 번 실행해도 계속 같은 결과가 나온다.

 

2. agent-less

managed node에는 ansible 프로그램 설치할 필요가 없다. SSH 접속으로만 자동화를 구성할 수 있다.

 

 

 

Core components: 주요 구성요소 3가지

- 어디서(where), 무엇을(what), 어떻게(how) 수행할 지를 정의

 

출처: https://www.lesstif.com/ansible/ansible-22052877.html

 

1. Where: Inventory

- 작업을 진행할 대상 서버들의 목록(managed node)

 

앤서블은 여러 host(대상 서버)에 대해 동시에 작업을 수행하는데, 작업의 대상이 되는 host들의 정보를 구성 파일로 미리 작성해야 한다.

ini, yaml, toml, json 형식으로 파일을 작성할 수 있는데, 편한 형식을 사용하면 된다. 필자는 ini를 사용할 예정이다.

 

[deployment]
x.x.x.x

[product]
y.y.y.y
z.z.z.z
a.a.a.a

[development]
b.b.b.b

[ ]를 사용해서 하위그룹으로 나눌 수 있고, 임의로 나눈 deployment, product, development 세 개의 그룹들은 모두 all에 포함된다.

인벤토리 파일을 작성했다면, ansible명령어로 인벤토리가 잘 작동하는 지 확인해볼 수 있다.

 

- 그룹이름을 넣어, 변수의 호스트들이 잘 출력되는 지 각각 확인

ansible --list-hosts -i inventory ${GROUP_NAME}

 

- 여러 그룹 한번에 확인

ansible --list-hosts -i inventory '${GROUP_NAME1} ${GROUP_NAME2}'

 

- 모든 호스트 확인

ansible --list-hosts -i inventory all

 

 

2. How: Modules

- 앤서블이 실행하는 코드 단위

 

쉽게 생각하면 단일 명령어 자체를 명령어라고 할 수 있다. ansible이 제공하는 멱등성이 보장되는 다양한 모듈들은 ansible docs에서 탐색해볼 수 있다. ( 물론 직접 개발할 수도 있음! )

예시로, 파일 관련 처리를 할 때 `file`, control node에서 managed node로 파일을 복사할 때 `copy`,

쉘 명령어를 실행할 때 `shell`, 디버그 문자열 출력할 때 `debug`를 사용한다.

 

3. What: Playbooks

- 인벤토리 파일에서 정의된 host에서 할 작업들. 즉, 자동화 작업 스크립트.

 

module의 모음을 하나의 파일로 task라고 정의한다. playbook은 host와 task를 연결한다.

# ping_test.yml

- name: ping test
  hosts: all
  gather_facts: false
  user: ubuntu
  tasks:
    - name: ping test
      ansible.builtin.ping:

간단한 예시로, 앞에서 작성한 전체 호스트들에 ping 테스트를 하는 playbook을 구성해보았다.

 

ansible-playbook -i inventory ping_test.yml

`ansible-playbook` 이라는 명령어로 defined task들을 실행할 수 있다.

 


 

간단히 Ansible이 무엇인지와 구성요소에 대해 알아보았다.

다음 글에서는 docker와 함께 macOS 기준으로 환경 구성을 해서,
원격 ubuntu장비들의 환경구성을 하는 예제들을 직접 짜볼 예정이다.