개념 사전 · 개념

IaC와 멱등성

Infrastructure as Code · 인프라 코드화

IaC는 인프라의 구성과 변경 의도를 코드로 표현하여 검토·재현·자동 적용에 연결하는 운영 방식이다. 반복 적용이 같은 상태로 수렴하는 과 실제 외부 상태·비밀·부분 실패의 관리는 별도로 설계해야 한다.

밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.

01무엇이고, 어떤 일을 하나

  • 환경 구성의 의도를 버전 관리하고 변경 근거를 남긴다.
  • 목표 상태와 현재 상태의 차이를 계산·적용하는 절차를 만든다.
  • 검토·배포·검증·복구를 반복 가능한 흐름으로 묶는다.

02어떤 순서로 동작하나

  1. 목표 정의

    필요한 자원과 관계·설정을 코드로 표현하고 비밀값 공급 경로를 분리한다.

  2. 차이 검토

    현재 상태·의존성·예상 생성·변경·삭제를 확인하여 적용 범위를 정한다.

  3. 조건부 적용

    지원 도구의 모듈·provider가 필요한 작업을 수행하고 호스트·자원별 성공과 실패를 기록한다.

  4. 실제 상태 확인

    코드와 실제 자원의 차이·드리프트·부분 적용을 확인하고 재적용 또는 복구 절차를 결정한다.

03먼저 알아둘 용어와 구성요소

스크립트는 디렉터리를 만들고 파일을 쓰고 서비스를 시작하는 순서를 직접 기술한다.
선언적 구성은 원하는 자원의 속성이나 상태를 표현하고 도구가 현재 상태와 비교하여 필요한 작업을 결정한다.
이런 속성 참조는 의존 관계를 표현하고 도구는 독립적인 자원은 병렬로 처리할 수 있다.
관리자가 콘솔에서 직접 값을 바꾸면 코드와 실제 자원이 어긋나는 가 생긴다.
각 층의 입력과 출력 경계를 정하면 생성 성공, 원격 접속 가능, 서비스 준비 완료라는 서로 다른 완료 기준을 명확히 할 수 있다.
같은 목표 상태를 반복 적용해도 추가 변화가 생기지 않도록 설계하는 성질이다. 모듈·입력·외부 상태의 조건에 따라 달라지며 잘못 정의한 목표가 올바른 서비스라는 보장은 아니다.
LEARN THROUGH PRACTICE

SSH 인증 실패와 반복 mkdir 실패를 멱등 모듈로 구별하기

의 UNREACHABLE·FAILED·CHANGED가 발생한 처리 단계를 비교하고 원하는 디렉터리 상태로 작업을 표현한다.

실습 구성과 전제

  • 사진은 inventory 대상에 command 모듈을 실행한 사례다. 아래에서는 대상 그룹·경로를 lab과 /tmp/-lab으로 재구성한다.
  • 관리 대상에 검증한 SSH 접속과 파일 모듈 실행 환경이 준비되어 있어야 한다. 화면의 삭제 명령은 재실행하지 않는다.
  1. 원격 작업 전에 연결이 성립했는지 읽는다

    • 첫 화면의 UNREACHABLE과 Permission denied는 SSH 인증 단계의 실패다. 원하는 mkdir 작업이 실행되어 실패한 것이 아니다.
    • changed=false도 디렉터리 상태를 검사해 이미 정상이었다는 뜻이 아니라, 이 사례에서는 원격 작업까지 도달하지 못했다는 결과와 함께 읽어야 한다.
    bash
    ansible-inventory -i inventory --graph
    ansible lab -i inventory -m ansible.builtin.ping

    연결과 모듈 실행 준비를 확인하는 예시다. ping은 ping이 아니다.

    9/7 - Ansible · 실습·개념 참고 화면 8원본 크기로 보기 ↗
    • inventory와 -u 사용자를 지정한 command 실행이 UNREACHABLE로 끝난다.
    • 메시지는 Permission denied이며 changed=false가 함께 표시된다.
    확인 기준

    inventory의 주소·사용자·인증 키와 수동 SSH 접속 조건을 대조한다. module 인자를 바꿔도 앞단 인증 실패는 해결되지 않는다.

  2. 명령 실행 성공과 원하는 상태의 달성을 구별한다

    • 다음 화면의 mkdir는 이미 존재하는 디렉터리 때문에 rc=1로 실패한다. 필요한 상태가 이미 있어도 명령은 매번 생성 연산을 시도한다.
    • 화면의 별도 삭제 명령은 rc=0과 CHANGED로 나타난다. 이를 반복 생성 문제의 필수 해결책으로 삼지 않고, 처음부터 원하는 디렉터리 상태를 표현하는 것이 적절하다.
    9/7 - Ansible · 실습·개념 참고 화면 10원본 크기로 보기 ↗
    • mkdir 결과에 File exists, rc=1, FAILED가 표시된다.
    • 다른 삭제 작업은 rc=0과 CHANGED로 나와 상태 변경과 명령 종료 결과를 각각 보여 준다.
    확인 기준

    command 모듈의 CHANGED는 작업이 업무적으로 올바른 상태를 만들었다는 자동 검증이 아니다. 결과의 의미를 해당 명령과 연결한다.

  3. file 모듈로 상태를 선언하고 재실행 결과를 비교한다

    • file 모듈의 state: directory는 경로가 디렉터리인지와 요청한 속성을 비교한다. 없으면 만들고, 이미 조건을 만족하면 불필요한 변경을 하지 않는 구조다.
    • 재구성 playbook을 같은 대상에 두 번 적용한다면 첫 변경 이후 두 번째는 해당 task의 changed가 줄어드는지 확인한다. 이는 실제 사진의 결과가 아니라 준비한 환경에서 검증할 기대 동작이다.
    yaml
    - name: Ensure the lab directory exists
      hosts: lab
      gather_facts: false
      tasks:
        - name: Keep the directory at the desired mode
          ansible.builtin.file:
            path: /tmp/ansible-lab
            state: directory
            mode: "0750"

    대상과 경로를 재구성한 playbook이다. inventory와 접속 신뢰 설정을 먼저 준비한다.

    확인 기준

    두 번째에도 changed가 반복되면 권한·소유자·다른 작업의 변경·경로 종류를 확인한다. check 모드와 실제 실행을 구분한다.

실습에서 확인한 동작 원리

  • UNREACHABLE은 연결 경계, FAILED는 작업 실패, CHANGED는 변경 판정이므로 처리 위치를 구분한다.
  • 은 같은 명령을 반복하는 것이 아니라 현재 상태와 원하는 상태를 비교하는 방식에서 얻는다.
관련 개념·전체 실습 화면 이어서 읽기 →
동작·명령 참고 문서

04예제로 따라가기

  • 은 OS 설정과 서비스 상태, 은 인프라 API 자원, Compose는 앱의 컨테이너 묶음처럼 도구의 주 관리 경계가 다르다.
  • 조회 후 필요한 경우에만 디렉터리를 만드는 모듈과 실행할 때마다 새 사용자를 추가하는 스크립트는 반복 실행의 결과가 다르다.
  • 코드가 복구돼도 외부 DB 데이터와 키가 없으면 서비스가 재현되지 않으므로 구성 코드·상태·백업을 각각 보관해야 한다.

05혼동하기 쉬운 점과 확인 기준

  • 코드의 재현성과 데이터의 복원성, 인프라의 가용성을 서로 다른 목표로 설계해야 한다.
  • 일부 자원 생성 후 나머지가 실패할 수 있으므로 오류 메시지만 보고 전체 작업이 원상복구됐다고 가정하지 않는다.
  • 협업에서는 backend의 접근 권한과 지원되는 잠금 기능, 동시 실행 정책을 준비한다.

06상세 노트 · 실습 자료

헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.

공식 문서 · 표준

기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.