13.자동화 스크립트 및 관리 도구 활용, Ansible을 이용한 서버 자동화 설정 및 배포

현대의 IT 환경에서는 여러 서버를 수동으로 관리하는 것은 비효율적이며, 오류를 발생시킬 가능성이 높습니다. 이를 해결하기 위해 다양한 자동화 도구가 개발되었으며,
그중에서 가장 인기 있는 도구 중 하나가 Ansible입니다. Ansible은 무상태의 구성 관리 도구로, YAML 구문을 이용하여
서버의 설정과 배포 과정을 자동화할 수 있습니다. 이 글에서는 Ansible을 사용하여 우분투 서버의 자동화 설정 및 배포를 단계별로 설명하겠습니다.

1. Ansible 소개

Ansible은 Red Hat에서 개발한 오픈소스 도구로, IT 인프라의 자동화, 배포, 오케스트레이션을 지원합니다.
Ansible은 에이전트가 필요 없으며, SSH를 통해 원격 서버에 연결하여 작업을 실행합니다.
인프라를 코드로 표현할 수 있어 개발 및 운영 팀 간의 협업을 개선하고, 명확한 버전 관리를 할 수 있습니다.

1.1 Ansible의 장점

  • 간단한 설치 및 사용: Ansible은 단일 파일로 배포될 수 있으며, 설정이 간단합니다.
  • 엔지니어링 친화적: YAML 기반의 플레이북을 사용하여, 복잡한 설정을 쉽게 단순화할 수 있습니다.
  • 무상태성: Ansible은 세션 또는 에이전트를 필요로 하지 않아, 어떤 서버에서든 약한 상태를 유지합니다.
  • 다양한 커뮤니티 모듈: 풍부한 모듈 라이브러리를 제공, 쉽게 기능을 확장할 수 있습니다.

2. Ansible 설치

Ansible을 설치하기 위해서는 우선 Python을 설치해야 합니다. 우분투에서는 기본적으로 Python이 설치되어 있지만, 최신 버전으로 업데이트하는 것이 좋습니다.
다음과 같은 명령어를 사용하여 Ansible을 설치할 수 있습니다.

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

설치가 완료되면, 다음 명령어로 Ansible 버전을 확인할 수 있습니다.

ansible --version

3. Ansible 구성 파일 설정

Ansible의 구성 파일인 ansible.cfg 파일을 생성하여 작업 환경을 세팅할 수 있습니다.
홈 디렉토리의 .ansible.cfg 파일 또는 프로젝트 디렉토리 안에 ansible.cfg 파일을 만들 수 있습니다.

[defaults]
inventory = ./hosts
remote_user = your_username
private_key_file = ~/.ssh/id_rsa

4. 호스트 관리

Ansible에서는 관리할 호스트 목록을 인벤토리 파일에 기록합니다.
기본적으로 hosts라는 이름의 인벤토리 파일을 생성하여 관리할 수 있습니다.

[web]
192.168.1.1

[db]
192.168.1.2

5. Ansible 플레이북

플레이북은 Ansible에서 실행할 작업의 집합을 정의하는 YAML 파일입니다.
서버의 패키지 설치 및 설정을 자동으로 진행할 수 있도록 구성할 수 있습니다. 플레이북 예제를 살펴보겠습니다.

- hosts: web
  become: yes
  tasks:
    - name: nginx 설치
      apt:
        name: nginx
        state: present

    - name: nginx 서비스 시작
      service:
        name: nginx
        state: started
        enabled: yes

5.1 플레이북 실행

플레이북을 실행하기 위해서는 다음과 같은 명령어를 사용합니다.
playbook.yml 파일이 실제 플레이북 파일 이름이 되며, 이를 적절히 변경하여 사용할 수 있습니다.

ansible-playbook playbook.yml

6. 롤과 템플릿 활용

Ansible에서는 롤을 사용하여 작업을 캡슐화하고 재사용 가능하게 만들 수 있습니다.
롤과 템플릿을 사용하여 좀 더 구조화된 플레이북을 작성할 수 있습니다.

roles/
└── webserver/
    ├── tasks/
    │   └── main.yml
    ├── templates/
    │   └── nginx.conf.j2
    └── handlers/
        └── main.yml

6.1 템플릿 예제

Jinja2 템플릿을 사용하여 설정 파일을 동적으로 생성할 수 있습니다. 아래는 nginx.conf 파일의 템플릿 예시입니다.

server {
    listen 80;
    server_name {{ domain_name }};

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

7. 배포와 롤백

Ansible을 이용한 서버 배포에는 여러 방법이 있으며, 배포 후 문제가 발생할 경우 롤백을 진행할 수 있습니다.
롤백은 이전 상태로 돌아가는 것을 의미하며, 옳바른 태그와 버전 관리를 통해 가능합니다.

8. 모니터링 및 유지보수

서버가 배포된 후, 지속적인 모니터링과 유지보수가 필요합니다.
Ansible을 통해 정기적인 작업을 실행하고, 시스템 상태를 파악할 수 있도록 설정할 수 있습니다.

- hosts: localhost
  tasks:
    - name: 시스템 업데이트
      apt:
        update_cache: yes
        upgrade: dist

9. 보안 및 접근 관리

서버 자동화 시 보안은 매우 중요한 요소입니다.
SSH 키를 활용한 접근 관리와 역할 기반의 사용자 접근 제어를 통해 보안을 강화할 수 있습니다.

---
- hosts: web
  tasks:
    - name: SSH 키 생성
      user:
        name: your_username
        generate_ssh_key: yes
        ssh_key_file: ~/.ssh/id_rsa

10. 커뮤니티 및 리소스

Ansible 커뮤니티는 활발하며, 다양한 리소스를 통해 더 많은 정보를 얻을 수 있습니다.
공식 문서, 블로그, GitHub 저장소에서 유용한 정보를 찾아볼 수 있습니다.

결론

Ansible은 우분투 서버의 자동화 및 관리에 있어 강력한 도구입니다.
효과적인 서버 설정 및 배포, 관리에 필요한 여러 기능들을 제공하여, IT 인프라의 안정성을 높이고 운영 효율성을 극대화할 수 있습니다.
이 글에서 소개한 내용을 바탕으로 Ansible을 활용한 서버 자동화를 시작해보세요.