여러 개의 서버를 효율적으로 관리하기 위한 도구

소프트웨어 프로비저닝, 구성 관리, 애플리케이션 전개 도구인 Ansible에 대해 알아봅니다.

여러 개의 소프트웨어를 배포, 업데이트, 오케스트레이션이 어떻게 가능한지 알아봅니다.




목표

  • Ansible에 대해 알아봅니다.
  • Ansible의 구성요소에 대해 이해합니다.
  • Ansible 예제 코드에 대해 알아봅니다.





Ansible이란

Ansible이란 Python으로 작성된 IT 자동화 소프트웨어 애플리케이션입니다. 애플리케이션을 배포하고 업데이트를 지원하기 위해 시스템을 구성합니다. 나아가 소프트웨어를 배포하고 복잡한 워크플로를 오케스트레이션할 수 있습니다.

  • 인프라 관리를 코드 기반으로 자동화하는 도구라고 생각하시면 됩니다.
    • Infrastructure as Code (IaC) 와 같은 IT 인프라를 코드 기반으로 자동 설치, 구축, 프로비저닝 하는 프로세스를 말합니다.
  • Ansible은 1년에 두 번 주요 릴리즈됩니다.





Bash 쉘 스크립트대신 엔서블

기존 리눅스에서 동일한 환경을 구성하기 위해 쉘 스크립트에 패키지 설치, 설정파일 수정 등 명령어를 나열하여 실행하는 것이 일반적이었습니다.

여러 기술이 등장하고 진보함에 따라 인프라 환경도 데이터 중심에서 클라우드 환경으로 변화되었고, 이는 한명의 관리자가 관리해야 하는 서버의 숫자가 증가하게 되었습니다.

ansible1.png

[출처 : https://www.theregister.com/2012/03/26/opscode_funding_chef_momentum/]

따라서 클러스터에 존재하는 많은 서버들이 동시에 동일한 환경을 배포해야 하는 상황이 발생하게 되었고, 쉘 스크립트의 한계점을 가지게 되었습니다.





Ansible 특징

Ansible의 특징을 알기전에 기존 IaC 솔루션들에 대한 이해가 필요합니다.

기존 IaC의 솔루션(Chef/Puppet)은 원격 서버에 에이전트를 설치하여 Controller 서버와 원격 서버에 설치된 Agent들이 명령을 주고 받는 방식으로 동작했습니다.

Ansible은 SSH프로토콜을 기반으로 원격 서버에 명령을 전달하기 때문에 Agent가 필요하지 않습니다.

  • Ansible을 agentless, Chef/Puppet을 agent-based라고 칭합니다.

Agent를 설치하지 않는 것의 장점은 다음과 같습니다.

  • 설치 및 설정의 간소화 : Ansible을 사용하면 원격 시스템에 Agent를 설치하고 구성해야 하는 추가 작업이 존재하지 않으므로 구성 관리 환경을 빠르게 구축할 수 있습니다.
  • 확장성 : Agent를 설치하지 않아도 되므로 인프라의 규모가 확장됨에 따라 유연하게 대처가 가능합니다.
  • 호환성 : Ansible은 다양한 운영 체제와 플랫폼을 지원하므로, 에이전트를 설치하는 것과는 달리 다양한 환경에서 작동할 수 있습니다.





무조건 좋은가?

🔥 위의 장점들은 에이전트를 설치하지 않는 접근 방식인 Ansible의 특징입니다. 그러나 사용 사례와 환경에 따라 기존의 IaC솔루션인 Chef와 Puppet과 같은 에이전트 기반 도구가 더 적합한 경우가 있을 수 있으니, 구체적인 요구 사항과 상황을 고려에 도구를 선택하는 것이 중요합니다.

ex) 복잡한 인프라 구성이 필요할 때 Chef와 Puppet을 사용하는 것이 적절합니다. Ansible은 설치 와 설정의 간소화의 이점이 존재하지만 복잡한 인프라를 구성하기에는 유연하지 않습니다.





Ansible 요소

스크린샷 2023-05-22 오후 4.16.09.png

[출처 : https://static.javatpoint.com/tutorial/ansible/images/ansible-architecture.png]

엔서블의 구성요소는 크게 아래와 같습니다.

  • Inventory : Ansible이 관리할 호스트 및 그룹을 정의하는 파일 또는 인벤토리 서버입니다. hosts.ini 파일에 정의해 사용하며, 여러 서버들의 SSH접근 IP, 포트, 사용자의 접속 정보등을 정의합니다.
  • Modules : Ansible에서 제공하는 작업 단위입니다. 모듈은 시스템 상태를 변경하거나 작업을 수행하는 데 사용됩니다.
  • Playbooks : 플레이북은 작업을 수행하기 위한 정의와 순서를 기술하는 YAML 형식의 파일입니다. 단독으로 사용되는 것이 아닌 인벤토리와 함께 사용합니다.
  • Roles : 롤은 여러 플레이북을 조직화하여 재사용 가능한 구성 단위로 분리할 수 있습니다. 롤은 일반적으로 특정 역할이나 기능을 수행하는데 사용되며, 구성 관리의 모듈화와 모듈 재사용을 촉진합니다.
  • Ad-hoc Commands: Ad-hoc 명령은 명령줄에서 간단한 작업을 실행할 수 있으며, 특정 모듈과 함께 사용됩니다. ex) 원격 호스트에서 파일을 복사하거나 패키지를 업데이트할 수 있습니다.





Ansible 요소 예제 코드

Inventory

1
2
3
4
5
6
7
#호스트 파일 예제(inventory.ini)
[webservers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11

[databases]
db1 ansible_host=192.168.1.20

Modules

1
2
3
4
5
6
7
8
#파일 복사 모듈(copy)을 사용하는 예제
- name: Copy file
  hosts: webservers
  tasks:
    - name: Copy file to remote host
      copy:
        src: /path/to/local/file
        dest: /path/to/remote/file

Playbooks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#웹 서버 구성을 위한 플레이북 예제(webserver.yml)
- name: Configure web servers
  hosts: webservers
  tasks:
    - name: Install Apache web server
      apt:
        name: apache2
        state: present

    - name: Start Apache service
      service:
        name: apache2
        state: started
        enabled: true

Roles

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mywebserver/
  ├── tasks/
  │   └── **main.yml**
  ├── handlers/
  ├── templates/
  ├── files/
  ├── vars/
  └── meta/

##----- mywebserver/tasks/main.yml
- name: Install Apache web server
  apt:
    name: apache2
    state: present

- name: Start Apache service
  service:
    name: apache2
    state: started
    enabled: true


Ad-hoc Commands

1
2
#패키지 업데이트틀 위한 Ad-hoc 명령 에제
ansible webservers -m apt -a "name=apache2 state=latest"




Reference