단일 Linux 서버를 정기적으로 관리할 때 apt update && apt upgrade -y 또는 dnf update 명령어로 시스템 패키지를 업데이트하는 것은 어려운 일이 아니다. 하지만 관리하는 서버가 VM, Bare Metal 등을 포함해 여러 대로 늘어나기 시작하면, 일일이 SSH로 접속하여 유지보수하는 것은 상당히 귀찮은 작업이 된다.
이런 번거로움을 해결하기 위해 Ansible 리눅스 업데이트 자동화를 도입하면, 코드로 인프라를 관리(IaC)하며 수많은 서버에 일괄적으로 간편하게 업데이트를 적용할 수 있다.
(현재 관리하는 Linux 서버가 20대 정도 되다 보니 혼자 감당하기가 조금 벅찬 상황이다. 가끔 업데이트를 놓치는 일도 생겨서, 이번 기회에 Ansible을 배워 실무에 적용해 보려고 한다.)
1) Asible을 사용하기 전 알아야 하는 개념 (Control node, Managed node 등)
Control node: Ansible 명령을 실행하는 곳
Managed node: Control node가 SSH로 접속해서 작업이 수행되는 대상 서버
inventory: 어떤 서버를 관리할지 적는 목록이다.
서버 IP, 접속 계정, 그룹(예: Debian 계열 / RHEL 계열)을 관리한다. Ansible 문서는 YAML/INI 둘 다 지원하지만, 변수 타입 혼동을 줄이기 위해 YAML 인벤토리를 권장한다.
become: 원격 서버에서 sudo로 root 권한 작업을 하는 기능이다. 패키지 업데이트는 거의 항상 root 권한이 필요하므로 필수다. Ansible에서는 become: true를 쓰고, sudo 암호가 필요하면 -K 옵션으로 묻도록 할 수 있다.
module: 가능하면 shell: apt update && apt upgrade -y 같은 방식보다, 공식 모듈인 ansible.builtin.apt 와 ansible.builtin.dnf 를 쓰는 게 좋다. 이 모듈들은 각각 Debian/Ubuntu, DNF 계열 패키지 관리를 위한 내장 모듈이다.
2) 실습환경 구성
실습환경을 구성하기 위해서는 VM을 사용하는 것이 좋다. VMware Workstation Pro, VirtualBox, Hyper-V 등 Hypervisor 종류 상관 없이 본인이 원하는 Hypervisor를 사용하면 된다.
Debian은 설치할 때 온라인 미러를 사용하기에 설치가 끝나면 모든 패키지가 최신 버전으로 설치되어 있다. 그렇게에 DVD 이미지를 사용하여 온라인 미러를 사용하지 않은 상태로 설치한 뒤, 설치가 끝나면 Debian 13 sources.list 내용을 구글 등에서 찾아서 적용하면 된다.
구성도
Control node:
• Rocky Linux 10.1 VM (IP 주소: 192.168.5.220, 사용자 계정: rocky)
Managed nodes:
• Ubuntu 24.04 VM (IP 주소: 192.168.5.221)
• Debian 13 VM (IP 주소: 192.168.5.222)
• AlmaLinux 10 VM (IP 주소: 192.168.5.223)
3) 각 VM에서 확인할 목록
대상 서버들에는 최소한 다음이 준비되어 있어야 한다.
• python3
• SSH 접속 가능
• Managed node 계정(ubuntu, debian, alma)이 sudo 또는 wheel 그룹에 속하여 root 권한 상승 가능 (Debian 계열: sudo 그룹, RHEL 계열: wheel 그룹)
# Ubuntu / Debian / AlmaLinux에 Python3가 설치되어 있는지 확인
python3 --version
4) Ubuntu 24.04 / Debian 13 / AlmaLinux 10에서 ansible 사용자 만들기
관리의 용이성을 위해 모든 VM에 동일한 사용자명 ansible 계정을 생성해야 한다. 비밀번호는 보안을 위해 각각 다르게 설정할 것을 권장한다.
# Debian 계열에서 ansible 사용자 만들기 (Ubuntu 24.04, Debian 13)
sudo apt update
sudo apt install sudo
sudo useradd -m -s /bin/bash ansible
sudo passwd ansible
sudo usermod -aG sudo ansible
# RHEL 계열에서 ansible 사용자 만들기 (AlmaLinux 10)
sudo useradd -m -s /bin/bash ansible
sudo passwd ansible
sudo usermod -aG wheel ansible
5) ansible 계정에서 비밀번호 없이 sudo 명령어를 사용하기
Ansible로 일괄로 Linux를 업데이트하면 sudo 사용을 위한 비밀번호를 한 번만 받는다. 그래서 Ubuntu 24.04, Deban 13, AlmaLinux 10의 Ansible 사용자의 비밀번호가 각각 다르면 에러가 발생한다.
그렇기에 ansible 계정에 한해 NOPASSWD: ALL을 설정하여 sudo 명령어를 비밀번호 없이 사용 가능하게 하는 것이 좋다.
(실제 Production 서버에 NOPASSWD: ALL만 사용하면 보안 감사 때 문제가 될 수 있다. 그렇기에 SSH 비밀번호 로그인 차단, SSH Key 로그인만 허용, Control node IP로만 접속 허용 정책을 수립해야 한다.)
# RHEL, Debian 계열 사용 가능
echo 'ansible ALL=(ALL) NOPASSWD: ALL' | sudo tee /etc/sudoers.d/90-ansible
sudo chmod 440 /etc/sudoers.d/90-ansible
sudo visudo -cf /etc/sudoers
6) Rocky Linux 10 (Control node)에서 SSH 키 만들기 & 배포 (배포판 저장소)
# Control node에서 명령어 실행
ssh-keygen -t ed25519 -C "ansible-control"
# 각 대상 서버에 키 배포
ssh-copy-id ansible@192.168.5.221
ssh-copy-id ansible@192.168.5.222
ssh-copy-id ansible@192.168.5.223
# Control node가 Managed node에 정상적으로 접속되는지 검증
ssh ansible@192.168.5.221
ssh ansible@192.168.5.222
ssh ansible@192.168.5.223
7) Ansible 설치 방법 (EPEL 저장소, pip 기반 설치)
Ansible을 설치할 때 EPEL 저장소를 사용하여 설치하는 방법과 파이썬 pip 기반으로 설치하는 방법이 있다.
더 최신 버전이 필요하거나 격리된 환경이 필요하면 pip로 Ansible을 설치하는 것이 좋으나, EPEL 저장소 사용을 권장한다.
8-1) Rocky Linux 10 Control node 서버에 Ansible 설치 (EPEL 저장소) (권장)
sudo dnf install epel-release
sudo dnf config-manager --set-enabled crb
sudo dnf install ansible (작동하지 않으면 아래의 ansible-core로 설치)
sudo dnf install ansible-core
ansible --version
8-2) Rocky Linux 10 Control node 서버에 Ansible 설치 (PIP 기반)
sudo dnf install pipx
pipx install --include-deps ansible
ansible --version
2편에서는 실습에 사용될 Directory 생성, yml 작성을 다룰 예정이다.