Ansible 핵심 모듈 활용법 및 실전 예제

인벤토리 환경 구성

Ansible을 효과적으로 사용하기 위해서는 타겟 호스트 정보가 담긴 인벤토리 파일이 필요하다. 아래는 예시로 사용할 호스트 그룹과 IP 설정이다.

[web_nodes]
node01 ansible_ssh_host=192.168.10.11

[db_nodes]
192.168.10.12

[datacenter:children]
web_nodes
db_nodes

주요 내장 모듈 사용법

1. command 모듈

원격 호스트에서 명령어를 실행할 때 사용하는 기본 모듈이다. 셸 기능(파이프, 리다이렉션 등)이 필요하지 않은 단순 명령어 실행에 적합하다.

  • chdir: 명령어 실행 전 미리 이동할 디렉토리 경로
  • creates: 지정한 파일이 존재하면 명령어를 실행하지 않음
  • removes: 지정한 파일이 존재하지 않으면 명령어를 실행하지 않음
# /opt/app 디렉토리로 이동하여 빌드 스크립트 실행 (lock.file이 없을 때만)
ansible web_nodes -m command -a "chdir=/opt/app creates=/opt/app/lock.file ./run_build.sh"

2. copy 모듈

제어 노드의 파일을 원격 호스트로 복사하거나, 특정 문자열을 파일로 생성할 때 사용한다.

  • backup: 덮어쓰기 전 기존 파일을 타임스탬프를 붙여 백업할지 여부 (yes/no)
  • content: 파일 대신 직접 입력한 텍스트를 원격 파일의 내용으로 설정 (덮어쓰기 됨)
  • dest: 원격 호스트의 절대 경로 (필수)
  • src: 제어 노드의 원본 파일 경로. 경로 끝에 '/'가 있으면 디렉토리 내부 파일만 복사되고, 없으면 디렉토리 자체가 복사됨
  • mode, owner, group: 권한, 소유자, 소유그룹 설정
  • force: 원격 파일의 내용이 다를 경우 강제 덮어쓰기 (기본값 yes)
# 로컬 설정 파일을 원격 서버에 백업 옵션과 함께 배포
ansible db_nodes -m copy -a "src=/local/conf/my.cnf dest=/etc/my.cnf owner=mysql group=mysql mode=0644 backup=yes"

3. file 모듈

파일 및 디렉토리의 속성을 설정하거나, 생성/삭제/심볼릭 링크를 관리한다.

  • path: 관리할 대상의 절대 경로 (필수, dest나 name으로 대체 가능)
  • state: 대상의 상태 지정 (directory, touch, link, hard, absent)
  • recurse: 디렉토리 속성을 재귀적으로 설정 (state=directory 일 때)
  • src: 링크를 생성할 때 원본 파일의 경로 (state=link 일 때)
# 디렉토리 생성 및 권한 재귀적 설정
ansible web_nodes -m file -a "path=/var/log/app state=directory owner=appuser group=appuser mode=0755 recurse=yes"

# 빈 파일 생성
ansible web_nodes -m file -a "path=/tmp/init_check.state=touch mode=0600"

# 심볼릭 링크 생성
ansible web_nodes -m file -a "src=/opt/app/current dest=/var/www/html state=link"

# 파일 또는 디렉토리 삭제
ansible web_nodes -m file -a "path=/tmp/init_check state=absent"

4. yum 모듈

RHEL 계열 시스템에서 패키지를 설치, 업데이트, 제거할 때 사용한다.

# 단일 패키지 설치
ansible db_nodes -m yum -a "name=postgresql state=present"

# 여러 패키지 최신 버전으로 일괄 설치
ansible db_nodes -m yum -a "name=wget,curl,vim state=latest"

5. service 모듈

시스템 서비스(데몬)의 시작, 중지, 재시작 및 부팅 시 자동 실행 여부를 관리한다.

# Nginx 서비스 시작 및 부팅 시 활성화
ansible web_nodes -m service -a "name=nginx state=started enabled=yes"

# 서비스 재시작
ansible web_nodes -m service -a "name=nginx state=restarted"

# 서비스 중지
ansible web_nodes -m service -a "name=nginx state=stopped"

6. cron 모듈

원격 호스트의 크론 작업(Crontab)을 관리한다.

  • name: 크론 작업의 설명 (삭제 시 식별자로 사용됨)
  • job: 실행할 명령어
  • minute, hour, day, month, weekday: 실행 주기 (기본값 *)
  • user: 작업을 실행할 사용자 계정
  • state: present(생성/수정) 또는 absent(삭제)
# 매일 새벽 2시에 로그 정리 스크립트 실행
ansible all -m cron -a "name='cleanup_logs' minute=0 hour=2 job='/usr/local/bin/clean_logs.sh >> /var/log/cleanup.log 2>&1' user=root"

# 특정 크론 작업 삭제
ansible all -m cron -a "name='cleanup_logs' state=absent"

7. script 모듈

제어 노드에 존재하는 스크립트를 원격 호스트에서 실행한다. 원격 호스트에 스크립트를 미리 배포할 필요가 없으며, 실행 권한이 없어도 동작한다.

  • creates: 해당 파일이 원격지에 존재하면 스크립트 미실행
  • removes: 해당 파일이 원격지에 존재하지 않으면 스크립트 미실행
# 로컬 디버깅 스크립트를 원격 서버에서 실행
ansible all -m script -a '/opt/scripts/diagnostic.sh'

8. user 및 group 모듈

원격 호스트의 사용자 계정과 그룹을 생성, 수정, 삭제한다. 비밀번호는 평문이 아닌 해시 값을 입력해야 한다.

# 그룹 생성
ansible db_nodes -m group -a "name=devops gid=5000 state=present"

# 사용자 생성 (비밀번호 해시 적용)
ansible db_nodes -m user -a "name=devuser group=devops shell=/bin/bash password=$6$randomsalt$hashedvalue state=present"

# 사용자 및 홈 디렉토리 삭제
ansible db_nodes -m user -a "name=devuser state=absent remove=yes"

리눅스에서는 비밀번호 해시 생성을 위해 다음과 같은 방법을 사용할 수 있다.

python3 -c 'import crypt; print(crypt.crypt("MySecretPass", crypt.mksalt(crypt.METHOD_SHA512)))'

9. get_url 모듈

HTTP, HTTPS, FTP를 통해 원격 호스트에 파일을 다운로드한다.

  • url: 다운로드할 파일의 URL
  • dest: 저장할 절대 경로 (디렉토리인 경우 URL의 파일명 사용)
  • checksum: 파일 무결성 검증 (SHA256 등)
  • url_username, url_password: 인증이 필요한 사이트의 로그인 정보
  • validate_certs: SSL 인증서 검증 여부 (자가 서명 인증서 사용 시 no)
# 아티팩트 다운로드 및 무결성 검증
ansible web_nodes -m get_url -a "url=https://repo.example.com/app-v1.2.tar.gz dest=/tmp/ checksum=sha256:a1b2c3d4e5f6 mode=0755"

10. setup 모듈

원격 호스트의 시스템 정보(CPU, 메모리, 네트워크, OS 등)를 수집하여 변수(Facts)로 반환한다. SaltStack의 Grains와 유사한 역할을 한다.

# 전체 시스템 정보 수집
ansible all -m setup

# 특정 키워드(정규식 지원)로 필터링하여 IPv4 정보만 조회
ansible web_nodes -m setup -a "filter=*ipv4*"

# 특정 네트워크 인터페이스 정보만 조회
ansible web_nodes -m setup -a "filter=ansible_eth0"

태그: Ansible infrastructure-as-code DevOps automation linux-administration

10월 2일 04:20에 게시됨