소개
서버를 수동으로 설정하고 관리하는 작업은 특히 여러 서버가 있거나 반복적인 구성 작업이 있는 환경에서 지루하고 오류가 발생하기 쉬운 과정이 될 수 있습니다. 강력한 오픈소스 IT 자동화 도구인 Ansible을 사용하면 서버 프로비저닝, 구성, 관리를 쉽게 자동화하여 이 과정을 간소화할 수 있습니다. 이 가이드 “24. Ansible로 Ubuntu Server 설정 자동화: 실용 가이드” 에서는 Ansible을 사용하여 Ubuntu Server 설정 및 구성을 자동화하는 기본 사항을 안내합니다. 끝까지 읽으면 일반적인 서버 작업을 간소화하고 효율성을 높이며 인프라 전반의 일관성을 확보하기 위해 Ansible 플레이북을 작성하고 실행하는 방법을 배울 수 있습니다.
이전 글:
01. Ubuntu Server 소개 – SysOSX: AI & Cloud
02. 첫 Ubuntu Server 설정 방법: 초보자 가이드 – SysOSX: AI & Cloud
03. Ubuntu Server용 Linux 명령줄 마스터하기 – SysOSX: AI & Cloud
04. Ubuntu Server에서 사용자 및 권한 관리: 종합 가이드 – SysOSX: AI & Cloud
05. Ubuntu Server 네트워킹 기초: 종합 가이드 – SysOSX: AI & Cloud
06. Ubuntu Server에 소프트웨어 설치 및 관리: 완전 가이드 – SysOSX: AI & Cloud
07.Ubuntu Server 패치 및 업데이트: 종합 가이드 – SysOSX: AI & Cloud
08. Ubuntu Server 보안 강화: 하드닝 및 보호를 위한 실용적인 단계 – SysOSX: AI & Cloud
10. Ubuntu Server용 시스템 모니터링 도구: 종합 가이드 – SysOSX: AI & Cloud
11. Ubuntu 서버를 위한 중앙 집중식 로깅: 필독 가이드 – SysOSX: AI & Cloud
12. Ubuntu Server 감사 및 규정 준수: 모범 사례 – SysOSX: AI & Cloud
13. 호스팅 및 웹 애플리케이션을 위한 Ubuntu Server 설정: 완벽 가이드 – SysOSX: AI & Cloud
14. 단일 Ubuntu Server에서 여러 웹사이트 호스팅하기: 유용한 팁 – SysOSX: AI & Cloud
15. Ubuntu Server에서 스토리지 및 디스크 관리: 간단 가이드 – SysOSX: AI & Cloud
16. Ubuntu Server에서 파일 공유 서비스 설정: 완전 가이드 – SysOSX: AI & Cloud
17. Ubuntu에서 안전한 데이터베이스 서버 설정: MySQL 대 MariaDB – SysOSX: AI & Cloud
18. Ubuntu Server에서 LVM 구성 및 사용 방법: 종합 가이드 – SysOSX: AI & Cloud
19. KVM을 활용한 가상화 소개: Ubuntu Server 초보자 가이드 – SysOSX: AI & Cloud
20. Ubuntu Server에 Docker 설치 방법: 컨테이너화에 대한 단계별 가이드 – SysOSX: AI & Cloud
21. LXD 시작하기: 컨테이너 쉽게 설치 + 치트 시트 – SysOSX: AI & Cloud
22. Ubuntu Server에서 Podman 시작하기: 완전 가이드 – SysOSX: AI & Cloud
23. 클라우드에 Ubuntu Server 배포하기: 단계별 가이드 – SysOSX: AI & Cloud
목차
서버 자동화에 Ansible을 사용해야 하는 이유
Ansible은 단순성과 강력함 덕분에 서버 자동화에 널리 사용됩니다. 최고의 선택인 이유는 다음과 같습니다.
- 에이전트리스: Ansible은 대상 서버에 에이전트 소프트웨어를 설치할 필요가 없습니다. 통신에는 SSH를 사용합니다.
- 선언적 구문: Ansible 플레이북은 사람이 읽기 쉬운 구문인 YAML을 사용하므로 원하는 상태를 쉽게 정의할 수 있습니다.
- 재사용 가능한 구성: 플레이북을 한 번 작성하면 여러 서버에서 재사용할 수 있습니다.
- 멱등성: Ansible은 필요한 경우에만 작업을 실행하므로 불필요한 작업을 피할 수 있습니다.
- 확장성: Ansible은 패키지 설치, 파일 관리, 서비스 구성 등의 작업을 처리하기 위한 다양한 모듈을 지원합니다.
필수 조건
Ansible로 Ubuntu Server 설정을 자동화하기 전에 다음 사항을 준비하세요.
- 제어 노드: Ansible이 설치된 머신(로컬 시스템 또는 전용 서버).
- 대상 서버: 구성하려는 Ubuntu 서버(온프레미스 또는 클라우드).
- SSH 액세스: 제어 노드와 대상 서버 간에 비밀번호 없는 SSH 액세스가 설정되었는지 확인하세요.
1단계: Ansible 설치하기
1.1 제어 노드에 Ansible 설치하기
제어 노드(예: Ubuntu를 실행하는 로컬 머신)에 Ansible을 설치하세요.
sudo apt update
sudo apt install ansible -y
1.2 설치 확인하기
Ansible이 올바르게 설치되었는지 설치된 버전을 확인하세요.
ansible --version
예제 출력:
ansible 2.10.8
config file = None
configured module search path = ['/home/uadmin/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.10.12 (main, Feb 4 2025, 14:57:36) [GCC 11.4.0]
2단계: SSH 액세스 설정하기
Ansible은 SSH를 통해 대상 서버와 통신합니다. 제어 노드에서 대상 서버로 비밀번호 없는 SSH 액세스를 설정해야 합니다.
2.1 SSH 키 쌍 생성하기
SSH 키 쌍이 아직 없다면 생성하세요.
ssh-keygen -t rsa -b 2048
2.2 SSH 키를 대상 서버에 복사하기
다음 명령을 사용하여 공개 키를 대상 서버에 복사하세요.
ssh-copy-id ubuntu@<target-server-ip>
SSH 액세스를 테스트하여 비밀번호 없이 동작하는지 확인하세요.
ssh ubuntu@<target-server-ip>
3단계: 인벤토리 정의하기
Ansible은 관리할 대상 서버를 정의하기 위해 인벤토리 파일 을 사용합니다.
3.1 인벤토리 파일 만들기
작업 디렉터리에 파일을 만드세요. 파일 이름: inventory 입니다.
nano inventory
대상 서버의 IP 주소나 호스트 이름을 추가하세요. 예를 들면:
[ubuntu_servers]
192.168.50.42
192.168.50.145
파일을 저장하고 종료하세요(Ctrl+O한 다음 Ctrl+X).
3.2 연결 테스트하기
모듈을 사용하여 대상 서버 연결을 테스트하세요. 모듈: ping 입니다.
ansible -i inventory ubuntu_servers -m ping
예제 출력:
192.168.50.145 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
192.168.50.42 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
4단계: 첫 Ansible 플레이북 작성하기
Ansible 플레이북은 자동화하려는 작업을 정의하는 YAML 파일입니다. Ubuntu Server 설정을 자동화하는 플레이북을 만들어 보겠습니다.
4.1 플레이북 파일 만들기
파일을 만드세요. 파일 이름: setup.yml입니다.
nano setup.yml
4.2 플레이북 정의하기
플레이북에 다음 내용을 추가하세요.
---
- name: Configure Ubuntu Server
hosts: ubuntu_servers
become: true
tasks:
- name: Update and upgrade apt packages
apt:
update_cache: yes
upgrade: dist
- name: Install common packages
apt:
name:
- curl
- wget
- git
- build-essential
state: present
- name: Enable UFW and allow SSH
ufw:
rule: allow
name: OpenSSH
state: enabled
- name: Create a new user
user:
name: devuser
password: "{{ 'password123' | password_hash('sha512') }}"
state: present
groups: sudo
작업 설명
- 패키지 업데이트 및 업그레이드: 서버에 최신 업데이트와 보안 패치가 적용되었는지 확인합니다.
- 일반적인 패키지 설치하기: 필수 도구(
curl,wget,git)를 설치합니다. - UFW 활성화하기: SSH 액세스를 허용하도록 방화벽을 구성합니다.
- 새 사용자 만들기: sudo 권한을 가진 새 사용자를 추가합니다.
- 호스트 이름 설정하기: 서버의 호스트 이름을 구성합니다.
파일을 저장하고 종료하세요.
5단계: 플레이북 실행하기
플레이북을 실행하여 구성을 적용하세요.
ansible-playbook -i inventory setup.yml
Ansible은 각 작업의 진행 상황을 기록합니다. 모든 작업이 성공적으로 완료되면 Ubuntu Server 구성이 완료됩니다.
아래는 출력입니다.
uadmin@u2204-001:~$ sudo ansible-playbook -i inventory setup.yml
PLAY [Configure Ubuntu Server] ***************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.50.145]
ok: [192.168.50.42]
TASK [Update and upgrade apt packages] *******************************************************************************
^X^C [ERROR]: User interrupted execution
uadmin@u2204-001:~$ sudo nano setup.yml
uadmin@u2204-001:~$ sudo ansible-playbook -i inventory setup.yml
PLAY [Configure Ubuntu Server] ***************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.50.145]
ok: [192.168.50.42]
TASK [Update and upgrade apt packages] *******************************************************************************
ok: [192.168.50.42]
ok: [192.168.50.145]
TASK [Install common packages] ***************************************************************************************
changed: [192.168.50.145]
changed: [192.168.50.42]
TASK [Enable UFW and allow SSH] **************************************************************************************
changed: [192.168.50.145]
changed: [192.168.50.42]
TASK [Create a new user] *********************************************************************************************
changed: [192.168.50.42]
changed: [192.168.50.145]
PLAY RECAP ***********************************************************************************************************
192.168.50.145 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.50.42 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
6단계: 구성 확인하기
6.1 설치된 패키지 확인하기
대상 서버 중 하나에 로그인하고 일반적인 패키지가 설치되었는지 확인하세요.
curl --version
git --version
6.2 방화벽 상태 확인하기
방화벽이 활성화되었는지 확인하세요.
sudo ufw status
6.3 새 사용자 확인하기
새 사용자가 만들어졌는지 확인하세요.
cat /etc/passwd | grep devuser

고급 사용 사례
기본 플레이북에 익숙해지면 더 고급 사용 사례를 살펴볼 수 있습니다.
- 애플리케이션 배포하기: Ansible을 사용하여 웹 서버(예: Nginx, Apache)나 데이터베이스(예: MySQL, PostgreSQL)를 설치하고 구성하세요.
- 여러 환경 관리하기: 스테이징, 프로덕션, 개발 환경별로 별도의 인벤토리 파일을 만드세요.
- 역할 사용하기: 복잡한 설정을 위해 플레이북을 재사용 가능한 역할로 정리하세요.
- CI/CD 통합: CI/CD 파이프라인의 일부로 서버 설정을 자동화하세요.
참고 자료:
Ansible 설명서 — Ansible 커뮤니티 설명서
결론
Ansible은 서버 설정 및 구성을 자동화하는 강력한 도구입니다. 이 가이드에서는 다음을 다루었습니다.
- 제어 노드에 Ansible 설치하기.
- 대상 서버에 대한 SSH 액세스 설정하기.
- Ubuntu Server 설정을 자동화하기 위한 기본 플레이북 작성 및 실행.
Ansible을 활용하면 시간을 절약하고 오류를 줄이며 인프라 전반의 일관성을 확보할 수 있습니다. 서버 한 대를 관리하든 수백 대를 관리하든, Ansible은 현대적인 DevOps 워크플로에 필수적인 도구입니다.
2 thoughts on “24. Automating Ubuntu Server Setup with Ansible: A Practical Guide”