[에스넷시스템 부트캠프] TIL Day20 - IaC, Ansible 기초

2025. 6. 17. 23:57·TIL
728x90

1. 자동화

리눅스에서 자동화라 함은 두가지 방식으로 나뉜다.

  • 시스템 내장형 자동화 (batch) : 리눅스 자체 기능을 활용한 스케줄 기반 자동화 (crontab, systemd, bash script 등)
  • 부가 설치형 자동화 (AutoHotKey 등) : 주로 GUI기반의 매크로 자동화로 윈도우에서 사용

리눅스에서는 대부분이 CLI기반이기 때문에, GUI 자동화보다는 쉘 스크립트, Ansible, Crontab 같은 커맨드 기반 자동화가 중심이다. 

 

2. Infrastructure as Code, IaC

코드로 인프라를 관리하는 장점에 대해 알아보자. 

  • 원격지 서버 관리 효율성
    → 서버가 멀리 있어도 코드 한 줄로 명령 전송, 대역폭을 적게 사용하며 관리 가능
  • 버전 관리 용이
    → Git 등의 도구로 설정 변경 내역 추적 가능
  • 사람이 읽기 편한 형태
    → YAML, JSON, Shell 등 사람이 이해할 수 있는 포맷 사용
  • 오류 수정 및 반복 실행 용이
    → 스크립트 수정 후 재실행만으로 간단히 복구 가능
  • 인적 실수 최소화
    → 수작업 대신 검증된 코드로 일괄 처리 → 운영 리스크 감소
예시 도구: Ansible, Terraform, Shell Script, systemd timer, Jenkins 등

3. Ansible

1) Ansible이란?

Ansible은 오픈 소스 기반의 IT 자동화 플랫폼을 말한다. 

Python 언어로 작성되었으며, 애플리케이션 설치, 서비스 설정, 인프라 구성 등을 자동화하는 데 사용된다.

Ansible은 언어가 아닌 단순한 실행 도구이고, Ansible-playbook은 자동화를 위한 코드 집합을 말한다.

 

2) 장점

  • 플랫폼 다양성 : 물리 서버, 가상 머신, 클라우드, 컨테이너 등 광범위한 환경 지원
  • 가독성 높은 문법 : YAML 기반의 플레이북 사용
  • 버전 제어 용이 : Git 등으로 설정 파일 관리
  • 동적 인벤토리 : 외부 데이터 소스로터 호스트 목록 자동 수집
  • 통합성 우수 : 다양한 시스템, API, 클라우드 서비스와 손쉽게 연동 가능
  • 멱등성 : 같은 작업을 여러번 실행해도 동일한 결과 도출
  • Angentless 구조 : 관리 대상 시스템에 에이전트를 설치하지 않아도 됨
💡 여기서 말하는 에이전트란?
서버 내부에서 설치되어 상시 실행 중인 프로그램으로 외부 시스템으로부터 명령을 수신하고, 실행 결과를 전달하는 역할을 한다. 

Puppet, Chef, SaltStack 등 일부 자동화 도구들은 관리 대상 서버마다 전용 에이전트 프로그램을 설치해야 하지만,  Ansible은 SSH를 통해 제어 노드가 직접 원격 서버에 접속해 작업을 수행하기 때문에 에이전트 설치가 필요없다. 

4. Ansible 구조 및 개념

1) 기본 구성 요소

  • 제어노드 (Controller) : Ansible이 설치된 주체로 모든 명령을 실행 ( 제어노드도 클라이언트가 될 수 있음) 
  • 관리 호스트 (Managed Node) : Ansible이 설치되지 않은 노드로, 제어노드로부터 SSH로 제어됨

이러한 제어노드, 관리호스트를 통하여 일괄 구성 → 통합 관리가 가능하다.

 

2) 주요 도구 및 구성 요소

  • ansible-core 
    • Ansible의 가장 기본적인 패키지
    • CLI 명령어, 기본 모듈, 기본 플러그인만 포함
    • 간단한 자동화 작업용, 최소 기능만 제공
  • ansible-project
    • ansible-core + 다양한 컬렉션이 추가된 구성
    • 실무에서 자주 쓰는 애플리케이션, 시스템, 클라우드 관리 등 다양한 자동화를 쉽게 할 수 있음
  • ansible-navigator
    • 플레이북 실행, 관리, 디버깅을 위한 CLI 기반 통합 도구
    • podman 기반 컨테이너 환경에서 작동
    • 플레이북 실행 과정을 시각적으로 확인하고 조작 가능
  • ansible-runner
    • 다중 제어 노드에서 Ansible 작업을 실행할 수 있게 해주는 실행기
    • 자동화된 파이프라인에서 Ansible 플레이북을 실행할 때 주로 사용됨 
  • ansible-lint
    • 플레이북 문법과 스타일 검사 도구
    • 작성한 YAML 코드가 규칙에 맞는지, 잘못된 문법이나 비효율적인 패턴은 없는지 검사
  • ansible-galaxy 
    • 전 세계 사용자들이 만든 자동화 모듈/역할 공유 플랫폼
    • 재사용 가능한 역할을 다운로드하거나 직접 공유 가능

 

3) 프로비저닝

프로비저닝은 시스템을 쓸 수 있게 준비하는 모든 작업을 의미한다.

가상 머신을 만들고, 필요한 패키지를 설치하고, 네트워크 세팅, 계정 생성 등 서비스를 실행할 수 있게 만드는 과정 전체를 프로비저닝이라 한다. 

  • 베어메탈 : PXE + DHCP + TFTP + Ansibe로 구성
  • 가상화/컨테이너 : OpenStack, ESXi, K8s 등에서 VM/컨테이너 생성 후 설정 작업 자동화
  • 서버리스 : AWS Lambda 등에서 함수 기반 자동화 가능
베어메탈은 가상화되지 않은 물리 서버, 즉 맨 하드웨어 장비를 말한다.

 

4) Ansible Tower

Ansible을 웹 기반 GUI로 시각화하고 관리할 수 있게 해주는 엔터프라이즈용 관리 도구이다. 

API 기반으로 Ansible을 호출, 구성 및 관리가 가능하며 사용자 단위로 작업 할당 및 추적이 가능하다. 

Ansible Tower는 Red Hat Ansible Automcation Platform(AAP)에 포함된 기술이다. 

 

5) 인벤토리

Ansible에서 관리할 호스트(서버)들의 목록을 정의해놓은 파일 또는 소스를 말한다. 

  • 정적 인벤토리 : 직접 작성한 텍스트 파일(INI, YAML 형식)로 관리
  • 동적 인벤토리 : 클라우드나 외부 스크립트로 자동 생성되는 목록으로 실시간으로 상태 반영이 가능

중요 설정 위치

  • 기본 경로 : /etc/ansible/hosts
  • 별도 파일 지정 : ansible -i my_inventory all -m ping
  • 플레이북에서는 inventory = ./inventory로 설정 가능 (ansible.cfg)

인벤토리 예시

 

 

6) 권한 에스컬레이션

Ansible은 일반 사용자 계정으로 원격 서버에 접속한 뒤, 작업을 수행할 때 root 또는 다른 고급 권한 계정으로 전환할 수 있다. 이는 보안이나 운영 정책상 직접 root 계정으로 SSH 접속하는 것이 제한되는 경우가 많기 때문에, 일반 사용자로 로그인한 후 sudo를 이용해 필요한 권한을 상승시키는 구조가 일반적이다.

이러한 권한 에스컬레이션을 설정하려면 ansible.cfg 파일의 [privilege_escalation] 섹션에 become = true를 지정해주어야 한다.

 

7) SSH의 예외

Ansible은 일반적으로 SSH를 사용해 관리 호스트에 접속하지만, 예외적으로 SSH 없이 로컬에서 직접 실행되는 경우도 있다.

예를 들어 인벤토리에 localhost가 포함되어 있지 않으면, Ansible은 자체 머신(제어 노드)에서 직접 명령을 실행하며, 이때는 SSH를 사용하지 않는다. 이러한 방식은 local이라는 특수 연결 유형을 통해 이루어지며, 호스트 그룹에 속하지 않고 독립적으로 구성된다.

local 연결 유형은 remote_user 설정을 무시하고, Ansible을 실행한 사용자 계정으로 로컬 시스템에서 명령을 직접 수행한다. 이 때문에 become 옵션을 사용한 권한 에스컬레이션 시, 실제로는 Ansible을 실행한 사용자가 sudo를 실행하게 되어 권한 관련 이슈가 발생할 수 있다.

localhost를 inventory 파일에 직접 추가하는 방식도 있지만, 일반적으로는 잘 사용되지 않는다.

 

 

8) Ad-hoc

Ad-hoc은 Ansible에서 단발성 작업을 빠르게 수행할 때 사용하는 명령 실행 방식이다.
별도의 파일(playbook)을 만들지 않고, CLI 상에서 한 번만 실행할 명령을 직접 작성해 사용하는 점이 특징이다.
재사용을 목적으로 하지 않기 때문에 테스트나 간단한 작업에 주로 사용된다.

 

모듈 목록은 아래 공식 문서에서 확인할 수 있다. 

https://docs.ansible.com/ansible/latest/module_plugin_guide/index.html

 

Using Ansible modules and plugins — Ansible Community Documentation

Ansible Community Documentation Ansible Using Ansible modules and plugins Edit on GitHub Using Ansible modules and plugins Note Making Open Source More Inclusive Red Hat is committed to replacing problematic language in our code, documentation, and web pro

docs.ansible.com

 

❗참고 사항
command, shell, raw 모듈은 권장되지 않는다. 특히 command는 파이프(|)를 사용할 수 없기 때문에 복잡한 명령 구성에 제약이 있다. 

 

 

실습) 애드혹 ping 활용하기

node4를 꺼두고 ping을 보내면 도달하지 않는다는 것을 볼 수 있다.

 

9) Playbook 

Playbook은 Ansible에서 자동화 작업을 수행하기 위한 명령 집합 파일로, YAML 형식으로 작성된다. 하나 이상의 play(작업 단위)를 포함하며, 각 play는 특정 호스트 집합에 대해 정의된 순서대로 작업을 수행한다. 

 

Playbook 작성 방식

  • YAML 파일: 들여쓰기로 계층 구조 표현
  • 확장자: .yml
  • 시작 마커: ---
  • (선택) 종료 마커: ...
  • tab 사용 금지 -> 공백만 사용
---
- name: Add a new user
  hosts: all
  become: true
  tasks:
    - name: Create user 'devops'
      user:
        name: devops
        state: present
...

 

 

문법검사

$ ansible-playbook --syntax-check useradd.yml
단, 이 문법 검사는 완전한 오류 탐지 기능은 아니니 신뢰하지 말자. 

 

 

 

실습) vi 설정 바꾸기

YAML 문법에서는 Tab 키 사용이 금지되므로, vi에서 Tab을 누르면 공백 2칸으로 자동 변환되도록 설정해놓으면 편하다. 또 추가적으로 문법 하이라이트와 편집 기능 향상을 위한 설정을 해보자. 

 

1. 관련 플러그인 설치
sudo dnf -y install vim-ansible vim-enhanced

2. 사용자 설정 파일 열기
vi ~/.vimrc

3. 아래 설정 내용 추가
===================================================
autocmd FileType yaml setlocal ai ts=2 sw=2 et

set cursorline
set cursorcolumn
=====================================================

설정 완료시 vi 에디터 모습

 

 

 

실습) 서버 설치해보기

1. bash-completion과 httpd 패키지 설치

dnf install -y bash-completion httpd

2. 기본 웹 페이지 파일 작성

echo "hello vm1" > /var/www/html/index.html
  • 이 파일은 Apache가 기본으로 제공하는 웹 루트 디렉토리에 위치
  • 브라우저에 접근시 표시될 내용

3. Apache 서비스 시작 및 부팅시 자동 실행 설정

systemctl enable --now httpd
  •  --now : 즉시 시작
  • enable : 부팅시 자동 시작 등록

4. 방화벽에서 HTTP 서비스 허용

firewall-cmd --permanent --add-service=http

 

5. 방화벽 재시작 (적용)

firewall-cmd --reload

6. 클라이언트 브라우저에서 접속 테스트

설정한 vm의 IP 주소로 접속해야 한다. 

 

 

 

 

 

 

번외)

갑자기 명령어 입력이 안보이는 상태가 됐다...

stty -a 명령어로 확인해보니 -echo로 되어 있었고 stty echo 명령로 해결했다. 

 

 

✍️ 하루 회고

어제부터 수업을 들으면서 실시간으로 블로그에 필기하고, 수업이 끝난 후 내용을 정리해 업로드하는 방식으로 공부하고 있다. 이전보다 확실히 학습 효율이 좋아진 걸 느낀다.

기존에는 종이에 필기하면서 실습까지 병행하느라 바빴고, 수업 자료가 중간에 변경되는 경우에는 정리하기도 번거로웠다.
하지만 타이핑을 기반으로 한 필기는 입력 속도도 빠르고, 복사/붙여넣기가 가능해서 시간 절약에도 도움이 된다. 무엇보다 나중에 복습하거나 검색할 때 훨씬 편하다.

앞으로도 이 방식을 유지하면서, 수업 내용 정리와 복습을 꾸준히 이어갈 계획이다.

 

 

 

728x90

'TIL' 카테고리의 다른 글

[에스넷시스템 부트캠프] TIL Day22 - Ansible 실습  (0) 2025.06.19
[에스넷시스템 부트캠프] TIL Day21 - Ansible 문법  (2) 2025.06.19
[에스넷시스템 부트캠프] TIL Day19 - 스크립트, 반복문, 조건문, 원격지 접근 자동화 스크립트  (0) 2025.06.16
[에스넷시스템 부트캠프] TIL Day18 - Crontab, autofs, swap  (0) 2025.06.14
[에스넷시스템 부트캠프] TIL Day17 - NTP, DNF  (0) 2025.06.12
'TIL' 카테고리의 다른 글
  • [에스넷시스템 부트캠프] TIL Day22 - Ansible 실습
  • [에스넷시스템 부트캠프] TIL Day21 - Ansible 문법
  • [에스넷시스템 부트캠프] TIL Day19 - 스크립트, 반복문, 조건문, 원격지 접근 자동화 스크립트
  • [에스넷시스템 부트캠프] TIL Day18 - Crontab, autofs, swap
yulee_to
yulee_to
  • yulee_to
    yulee
    yulee_to
  • 전체
    오늘
    어제
    • 전체 글 (131)
      • CS (2)
        • OS (0)
        • DB (0)
        • Network (2)
      • Develop (21)
        • Spring (9)
        • Java (12)
        • Python (0)
        • Algorithm (0)
        • 기타 (0)
      • PS (39)
        • C++ (39)
        • Java (0)
      • TIL (24)
      • Book (39)
        • 자바의 신 (32)
        • 스프링 입문을 위한 자바 객체 지향의 원리와 이해 (7)
      • ETC (4)
        • Blog (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Java
    EC2
    GodOfJava
    백준
    스프링 입문
    TiL
    부트캠프후기
    알고리즘
    에스넷시스템
    멀티캠퍼스it부트캠프
    문제풀이
    자바
    boj
    스터디
    객체지향
    클라우드 활용 네트워크 엔지니어 부트캠프
    자바의 신
    C++
    1일1백준
    에스넷시스템 부트캠프
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
yulee_to
[에스넷시스템 부트캠프] TIL Day20 - IaC, Ansible 기초
상단으로

티스토리툴바