본문 바로가기
Dev/DevOps

Ansible

by TrendPilot 2025. 4. 23.
Ansible은
효율적인 IT 자동화 도구로, 서버 관리부터 구성, 배포까지 다양한 작업을 자동화할 수 있습니다.
특히 여러 서버를 동시에 관리해야 하는 환경에서 큰 힘을 발휘합니다. 

Ansible이란?

Ansible은 Python으로 구현된 오픈소스 IT 자동화 도구로, 서버의 프로비저닝, 소프트웨어 배포, 인프라 구성 및 관리 등을 자동화할 수 있는 IaC(Infrastructure as Code) 도구입니다. 기존에는 동일한 환경의 서버를 구성하기 위해 쉘 스크립트를 사용했지만, 클라우드 환경으로 변화하고 관리 서버 수가 급격히 증가하면서 이러한 방식의 한계가 드러났습니다. Ansible은 이런 문제를 해결하기 위해 개발되었습니다.

Ansible의 주요 특징

  1. Agentless(에이전트리스): 타겟 서버에 별도의 에이전트를 설치할 필요 없이 SSH를 이용한 PUSH 방식으로 동작합니다. 이는 다른 자동화 도구들(Puppet, Chef 등)과의 큰 차별점입니다.
  2. 멱등성(Idempotency): 어떠한 연산이 여러 번 수행되어도 결과가 달라지지 않는 성질을 말합니다. Ansible에서는 같은 모듈을 반복 실행해도 결과가 동일하게 출력되며, 변경이 필요한 부분만 반영합니다.
  3. 쉬운 사용법: YAML 형식을 사용하여 프로그래밍 언어보다 구성이 쉽고, 사람이 읽기 편한 형태로 작성됩니다.
  4. 다양한 모듈 제공: 리눅스 기본 명령어부터 퍼블릭 클라우드, 쿠버네티스 등 수많은 모듈과 컬렉션을 제공합니다.
  5. OpenSSH 표준화된 통신 방식: 안전하고 표준화된 통신 방식을 사용하여 보안성을 강화합니다.

Ansible의 구성 요소

Ansible은 다음과 같은 주요 구성 요소로 이루어져 있습니다.

1. 제어 노드(Control Node)

  • Ansible 엔진이 설치된 시스템으로, 제어 노드에서 Ansible 명령어를 실행하여 관리 노드를 제어합니다.
  • Unix 계열 시스템만 제어 노드가 될 수 있으며, Windows 자체는 제어 노드로 직접 사용할 수 없지만, WSL(Windows Subsystem for Linux)을 사용하면 Windows 환경에서도 Ansible을 실행할 수 있습니다.
  • Python이 설치되어 있어야 합니다(Python은 Ansible이 파이썬으로 구현되었기 때문).

2. 관리 노드(Managed Node)

  • Ansible로 관리되는 서버 또는 시스템을 말합니다.
  • 관리 노드에는 별도의 에이전트 설치가 필요 없으나, Python은 설치되어 있어야 합니다.
  • SSH를 통해 통신하므로 SSH 접속만 가능하면 제어 가능합니다.

3. 인벤토리(Inventory)

  • Ansible에 의해 제어되는 대상이 정의된 파일입니다.
  • 기본적으로 /etc/ansible/hosts 경로에 위치하지만, -i 옵션으로 커스텀 파일을 지정할 수도 있습니다.
  • 서버를 그룹화하여 관리할 수 있습니다.
[web]
192.168.10.157
192.168.10.158

[db]
192.168.10.162

4. 플레이북(Playbook)

  • 인벤토리에 정의한 대상에서 무엇을 수행할지 정의하는 YAML 형식의 파일입니다.
  • 여러 작업(tasks)을 순서대로 실행할 수 있으며, 재사용 가능합니다.
  • 플레이북은 하나 이상의 플레이로 구성되며, 플레이는 작업 세트로 구성됩니다.

5. 모듈(Module)

  • 플레이북에서 작업이 어떻게 수행될지 나타내는 요소로, 다양한 모듈을 지원합니다.
  • 주요 모듈에는 ping, command, shell, copy, template, service, apt/yum, user 등이 있습니다.
  • 모듈은 멱등성을 일관적으로 수행할 수 있게 해주며, 바뀌는 부분이 있으면 그 부분만 반영합니다.

Ansible 설치 및 환경 조건

설치 요구 사항

  1. 제어 노드 요구 사항:
    • Unix 계열 시스템 (Linux, macOS 등)
    • Python 2.6 이상 또는 Python 3.5 이상
    • SSH 클라이언트
  2. 관리 노드 요구 사항:
    • SSH 서버
    • Python 2.6 이상 또는 Python 3.5 이상

설치 방법

Ubuntu/Debian 계열

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

CentOS/RHEL 계열

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo yum install ansible

macOS (Homebrew 사용)

brew install ansible

설치 확인

Ansible이 제대로 설치되었는지 확인하려면 다음 명령어를 실행합니다:

ansible --version

Ansible 설정

Ansible의 기본 설정은 /etc/ansible/ansible.cfg 파일에 있으며, 홈 디렉토리에 .ansible.cfg 파일을 생성하여 개인 설정을 할 수도 있습니다.

주요 설정 옵션:

  • host_key_checking = False: SSH 호스트 키 체크를 비활성화
  • [defaults] 섹션: 인벤토리 위치, 원격 사용자 등 기본 설정
  • [privilege_escalation] 섹션: 권한 상승 방법 설정(sudo 등)

Ansible 사용 방법

1. 인벤토리 파일 설정

관리할 서버 목록을 정의하는 인벤토리 파일을 설정합니다. 예시:

[webservers]
192.168.0.1
192.168.0.2

[dbservers]
192.168.0.3

2. Ad-hoc 명령어 사용

간단한 작업을 실행할 때는 Ad-hoc 명령어를 사용할 수 있습니다.

# 연결 테스트
ansible all -i inventory.ini -m ping

# 패키지 설치
ansible web -m apt -a "name=nginx state=present" --become

# 서비스 시작
ansible web -m service -a "name=nginx state=started" --become

# 파일 복사
ansible web -m copy -a "src=./index.html dest=/var/www/html/index.html" --become

3. 플레이북 작성 및 실행

여러 작업을 순서대로 실행해야 할 때는 플레이북을 작성하여 사용합니다.

예시 플레이북 (nginx-install.yml):

---
- name: NGINX 설치 예제
  hosts: webservers
  become: yes
  tasks:
    - name: Install NGINX
      apt:
        name: nginx
        state: present

    - name: Start NGINX service
      service:
        name: nginx
        state: started
        enabled: yes

플레이북 실행:

ansible-playbook -i inventory.ini nginx-install.yml

4. 자주 사용되는 모듈

Ansible에는 다양한 모듈이 있습니다. 자주 사용되는 모듈은 다음과 같습니다:

모듈명 설명
ping 연결 테스트
command 임의 명령 실행
shell 셸 명령 실행 (파이프 허용)
copy 파일 복사
template Jinja2 템플릿 복사
service 서비스 시작/중지/재시작
apt/yum 패키지 설치/삭제
user 사용자 추가/삭제

사용 시 주의사항

  1. 멱등성이 보장되지 않는 모듈: shell, command, file 모듈은 멱등성이 보장되지 않으니 주의해서 사용해야 합니다.
  2. 패스워드 기반 접속: SSH 키 대신 패스워드 인증을 사용할 경우, 컨트롤러 서버에 sshpass 설치가 필요합니다.
  3. apt install sshpass
  4. ssh 설정: Ansible을 원활하게 사용하기 위해 SSH 키 교환이나 적절한 SSH 설정이 필요합니다.

Terraform과의 차이점

Ansible과 Terraform 모두 인프라 자동화 도구이지만, 몇 가지 중요한 차이점이 있습니다:

  1. 상태 관리:
    • Ansible은 상태를 관리하지 않습니다(stateless).
    • Terraform은 상태를 관리하여(stateful) 코드가 이미 반영된 경우 실행하지 않습니다.
  2. 코드 실행 구조:
    • Ansible은 SSH 프로토콜을 사용하여 코드를 실행합니다.
    • Terraform은 provider가 제공하는 API를 사용합니다.
  3. 사용 목적:
    • Ansible은 여러 시스템에 동일한 작업을 수행할 때 주로 사용합니다.
    • Terraform은 주로 한 시스템(예: 클라우드 서비스)의 설정 또는 리소스 관리에 사용합니다.

결론

Ansible은 에이전트 설치가 필요 없는 간편한 자동화 도구로, YAML 기반의 쉬운 문법과 다양한 모듈을 통해 여러 서버의 구성 및 관리를 효율적으로 자동화할 수 있습니다. 특히 멱등성을 보장하여 같은 작업을 여러 번 실행해도 결과가 일관되게 유지되는 특징이 있습니다.

 

'Dev > DevOps' 카테고리의 다른 글

Terraform  (0) 2025.04.24
Ansible 실습  (0) 2025.04.23
Kaniko  (0) 2025.03.10
ArgoCD - gitea 연동  (0) 2025.02.27
ArgoCD  (0) 2025.02.26