Profile picture

[Ansible] 앤서블 초보 탈출! 1단계: 기본 개념부터 첫 자동화까지 (실습 포함)

JaehyoJJAng2024년 05월 20일

개요

매번 반복되는 서버 설정, 여러 대의 서버에 동일한 작업을 하다가 발생하는 실수 때문에 지쳐본 적 없으신가요?

Ansible은 그런 고민을 해결해 줄 아주 강력한 도구입니다!


이번 게시글에서는 앤서블의 핵심 개념을 이해하고 직접 내 손으로 첫 자동화를 실행하는 것까지 함께 해보겠습니다.


1교시: 앤서블, 도대체 뭔가요?

이전 게시글에서 앤서블이 무엇인지 아주 자세하게 설명하였습니다!


위 게시글을 읽고 오시면 도움이 되실거에요!


앤서블이란 간단히 말해 여러 대의 컴퓨터(서버)에 특정 작업을 대신 실행해주는 비서 같은 프로그램입니다.

이 똑똑한 비서는 다음과 같은 특징을 가지고 있어요!


에이전트가 필요 없어요 (Agentless)

다른 도구들처럼 관리할 서버에 일일이 무언가를 설치할 필요가 없습니다!

우리가 원래 서버에 접속할 때 쓰는 SSH 통신 방식을 그대로 사용하거든요.

그래서 도입이 아주 쉽고 가볍습니다!


사람 친화적인 언어 (YAML)

복잡한 프로그래밍 언어가 아닌, 사람이 읽고 쓰기 쉬운 YAML 형식으로 작업 지시서(플레이북)을 작성해요.

아래에서 보게 될 텐데, 진짜 너무 간단합니다.


꼭 알아야 할 핵심 용어!

앤서블 세계에서는 몇 가지 용어를 사용합니다. 비유를 통해 쉽게 이해해볼까요?

용어 비유 (내가 사령관이라면?) 설명
제어 노드 (Control Node) 사령관 (나) 앤서블이 설치되어 명령을 내리는 내 컴퓨터(서버)
관리 노드 (Managed Node) 병사들 내가 관리할 여러 대의 원격 서버들
인벤토리 (Inventory) 병사 명단 어떤 병사들(서버)을 관리할지 적어놓은 목록 파일
모듈 (Module) 명령어 종류 '소프트웨어 설치해!', '파일 복사해!' 등 실제 작업을 수행하는 부품/명령어
애드훅 (Ad-hoc) 일회성 구두 명령 플레이북 없이, 터미널에서 즉시 실행하는 간단한 단발성 명령
플레이북 (Playbook) 작전 계획서 '1. A 서버에 웹 서버 설치'
'2. B 서버에 DB 설치'
처럼 작업 순서를 기록한 시나리오 파일

2교시: 실습 준비! 나만의 앤서블 훈련장 만들기

백문이 불여일견! 직접 앤서블을 다뤄보기 위한 우리만의 실습 환경을 만들어 봅시다!

  • 인벤토리(Inventory), 플레이북(Playbook), 제어문(반복문/조건문), 변수, Role 등과 관련된 앤서블 구조는 다음 게시글을 참고하시고 아래 실습을 진행하시면 더욱 효과적입니다!
  • 앤서블 기본 구조 익히기


오늘의 실습 시나리오

상황

당신은 신입 시스템 엔지니어입니다. 선임 개발자로부터 "새로 구성한 웹 서버 2대(web1, web2)의 연결을 확인하고,

웹 서비스를 위해 nginx를 설치해주세요." 라는 요청을 받았습니다.


목표

  • 1. 내 컴퓨터(제어 노드)에서 웹 서버 2대(관리 노드)로 정상 접속이 되는지 테스트한다.
  • 2. 앤서블 플레이북을 이용하여 웹 서버 2대에 nginx를 한 번에 설치하고 실행한다.

훈련장 구축 단계

1. 가상머신 준비: 실습을 위해 최소 3대의 리눅스 서버가 필요합니다!

  • 제어 노드 (1대): control-plane
  • 관리 노드 (2대): web1, web2

2. 앤서블 설치 (제어 노드에서만!)

제어 노드 터미널에서 아래 명령어로 앤서블을 설치해주세요!

# CentOS/RHEL 계열
sudo yum install -y ansible

# Ubuntu/Debian 계열
sudo apt update
sudo apt install -y ansible

3. SSH 키 설정 (가장 중요!)

제어 노드가 관리 노드에 비밀번호 없이 접속하려면 "열쇠"가 필요합니다.

제어 노드에서 열쇠(SSH Key)를 만들어 web1, web2에 복사해주세요.

# 1. 제어 노드에서 키 생성 (엔터만 계속 누르세요)
ssh-keygen

# 2. web1 서버에 내 공개키 복사 (web1의 비밀번호를 물어볼 겁니다)
ssh-copy-id [web1_서버_계정]@[web1_서버_IP]

# 3. web2 서버에 내 공개키 복사 (web2의 비밀번호를 물어볼 겁니다)
ssh-copy-id [web2_서버_계정]@[web2_서버_IP]

4. 인벤토리 (서버 목록) 작성

제어 노드에서 관리할 서버 목록 파일을 만듭니다.

앤서블은 기본적으로 /etc/ansible/hosts 파일을 읽어요. 이 파일을 수정해줍시다.

sudo vi /etc/ansible/hosts

파일을 열고 아래 내용을 추가해주세요. webservers 라는 그룹을 만들고, 그 안에 web1web2의 IP 주소를 적어주는 겁니다.

[webservers]
192.168.56.101  # web1의 IP 주소로 변경하세요
192.168.56.102  # web2의 IP 주소로 변경하세요

자, 이제 모든 준비가 끝났습니다! 본격적으로 앤서블을 사용해볼까요?


3교시: 첫 번째 임무! 애드훅 명령어로 서버와 대화하기

먼저 간단한 일회성 명령(Ad-hoc) 으로 서버들이 우리 말을 잘 듣는지 확인해봅시다.


실습: 모든 서버에 핑 테스트

제어 노드 터미널에서 아래 명령어를 입력해보세요.

ansible all -m ping
  • ansible: 앤서블 실행!
  • all: 인벤토리에 있는 모든 서버에게! (webservers 라고 그룹명을 써도 됩니다)
  • -m ping: ping 모듈을 사용해서! (ping은 연결 상태를 점검하는 모듈입니다)

결과 확인

성공했다면, 각 서버로부터 초록색 글씨로 응답이 올겁니다.

192.168.56.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.56.102 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

서바가 pong하고 대답을 돌려줬죠? SUCCESS 메시지는 제어 노드와 관리 노드 간의 통신이 완벽하게 이루어졌다는 뜻입니다.
image


4교시: 진짜 자동화! 플레이북 작성 및 실행

이제 우리의 최종 목표인 nginx 설치 자동화 를 위한 '작전 계획서(Playbook)'을 작성해 보겠습니다.


실습: nginx 설치 및 실행 플레이북 만들기

제어 노드에서 nginx_install.yml 이라는 파일을 만들어 아래 내용과 똑같이 작성해주세요.

띄어쓰기에 민감하니 복사-붙여넣기를 추천합니다!

---
- name: Install and run Nginx web server
  hosts: webservers
  become: yes
  tasks:
    - name: Install Nginx package
      ansible.builtin.yum:
        name: nginx
        state: present
    
    - name: Start and enable Nginx service
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: yes
  • hosts: webservers: 이 작전은 webservers 그룹에 해당하는 서버들을 대상으로 합니다.
  • become: yes: 작업을 실행할 때 sudo처럼 관리자 권한을 획득합니다. (패키지 설치에 필요)
  • tasks:: 실제 수행할 작업 목록입니다.
    • 첫 번째 Task: yum 모듈(CentOS 기준)을 사용해 nginx 패키지를 present(존재하는 상태, 즉 설치된 상태)로 만듭니다.
    • 두 번째 Task: service 모듈을 사용해 nginx 서비스를 started(시작된 상태)로 만들고, 부팅 시에도 자동 실행(enabled: yes)되도록 합니다.

를레이북 실행 및 결과 확인

이제 작전 계획서를 실행할 시간입니다!

ansible-playbook nginx_install.yml

명령을 내리면 앤서블이 플레이북에 적힌 순서대로 web1과 web2에 접속하여 Nginx를 설치하고 실행합니다. 실행 결과가 아래와 같이 나타날 겁니다.

PLAY [Install and run Nginx web server] **************************************

TASK [Gathering Facts] *******************************************************
ok: [192.168.56.101]
ok: [192.168.56.102]

TASK [Install Nginx package] *************************************************
changed: [192.168.56.101]
changed: [192.168.56.102]

TASK [Start and enable Nginx service] ****************************************
changed: [192.168.56.101]
changed: [192.168.56.102]

PLAY RECAP *******************************************************************
192.168.56.101             : ok=4    changed=2    unreachable=0    failed=0   
192.168.56.102             : ok=4    changed=2    unreachable=0    failed=0  

PLAY RECAP에서 changed=2failed=0이 보이나요?

두 서버에 2개의 변화가 성공적으로 적용되었고, 실패는 없었다는 의미입니다.


최종 테스트: 정말 설치되었을까?

웹 브라우저를 열고 관리 노드들의 IP 주소(http://192.168.56.101, http://192.168.56.102)로 접속해보세요!


마무리

1단계 임무 완수!

오늘은 앤서블의 가장 기본적인 개념을 배우고,

직접 서버 환경을 구성하여 연결 테스트와 간단한 프로그램 설치 자동화까지 진행해 보았습니다.


우리는 오늘!

  • 제어 노드, 관리 노드, 인벤토리, 플레이북의 개념을 이해했습니다.
  • SSH 키로 서버 간 자동 접속 환경을 구축했습니다.
  • ansible all -m ping 명령으로 서버 연결을 확인했습니다.
  • Nginx를 설치하는 간단한 플레이북을 작성하고 실행했습니다.

수동으로 했다면 각 서버에 두 번씩 접속해서 여러 개의 명령어를 쳐야 했을 작업을,

단 하나의 파일과 한 줄의 명령어로 끝냈습니다. 이것이 바로 앤서블의 힘입니다.

    Tag -

Loading script...