본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 29. · 3 Views
Ansible 소개 및 설치 완벽 가이드
서버 수십 대를 손쉽게 관리하는 자동화 도구 Ansible의 기초부터 설치, 첫 명령어 실행까지 배웁니다. 초급 개발자를 위한 실무 중심 입문 가이드입니다.
목차
1. Ansible이란 무엇인가
어느 날 최개발 씨는 회사에서 새로운 미션을 받았습니다. "개발 서버 10대에 모두 동일한 패키지를 설치해야 하는데, 어떻게 하면 좋을까요?" 하나씩 SSH로 접속해서 설치하려니 벌써부터 막막합니다.
Ansible은 서버 자동화 도구로, 여러 대의 서버를 한 번에 관리할 수 있게 해주는 솔루션입니다. 마치 리모컨 하나로 여러 대의 TV를 동시에 조작하는 것처럼, 하나의 명령어로 수십, 수백 대의 서버를 제어할 수 있습니다.
Red Hat이 개발한 오픈소스 도구로, 전 세계 수많은 기업에서 사용하고 있습니다.
다음 코드를 살펴봅시다.
# 가장 간단한 Ansible 명령어 예제
# 여러 서버의 디스크 용량을 한 번에 확인합니다
ansible all -m shell -a "df -h"
# 특정 서버 그룹에만 명령 실행
ansible webservers -m ping
# 결과 예시:
# server1 | SUCCESS => {
# "changed": false,
# "ping": "pong"
# }
최개발 씨는 입사 6개월 차 백엔드 개발자입니다. 그동안은 주로 코드 작성에만 집중했는데, 오늘은 처음으로 서버 관리 업무를 맡게 되었습니다.
팀장님이 말씀하셨습니다. "개발 서버 10대에 모두 nginx를 설치하고 설정 파일을 배포해야 해요." 최개발 씨는 당황했습니다.
SSH로 하나씩 접속해서 작업하면 10번을 반복해야 합니다. 실수라도 하면 서버마다 설정이 달라질 수도 있습니다.
이때 옆자리 정시니어 씨가 조언을 해주었습니다. "Ansible을 사용해보세요.
훨씬 쉽고 빠르답니다." Ansible이란 정확히 무엇일까요? 쉽게 비유하자면, Ansible은 마치 오케스트라의 지휘자와 같습니다. 지휘자가 손짓 하나로 수십 명의 연주자를 조율하듯이, Ansible은 명령 하나로 수많은 서버를 동시에 제어합니다.
각 악기 연주자가 악보를 보고 연주하듯, 각 서버는 Ansible의 지시를 받아 작업을 수행합니다. 왜 Ansible이 필요할까요? 과거 서버 관리자들은 모든 작업을 수작업으로 처리했습니다.
서버가 5대라면 그나마 괜찮았지만, 50대, 100대가 되면 이야기가 달라집니다. 하나씩 SSH로 접속해서 명령어를 입력하다 보면 하루가 다 갑니다.
더 큰 문제는 실수입니다. 어떤 서버에는 패키지를 설치했는지, 어떤 서버는 빠뜨렸는지 헷갈리기 시작합니다.
또 다른 문제는 일관성입니다. 사람이 수작업으로 하다 보면 서버마다 미묘하게 설정이 달라질 수 있습니다.
A 서버는 nginx 버전이 1.18인데, B 서버는 1.20일 수도 있습니다. 이런 불일치는 나중에 예상치 못한 버그를 만들어냅니다.
Ansible의 등장 배경 바로 이런 문제를 해결하기 위해 2012년 Michael DeHaan이 Ansible을 만들었습니다. 이후 2015년 Red Hat이 인수하면서 더욱 발전했고, 현재는 서버 자동화의 사실상 표준으로 자리잡았습니다.
Ansible의 핵심 철학은 단순함입니다. 복잡한 설정 없이, 에이전트 설치 없이, SSH만 있으면 바로 사용할 수 있습니다.
이것이 Ansible이 다른 도구들을 제치고 인기를 얻은 비결입니다. Ansible의 동작 원리 Ansible은 푸시 방식으로 동작합니다.
중앙의 제어 노드에서 명령을 보내면, 관리 대상 서버들이 그 명령을 받아서 실행합니다. 이때 SSH를 통해 통신하기 때문에 별도의 에이전트를 설치할 필요가 없습니다.
명령은 YAML 형식으로 작성합니다. YAML은 사람이 읽기 쉬운 데이터 형식으로, 마치 일반 문서를 작성하듯 자연스럽게 작성할 수 있습니다.
복잡한 프로그래밍 언어를 배울 필요가 없습니다. 실무에서의 활용 사례 최개발 씨의 회사처럼 개발 서버 여러 대를 관리하는 경우, Ansible을 사용하면 단 몇 초 만에 모든 서버에 동일한 작업을 수행할 수 있습니다.
패키지 설치, 설정 파일 배포, 서비스 재시작 등 반복적인 작업을 자동화할 수 있습니다. 대규모 서비스를 운영하는 기업에서는 수백, 수천 대의 서버를 Ansible로 관리합니다.
Netflix, NASA, 삼성전자 등 글로벌 기업들이 Ansible을 활용하고 있습니다. 누가 Ansible을 사용하나요? 주로 DevOps 엔지니어, 시스템 관리자, 백엔드 개발자들이 사용합니다.
하지만 최근에는 프론트엔드 개발자들도 배포 자동화를 위해 Ansible을 배우는 추세입니다. 클라우드 시대에 서버 자동화는 개발자의 필수 역량이 되어가고 있습니다.
정리하며 최개발 씨는 정시니어 씨의 설명을 듣고 눈이 반짝였습니다. "이렇게 편한 도구가 있었다니!" Ansible을 사용하면 10대의 서버든 100대의 서버든 동일한 시간과 노력으로 관리할 수 있습니다.
한 번 배워두면 평생 유용하게 쓸 수 있는 도구입니다.
실전 팁
💡 - Ansible은 Python으로 작성되었지만, 사용할 때는 Python을 몰라도 됩니다
- SSH 접속만 가능하면 어떤 Linux 서버든 관리할 수 있습니다
- 클라우드(AWS, Azure, GCP)와도 완벽하게 연동됩니다
2. Ansible의 특징과 장점
정시니어 씨가 Ansible의 매력을 설명하기 시작했습니다. "다른 자동화 도구들도 많은데, 왜 굳이 Ansible을 써야 하냐고요?" 최개발 씨는 호기심 가득한 눈으로 정시니어 씨를 바라봤습니다.
Ansible의 가장 큰 특징은 에이전트리스(Agentless) 방식입니다. 관리 대상 서버에 별도의 프로그램을 설치할 필요 없이 SSH만으로 작동합니다.
또한 **멱등성(Idempotence)**을 보장하여 같은 명령을 여러 번 실행해도 결과가 동일합니다. 선언적 문법을 사용해 "어떻게"가 아닌 "무엇을" 할지만 정의하면 됩니다.
다음 코드를 살펴봅시다.
# Ansible Playbook 예제 - nginx 설치 및 시작
# 이 코드는 몇 번을 실행해도 결과가 같습니다 (멱등성)
---
- name: nginx 설치 및 설정
hosts: webservers
become: yes
tasks:
- name: nginx 패키지 설치
apt:
name: nginx
state: present
- name: nginx 서비스 시작
service:
name: nginx
state: started
enabled: yes
최개발 씨는 궁금했습니다. "자동화 도구라면 다 비슷한 거 아닌가요?" 정시니어 씨가 고개를 저었습니다.
"아니에요. Ansible은 다른 도구들과 확실히 다릅니다." 첫 번째 특징: 에이전트가 필요 없습니다 대부분의 자동화 도구는 관리 대상 서버에 에이전트 프로그램을 설치해야 합니다.
마치 스마트홈 기기를 제어하려면 각 기기에 앱을 설치해야 하는 것처럼요. 하지만 Ansible은 다릅니다.
Ansible은 SSH만 사용합니다. SSH는 리눅스 서버라면 기본적으로 설치되어 있습니다.
추가 프로그램을 설치할 필요가 없다는 것은 엄청난 장점입니다. 서버에 무언가를 설치한다는 것은 그만큼 관리 포인트가 늘어나고, 보안 위험도 증가한다는 의미이기 때문입니다.
두 번째 특징: 멱등성을 보장합니다 멱등성이란 수학 용어로, 같은 연산을 여러 번 수행해도 결과가 동일하다는 의미입니다. 쉽게 말해, Ansible 명령을 한 번 실행하든 열 번 실행하든 서버 상태는 동일합니다.
예를 들어 "nginx를 설치하라"는 명령을 생각해봅시다. 첫 번째 실행에서는 nginx가 설치됩니다.
두 번째 실행에서는 어떻게 될까요? Ansible은 "이미 설치되어 있네?
그럼 아무것도 하지 않겠어"라고 판단합니다. 불필요한 작업을 하지 않습니다.
이것이 왜 중요할까요? 실수로 스크립트를 두 번 실행했다고 상상해보세요.
멱등성이 없다면 설정이 꼬이거나 오류가 발생할 수 있습니다. 하지만 Ansible은 걱정할 필요가 없습니다.
안전하게 반복 실행할 수 있습니다. 세 번째 특징: 선언적 문법을 사용합니다 선언적(Declarative) 방식은 "어떻게"가 아니라 "무엇을" 할지만 정의합니다.
마치 레스토랑에서 "스테이크를 미디엄으로 구워주세요"라고 주문하는 것과 같습니다. 요리사가 어떤 순서로 어떻게 요리할지는 신경 쓸 필요가 없습니다.
반대로 절차적(Imperative) 방식은 "먼저 이것을 하고, 다음에 저것을 하고"처럼 모든 단계를 지시해야 합니다. Shell 스크립트가 대표적인 절차적 방식입니다.
위의 코드를 보세요. "nginx를 설치하고, 서비스를 시작하라"는 결과만 명시했습니다.
apt 명령어를 어떻게 실행할지, 에러 처리를 어떻게 할지는 Ansible이 알아서 처리합니다. 네 번째 특징: YAML로 작성합니다 YAML은 사람이 읽기 쉬운 데이터 형식입니다.
들여쓰기로 구조를 표현하기 때문에 마치 문서를 읽는 것처럼 자연스럽습니다. 복잡한 프로그래밍 문법을 몰라도 됩니다.
JSON이나 XML에 비해 훨씬 간결하고 직관적입니다. 초보자도 예제 코드를 보면 대충 무슨 뜻인지 이해할 수 있습니다.
다섯 번째 특징: 강력한 모듈 시스템 Ansible은 수천 개의 모듈을 제공합니다. 모듈은 특정 작업을 수행하는 재사용 가능한 단위입니다.
패키지 설치, 파일 복사, 사용자 생성, 데이터베이스 관리 등 거의 모든 작업을 위한 모듈이 있습니다. 위 코드의 apt 모듈은 Debian/Ubuntu 계열의 패키지 관리를 담당합니다.
service 모듈은 시스템 서비스를 제어합니다. 각 모듈은 이미 충분히 테스트되었고, 멱등성도 보장됩니다.
실무 활용 사례 큰 규모의 서비스를 운영하는 회사에서는 하루에도 수십 번씩 서버 설정을 변경해야 합니다. Ansible 없이 수작업으로 한다면 상상만 해도 끔찍합니다.
하지만 Ansible을 사용하면 코드 몇 줄로 모든 서버를 동시에 업데이트할 수 있습니다. 또한 Ansible 코드는 Git으로 버전 관리가 가능합니다.
누가 언제 어떤 설정을 변경했는지 모두 추적할 수 있습니다. 문제가 생기면 이전 버전으로 되돌리기도 쉽습니다.
주의사항 Ansible은 강력하지만, SSH 연결이 필수입니다. 네트워크가 불안정하거나 방화벽에 막혀 있으면 사용할 수 없습니다.
또한 Windows 서버 관리는 WinRM을 사용해야 하므로 Linux보다 설정이 복잡합니다. 정리하며 최개발 씨는 감탄했습니다.
"에이전트 설치도 필요 없고, 실수해도 안전하고, 배우기도 쉽다니!" Ansible의 철학은 단순함과 안정성입니다. 복잡한 것을 싫어하는 개발자들에게 딱 맞는 도구입니다.
실전 팁
💡 - 멱등성 덕분에 Ansible 명령은 안전하게 반복 실행할 수 있습니다
- YAML 문법은 띄어쓰기가 중요하므로 들여쓰기에 주의하세요
- 공식 문서에서 제공하는 모듈 목록을 참고하면 대부분의 작업을 쉽게 해결할 수 있습니다
3. 다른 자동화 도구와의 비교
최개발 씨가 질문했습니다. "Ansible 말고도 Chef, Puppet 같은 도구들도 들어봤는데, 뭐가 다른가요?" 정시니어 씨는 노트북을 열어 비교표를 보여주기 시작했습니다.
서버 자동화 도구는 크게 Ansible, Chef, Puppet, Salt 등이 있습니다. Chef와 Puppet은 에이전트 기반의 풀(Pull) 방식이며 Ruby로 작성되었습니다.
Ansible은 에이전트리스 푸시(Push) 방식으로 Python 기반입니다. Salt는 Ansible과 유사하지만 더 복잡한 설정이 필요합니다.
초보자에게는 Ansible이 가장 쉽고 빠르게 배울 수 있습니다.
다음 코드를 살펴봅시다.
# Ansible 방식 - 에이전트 없이 SSH로 바로 실행
ansible webservers -m apt -a "name=nginx state=present"
# Chef 방식이라면 - 각 서버에 Chef Client 설치 필요
# Ruby DSL로 작성
# package 'nginx' do
# action :install
# end
# Puppet 방식이라면 - 각 서버에 Puppet Agent 설치 필요
# package { 'nginx':
# ensure => 'installed',
# }
최개발 씨는 혼란스러웠습니다. 서버 자동화 도구가 이렇게 많다니, 어떤 걸 선택해야 할까요?
정시니어 씨가 친절하게 설명해주었습니다. 자동화 도구의 두 가지 방식 서버 자동화 도구는 크게 두 가지 방식으로 나뉩니다.
푸시(Push) 방식과 풀(Pull) 방식입니다. 푸시 방식은 중앙 서버에서 관리 대상 서버로 명령을 보내는 방식입니다.
마치 선생님이 학생들에게 과제를 직접 나눠주는 것과 같습니다. Ansible이 대표적인 푸시 방식입니다.
풀 방식은 관리 대상 서버가 주기적으로 중앙 서버에 접속해서 "할 일이 있나요?"라고 확인하는 방식입니다. 학생들이 게시판을 확인해서 과제를 가져가는 것과 비슷합니다.
Chef와 Puppet이 풀 방식을 사용합니다. Chef와의 비교 Chef는 2009년에 등장한 오래된 도구입니다.
Ruby 언어로 작성되었고, **DSL(Domain Specific Language)**이라는 특별한 문법을 사용합니다. 강력하지만 배우기 어렵습니다.
Chef를 사용하려면 관리 대상 서버마다 Chef Client를 설치해야 합니다. 또한 중앙의 Chef Server도 구축해야 합니다.
초기 설정이 복잡하고 시간이 많이 걸립니다. 반면 Ansible은 즉시 시작할 수 있습니다.
SSH만 있으면 됩니다. 학습 곡선도 훨씬 완만합니다.
대기업에서는 Chef를 많이 사용하지만, 스타트업이나 중소기업에서는 Ansible을 선호합니다. Puppet과의 비교 Puppet도 Chef처럼 오래된 도구입니다.
2005년에 처음 등장했으니 거의 20년 된 프로젝트입니다. Ruby로 작성되었고, 자체적인 선언적 언어를 사용합니다.
Puppet 역시 각 서버에 Puppet Agent를 설치해야 합니다. Puppet Master라는 중앙 서버도 필요합니다.
구조가 복잡하고 무겁습니다. Puppet의 장점은 매우 성숙한 생태계와 엔터프라이즈 지원입니다.
대규모 인프라를 운영하는 금융권이나 통신사에서 많이 사용합니다. 하지만 초보자가 배우기에는 진입장벽이 높습니다.
Salt와의 비교 Salt(SaltStack)는 Ansible과 가장 유사한 도구입니다. Python으로 작성되었고, 푸시와 풀 방식을 모두 지원합니다.
성능도 매우 뛰어납니다. 하지만 Salt는 기본적으로 에이전트 방식을 사용합니다.
각 서버에 Salt Minion을 설치해야 합니다. Ansible보다 초기 설정이 복잡합니다.
Salt의 장점은 속도입니다. 대규모 인프라에서 수천 대의 서버를 관리할 때 Ansible보다 빠릅니다.
하지만 서버 대수가 수백 대 이하라면 체감 차이가 크지 않습니다. Terraform과의 혼동 주의 가끔 Terraform과 Ansible을 혼동하는 경우가 있습니다.
하지만 두 도구는 목적이 다릅니다. Terraform은 인프라 프로비저닝 도구입니다.
서버를 생성하고, 네트워크를 구성하고, 클라우드 리소스를 관리합니다. "서버를 만드는" 도구입니다.
Ansible은 설정 관리 도구입니다. 이미 존재하는 서버에 소프트웨어를 설치하고, 설정 파일을 배포하고, 서비스를 관리합니다.
"서버를 설정하는" 도구입니다. 실무에서는 두 도구를 함께 사용합니다.
Terraform으로 AWS에 EC2 인스턴스를 생성하고, Ansible로 그 인스턴스에 애플리케이션을 배포하는 식입니다. 왜 Ansible을 선택할까요? 그렇다면 수많은 도구 중 왜 Ansible을 선택할까요?
첫째, 배우기 쉽습니다. YAML만 알면 바로 시작할 수 있습니다.
둘째, 설치가 간단합니다. 에이전트가 필요 없으니 즉시 사용 가능합니다.
셋째, 커뮤니티가 활발합니다. 문제가 생기면 구글 검색만으로 해결책을 찾을 수 있습니다.
실무 선택 기준 정시니어 씨가 조언했습니다. "회사 규모와 팀 상황에 따라 선택하세요." 초기 스타트업이라면 Ansible이 최선입니다.
빠르게 시작할 수 있고, 적은 인원으로도 관리 가능합니다. 이미 대규모 인프라를 운영 중이고 DevOps 팀이 따로 있다면 Chef나 Puppet도 좋은 선택입니다.
초기 투자는 크지만, 장기적으로는 더 안정적일 수 있습니다. 정리하며 최개발 씨는 이제 확신이 생겼습니다.
"우리 회사 규모라면 Ansible이 딱이네요!" 도구 선택에 정답은 없지만, 대부분의 경우 Ansible이 가장 무난한 선택입니다. 배우기 쉽고, 사용하기 편하고, 커뮤니티도 활발하니까요.
실전 팁
💡 - 소규모 인프라라면 Ansible, 대규모 엔터프라이즈라면 Chef/Puppet도 고려하세요
- Terraform과 Ansible은 목적이 다르므로 함께 사용하는 것이 일반적입니다
- 도구는 수단일 뿐, 자동화의 원칙과 철학을 이해하는 것이 더 중요합니다
4. Ansible 설치하기
이제 본격적으로 Ansible을 설치할 시간입니다. 최개발 씨는 자신의 노트북을 열었습니다.
"어떻게 시작하면 될까요?" 정시니어 씨가 터미널을 열며 말했습니다. "생각보다 훨씬 간단해요."
Ansible은 제어 노드에만 설치하면 됩니다. 관리 대상 서버에는 아무것도 설치할 필요가 없습니다.
Python이 설치되어 있다면 pip로 간단히 설치할 수 있고, Ubuntu/Debian에서는 apt로, CentOS/RHEL에서는 yum으로 설치 가능합니다. 설치 후 버전 확인으로 정상 작동을 테스트할 수 있습니다.
다음 코드를 살펴봅시다.
# Ubuntu/Debian 계열에서 Ansible 설치
sudo apt update
sudo apt install -y ansible
# 또는 pip로 최신 버전 설치
pip install ansible
# 설치 확인
ansible --version
# 결과 예시:
# ansible [core 2.16.0]
# config file = None
# configured module search path = ['/home/user/.ansible/plugins/modules']
# python version = 3.11.6
최개발 씨는 설치부터 막힐까봐 걱정했습니다. "복잡하지 않을까요?" 하지만 정시니어 씨의 말대로 생각보다 훨씬 간단했습니다.
제어 노드와 관리 노드 먼저 용어를 정리해봅시다. **제어 노드(Control Node)**는 Ansible을 실행하는 컴퓨터입니다.
보통 개발자의 노트북이나 별도의 관리 서버가 됩니다. **관리 노드(Managed Node)**는 Ansible로 관리할 대상 서버들입니다.
중요한 점은 Ansible을 제어 노드에만 설치하면 된다는 것입니다. 관리 노드에는 아무것도 설치하지 않습니다.
SSH와 Python만 있으면 충분합니다. 요즘 Linux 서버라면 둘 다 기본으로 설치되어 있습니다.
제어 노드의 요구사항 제어 노드는 Linux나 macOS여야 합니다. 안타깝게도 Windows는 제어 노드로 사용할 수 없습니다.
Windows를 사용한다면 WSL(Windows Subsystem for Linux)을 설치하거나, 가상머신을 사용해야 합니다. Python 3.8 이상이 필요합니다.
요즘 대부분의 Linux 배포판은 Python 3가 기본으로 설치되어 있으므로 걱정할 필요 없습니다. Ubuntu/Debian에서 설치하기 Ubuntu나 Debian을 사용한다면 apt 패키지 매니저로 설치하는 것이 가장 쉽습니다.
위의 코드처럼 간단한 명령어 두 줄이면 끝입니다. 먼저 apt update로 패키지 목록을 업데이트합니다.
이것은 "최신 소프트웨어 카탈로그를 다운로드하는" 과정입니다. 그 다음 apt install ansible로 Ansible을 설치합니다.
설치가 완료되면 ansible 명령어를 사용할 수 있습니다. 몇 초면 끝나는 간단한 작업입니다.
CentOS/RHEL에서 설치하기 CentOS나 Red Hat Enterprise Linux를 사용한다면 yum이나 dnf를 사용합니다. 먼저 EPEL(Extra Packages for Enterprise Linux) 저장소를 활성화해야 합니다.
sudo yum install -y epel-release sudo yum install -y ansible RHEL 8 이상이나 CentOS 8 이상에서는 yum 대신 dnf를 사용합니다. 명령어는 동일하고 yum만 dnf로 바꾸면 됩니다.
pip로 최신 버전 설치하기 pip는 Python 패키지 매니저입니다. pip로 설치하면 항상 최신 버전을 사용할 수 있다는 장점이 있습니다.
apt나 yum의 패키지는 약간 오래된 버전일 수 있습니다. pip install ansible 명령어 하나면 됩니다.
시스템 전체에 설치하려면 앞에 sudo를 붙이면 되고, 사용자 디렉토리에만 설치하려면 --user 옵션을 추가하면 됩니다. 가상환경(venv)을 사용하는 것도 좋은 방법입니다.
프로젝트마다 독립적인 Ansible 환경을 구성할 수 있습니다. python -m venv ansible-env source ansible-env/bin/activate pip install ansible 설치 확인하기 설치가 제대로 되었는지 확인해봅시다.
ansible --version 명령어를 실행하면 설치된 Ansible의 버전 정보가 출력됩니다. 버전 번호와 함께 Python 버전, 설정 파일 경로 등이 표시됩니다.
이 정보들은 나중에 문제 해결할 때 유용합니다. 버전이 정상적으로 출력되면 설치 성공입니다.
macOS에서 설치하기 맥을 사용한다면 Homebrew로 설치하는 것이 가장 편합니다. brew install ansible Homebrew가 없다면 먼저 Homebrew를 설치하세요.
맥 개발자라면 Homebrew는 필수 도구입니다. Docker로 시험해보기 설치가 부담스럽다면 Docker를 사용해볼 수도 있습니다.
Ansible 공식 Docker 이미지를 사용하면 시스템에 직접 설치하지 않고도 Ansible을 사용할 수 있습니다. docker run --rm -it ansible/ansible:latest /bin/bash 이 방법은 일시적인 테스트용으로 좋지만, 실무에서는 직접 설치하는 것을 권장합니다.
주의사항 Ansible 버전은 계속 업데이트됩니다. 팀에서 사용한다면 모든 팀원이 같은 버전을 사용하는 것이 좋습니다.
버전이 다르면 미묘한 동작 차이가 발생할 수 있습니다. 또한 Ansible은 하위 호환성을 잘 지키지만, 메이저 버전이 바뀔 때는 주의가 필요합니다.
공식 문서의 변경사항을 확인하세요. 정리하며 최개발 씨는 터미널에서 설치 명령어를 입력했습니다.
단 몇 초 만에 설치가 완료되었습니다. "이렇게 쉽다니!" Ansible 설치는 정말 간단합니다.
복잡한 설정도, 어려운 의존성도 없습니다. 바로 다음 단계로 넘어갈 수 있습니다.
실전 팁
💡 - pip로 설치하면 최신 버전을 사용할 수 있습니다
- 가상환경(venv)을 사용하면 프로젝트별로 독립적인 환경을 유지할 수 있습니다
- macOS 사용자는 Homebrew로 설치하는 것이 가장 편합니다
5. 제어 노드와 관리 노드 개념
설치를 마친 최개발 씨에게 정시니어 씨가 설명했습니다. "Ansible을 제대로 이해하려면 제어 노드와 관리 노드의 관계를 알아야 해요." 화이트보드에 간단한 다이어그램을 그리기 시작했습니다.
**제어 노드(Control Node)**는 Ansible이 설치되어 명령을 실행하는 컴퓨터입니다. **관리 노드(Managed Node)**는 Ansible로 관리할 대상 서버들입니다.
제어 노드는 SSH를 통해 관리 노드에 접속하고, Python 스크립트를 전송해 실행한 후 결과를 받아옵니다. 인벤토리(Inventory) 파일에 관리 노드 목록을 정의합니다.
다음 코드를 살펴봅시다.
# /etc/ansible/hosts 또는 inventory.ini 파일
# 관리 노드 목록을 정의합니다
[webservers]
web1.example.com
web2.example.com
192.168.1.10
[databases]
db1.example.com
db2.example.com
[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa
최개발 씨는 헷갈렸습니다. "제어 노드?
관리 노드? 무슨 차이인가요?" 정시니어 씨가 친절하게 설명하기 시작했습니다.
제어 노드란 무엇인가 제어 노드는 Ansible이 설치되어 있고, 사용자가 직접 명령을 실행하는 컴퓨터입니다. 마치 리모컨과 같습니다.
여러분이 TV 리모컨을 들고 있듯이, 제어 노드는 서버들을 제어하는 리모컨입니다. 보통은 개발자의 로컬 컴퓨터(노트북, 데스크톱)가 제어 노드가 됩니다.
또는 회사에서 별도로 운영하는 관리 서버가 제어 노드 역할을 할 수도 있습니다. Jenkins나 GitLab CI/CD 서버가 제어 노드가 되기도 합니다.
제어 노드는 반드시 Linux나 macOS여야 합니다. Windows는 제어 노드가 될 수 없습니다.
하지만 Windows에서도 WSL을 사용하면 문제없습니다. 관리 노드란 무엇인가 관리 노드는 Ansible로 관리할 대상 서버들입니다.
웹 서버, 데이터베이스 서버, 애플리케이션 서버 등 여러분이 운영하는 모든 서버가 관리 노드가 될 수 있습니다. 관리 노드에는 Ansible을 설치할 필요가 없습니다.
SSH 접속만 가능하면 됩니다. Python 2.6 이상 또는 Python 3.5 이상이 설치되어 있어야 하지만, 요즘 서버라면 기본으로 설치되어 있습니다.
관리 노드는 Linux가 대부분이지만, Windows 서버도 관리 노드가 될 수 있습니다. 다만 Windows의 경우 SSH 대신 WinRM을 사용하므로 설정이 조금 다릅니다.
둘 사이의 통신 방식 제어 노드와 관리 노드는 어떻게 통신할까요? SSH를 사용합니다.
제어 노드에서 관리 노드로 SSH 접속을 하고, 필요한 작업을 수행합니다. 재미있는 점은 Ansible이 실행되는 방식입니다.
Ansible은 Python 스크립트를 관리 노드에 임시로 복사한 다음, 그 스크립트를 실행하고, 결과를 받아온 후, 스크립트를 삭제합니다. 이 모든 과정이 자동으로 일어나므로 사용자는 신경 쓸 필요가 없습니다.
인벤토리 파일 그렇다면 Ansible은 어떤 서버들을 관리해야 하는지 어떻게 알까요? 인벤토리(Inventory) 파일에 정의합니다.
위의 코드를 보세요. 인벤토리 파일은 INI 형식으로 작성합니다.
대괄호로 그룹을 정의하고, 그 아래에 서버 목록을 나열합니다. [webservers] 그룹에는 웹 서버 3대가 정의되어 있습니다.
도메인 이름으로 지정할 수도 있고, IP 주소로 지정할 수도 있습니다. [databases] 그룹에는 데이터베이스 서버 2대가 정의되어 있습니다.
이렇게 그룹으로 나누면 "webservers 그룹에만 nginx를 설치하라"처럼 그룹 단위로 명령을 내릴 수 있습니다. 변수 설정 [all:vars] 섹션은 모든 서버에 공통으로 적용되는 변수를 정의합니다.
ansible_user는 SSH 접속할 때 사용할 사용자 이름입니다. ansible_ssh_private_key_file은 SSH 키 파일의 경로입니다.
이런 변수들을 설정해두면 매번 명령어 실행할 때마다 옵션을 지정하지 않아도 됩니다. 편리하고 실수도 줄어듭니다.
인벤토리 파일의 위치 기본적으로 Ansible은 /etc/ansible/hosts 파일을 인벤토리로 사용합니다. 하지만 프로젝트마다 별도의 인벤토리 파일을 만드는 것이 일반적입니다.
프로젝트 디렉토리에 inventory.ini 또는 hosts 파일을 만들고, -i 옵션으로 지정하면 됩니다. ansible -i inventory.ini webservers -m ping 동적 인벤토리 정적 파일 대신 스크립트로 인벤토리를 생성할 수도 있습니다.
이것을 **동적 인벤토리(Dynamic Inventory)**라고 합니다. 예를 들어 AWS를 사용한다면, 현재 실행 중인 EC2 인스턴스 목록을 자동으로 가져와서 인벤토리로 사용할 수 있습니다.
서버가 자주 추가되거나 삭제되는 클라우드 환경에서 매우 유용합니다. 실무 활용 팁 실무에서는 인벤토리 파일을 환경별로 나눕니다.
inventory/production.ini, inventory/staging.ini, inventory/development.ini처럼 말이죠. 이렇게 하면 실수로 운영 서버에 테스트 명령을 실행하는 사고를 예방할 수 있습니다.
"지금 어느 환경에서 작업하는지" 명확히 알 수 있습니다. 주의사항 인벤토리 파일에는 서버 접속 정보가 담겨 있습니다.
Git에 커밋할 때 주의해야 합니다. 특히 비밀번호나 SSH 키 경로가 포함되어 있다면 절대로 공개 저장소에 올리면 안 됩니다.
Ansible Vault를 사용하면 민감한 정보를 암호화할 수 있습니다. 이것은 나중에 배우게 될 고급 기능입니다.
정리하며 최개발 씨는 이제 확실히 이해했습니다. "제어 노드는 리모컨, 관리 노드는 TV, 인벤토리는 채널 목록이군요!" 정시니어 씨가 웃으며 고개를 끄덕였습니다.
비유가 정확합니다.
실전 팁
💡 - 인벤토리 파일은 환경별로 분리하여 관리하세요
- 민감한 정보는 Ansible Vault로 암호화하세요
- 동적 인벤토리를 사용하면 클라우드 환경에서 편리합니다
6. 첫 번째 명령어 실행하기
"이제 진짜로 Ansible을 실행해볼까요?" 정시니어 씨가 말했습니다. 최개발 씨는 긴장한 표정으로 터미널을 바라봤습니다.
"혹시 실수로 서버를 망가뜨리진 않을까요?" "걱정 마세요. 먼저 안전한 명령부터 시작합니다."
ansible 명령어는 애드혹(Ad-hoc) 명령을 실행하는 가장 기본적인 방법입니다. ansible [그룹] -m [모듈] -a [인자] 형식으로 사용합니다.
ping 모듈은 관리 노드의 연결 상태를 확인하는 가장 안전한 테스트 명령입니다. shell 모듈로 일반 Linux 명령어를 실행할 수 있습니다.
다음 코드를 살펴봅시다.
# ping 모듈로 연결 테스트
ansible all -m ping
# 결과:
# web1.example.com | SUCCESS => {
# "changed": false,
# "ping": "pong"
# }
# shell 모듈로 디스크 용량 확인
ansible webservers -m shell -a "df -h"
# apt 모듈로 패키지 설치 (sudo 권한 필요)
ansible webservers -m apt -a "name=htop state=present" --become
최개발 씨는 드디어 첫 Ansible 명령을 실행할 준비가 되었습니다. 손에 땀이 납니다.
정시니어 씨가 차분히 설명하기 시작했습니다. 애드혹 명령이란 Ansible에는 두 가지 실행 방식이 있습니다.
애드혹(Ad-hoc) 명령과 **플레이북(Playbook)**입니다. 애드혹 명령은 일회성 작업을 위한 것입니다.
"지금 당장 모든 서버의 디스크 용량을 확인하고 싶어"처럼 즉시 결과가 필요할 때 사용합니다. 명령어 한 줄로 즉시 실행됩니다.
플레이북은 반복 가능한 자동화 스크립트입니다. YAML 파일로 작성하며, 여러 단계의 작업을 순서대로 정의할 수 있습니다.
복잡한 배포나 설정 작업에 사용합니다. 플레이북은 다음 카드에서 배우게 될 것입니다.
첫 번째 명령: ping 가장 먼저 실행해볼 명령은 ping 모듈입니다. 이 모듈은 서버를 변경하지 않습니다.
단지 연결이 잘 되는지만 확인합니다. 가장 안전한 테스트 명령입니다.
ansible all -m ping 명령을 실행해봅시다. all은 인벤토리의 모든 서버를 의미합니다.
-m ping은 ping 모듈을 사용하겠다는 뜻입니다. 명령을 실행하면 각 서버에서 "pong"이라는 응답이 돌아옵니다.
네트워크의 ping-pong과 비슷한 개념입니다. SUCCESS가 출력되면 연결이 정상이라는 의미입니다.
실패했을 때 만약 UNREACHABLE이나 FAILED가 나온다면 어떻게 할까요? 당황하지 마세요.
몇 가지 확인해야 할 사항이 있습니다. 첫째, SSH 접속이 가능한지 확인하세요.
ssh user@server 명령으로 수동 접속을 시도해보세요. 비밀번호를 물어본다면 SSH 키 설정이 필요합니다.
둘째, 인벤토리 파일의 서버 주소가 정확한지 확인하세요. 오타가 있거나 서버가 꺼져 있을 수 있습니다.
셋째, 방화벽이 SSH 포트(22번)를 막고 있지 않은지 확인하세요. 클라우드 서버라면 보안 그룹 설정도 확인해야 합니다.
shell 모듈로 명령 실행하기 연결이 확인되었다면 이제 실제 명령을 실행해봅시다. shell 모듈을 사용하면 일반 Linux 명령어를 실행할 수 있습니다.
ansible webservers -m shell -a "df -h" 명령은 webservers 그룹의 모든 서버에서 디스크 용량을 확인합니다. -a 옵션 뒤에 실행할 명령어를 문자열로 전달합니다.
결과로 각 서버의 디스크 사용량이 출력됩니다. 한 번에 여러 서버의 상태를 확인할 수 있어 매우 편리합니다.
shell vs command 모듈 shell 모듈과 비슷한 것으로 command 모듈이 있습니다. 두 모듈의 차이는 무엇일까요?
command 모듈은 파이프나 리다이렉션 같은 셸 기능을 사용할 수 없습니다. 단순히 명령어만 실행합니다.
더 안전하지만 제한적입니다. shell 모듈은 완전한 셸 환경에서 실행됩니다.
파이프, 리다이렉션, 환경 변수 등을 사용할 수 있습니다. 유연하지만 보안에 주의해야 합니다.
일반적으로는 command를 사용하고, 셸 기능이 꼭 필요할 때만 shell을 사용하는 것이 좋습니다. sudo 권한으로 실행하기 패키지를 설치하거나 시스템 설정을 변경하려면 sudo 권한이 필요합니다.
Ansible에서는 --become 옵션을 사용합니다. ansible webservers -m apt -a "name=htop state=present" --become 명령은 htop 패키지를 설치합니다.
--become은 sudo로 실행하라는 의미입니다. apt 모듈은 Debian/Ubuntu 계열의 패키지 관리자입니다.
name=htop은 설치할 패키지 이름이고, state=present는 "설치되어 있어야 한다"는 의미입니다. 명령어 구조 이해하기 Ansible 애드혹 명령의 기본 구조는 다음과 같습니다.
ansible [대상] -m [모듈] -a [인자] [옵션] 대상은 인벤토리의 그룹 이름이나 all입니다. 모듈은 실행할 작업의 종류입니다.
인자는 모듈에 전달할 파라미터입니다. 옵션은 --become, -i 같은 추가 설정입니다.
실무에서의 활용 실무에서 애드혹 명령은 언제 사용할까요? 긴급한 확인이나 조치가 필요할 때입니다.
"운영 서버들의 메모리 사용량이 궁금해" → ansible production -m shell -a "free -h" "모든 웹 서버의 nginx를 재시작해야 해" → ansible webservers -m service -a "name=nginx state=restarted" --become "특정 파일이 모든 서버에 존재하는지 확인하고 싶어" → ansible all -m stat -a "path=/etc/app.conf" 이렇게 빠른 확인이나 간단한 조치에 애드혹 명령이 유용합니다. 출력 결과 읽기 Ansible의 출력은 JSON 형식입니다.
changed는 서버 상태가 변경되었는지를 나타냅니다. false라면 이미 원하는 상태였다는 의미입니다.
SUCCESS는 명령이 성공적으로 실행되었다는 뜻입니다. CHANGED는 서버 상태가 변경되었다는 뜻입니다.
FAILED는 오류가 발생했다는 뜻입니다. 주의사항 애드혹 명령은 편리하지만 기록이 남지 않습니다.
"누가 언제 무슨 명령을 실행했는지" 추적하기 어렵습니다. 중요한 작업은 플레이북으로 작성하고 Git으로 관리하는 것이 좋습니다.
또한 shell 모듈은 강력하지만 위험할 수 있습니다. 실수로 rm -rf /를 실행하면 서버가 망가집니다.
항상 주의해서 사용하세요. 정리하며 최개발 씨는 드디어 첫 Ansible 명령을 성공적으로 실행했습니다.
"pong" 응답을 보는 순간 뿌듯함이 밀려왔습니다. "생각보다 어렵지 않네요!" 정시니어 씨가 웃으며 말했습니다.
"이제 시작일 뿐이에요. 앞으로 배울 것이 많답니다." Ansible의 첫걸음을 뗀 여러분, 축하합니다.
이제 여러분도 수십 대의 서버를 손쉽게 관리할 수 있는 능력을 갖추게 되었습니다.
실전 팁
💡 - 처음에는 ping 모듈로 연결을 확인한 후 다른 작업을 진행하세요
- shell 모듈보다는 command 모듈이 더 안전합니다
- 중요한 작업은 애드혹 명령보다 플레이북으로 작성하세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Terraform 프로바이더와 리소스 완벽 가이드
Terraform의 핵심인 프로바이더와 리소스 개념을 실무 중심으로 설명합니다. AWS 프로바이더 설정부터 리소스 정의, 의존성 관리, 멀티 프로바이더 구성까지 초급 개발자도 쉽게 이해할 수 있도록 스토리텔링 방식으로 풀어냈습니다.
Ansible 인벤토리 관리 완벽 가이드
서버 수백 대를 관리하는 당신, 매번 IP 주소 외우고 계신가요? Ansible 인벤토리로 서버 관리를 체계화하는 방법을 알아봅니다. 정적 인벤토리부터 동적 인벤토리까지, 실무에서 바로 활용할 수 있는 베스트 프랙티스를 담았습니다.
HCL 문법과 기본 구조 완벽 가이드
Terraform의 핵심 언어인 HCL을 처음 배우는 초급 개발자를 위한 가이드입니다. 기본 문법부터 블록 구조, 데이터 타입, 주석, 포맷팅까지 실무에 필요한 모든 것을 다룹니다. 점프 투 자바 스타일로 쉽고 재미있게 배워보세요.
Ansible 아키텍처와 핵심 개념 완벽 가이드
서버 100대를 한 번에 관리할 수 있는 Ansible의 핵심 아키텍처를 초급 개발자 눈높이에 맞춰 설명합니다. Push 기반 아키텍처부터 멱등성, Playbook까지 실무에 바로 적용할 수 있는 내용을 담았습니다.
Terraform 소개 및 설치 완벽 가이드
인프라를 코드로 관리하는 IaC의 개념부터 Terraform의 특징, 설치 방법, 그리고 첫 번째 리소스 생성까지 초급 개발자를 위한 친절한 입문 가이드입니다. 실무에서 바로 활용할 수 있는 예제와 팁을 담았습니다.