반응형

🧠 1. register : 작업 결과를 변수로 저장

✅ 개념

  • register 는 특정 task의 실행 결과를 저장할 때 사용합니다.
  • 결과에는 stdout, stderr, rc(return code), changed 등 실행 메타데이터가 포함됩니다.

✅ 사용 목적

  • 명령의 출력값을 다음 task 에서 사용하기 위해서
  • 조건 분기(when:)에 쓰기 위해서

✅ 예제

- name: Run a command
  command: hostname
  register: result

- debug:
    var: result.stdout

 

=> 저장되는 내용은 다음과 같습니다.
result = {
  "stdout": "my-server",
  "stderr": "",
  "rc": 0,
  "changed": false,
  ...
}
 
 

🧠 2. set_fact: 실행 중 동적으로 변수 생성

✅ 개념

  • set_fact는 실행 도중 변수를 직접 정의하는 데 사용됩니다.
  • 내부적으로는 ansible_facts 딕셔너리에 저장됩니다.

✅ 사용 목적

  • 이전 task의 결과 기반으로 새 변수 정의
  • 조건부 분기 처리용 값 설정
  • 루프나 반복문 내 변수 누적

✅ 예제

- name: Set a dynamic variable
  set_fact:
    env_type: "prod"

- debug:
    var: env_type

⚠️ set_fact로 만든 변수는 사실상 호스트 facts로 취급되어 다음 task에서도 지속적으로 참조 가능합니다.

 

🧠 3. vars: 플레이북/role 수준에서 정적인 변수 정의

✅ 개념

  • vars는 플레이북, 블록, task 등에서 미리 정의된 정적 변수입니다.
  • 보통 조건 분기 없이 선언과 동시에 값이 확정됩니다.

✅ 사용 목적

  • 플레이북 전체 또는 특정 블록에 필요한 기본 변수 정의
  • 값이 고정된 설정값 정의

✅ 예제

- hosts: all
  vars:
    app_port: 8080

  tasks:
    - name: Show app port
      debug:
        var: app_port

✅ 여러 위치에서 정의 가능

위치 우선순위는 다음과 같습니다.

 

CLI -e 가장 높음
set_fact 높음
Task-level vars 중간
Play-level vars 낮음
Inventory 가장 낮음
 
🔍 세 가지 비교 요약
항목 register set_fact vars
언제 실행됨 특정 task 실행 결과가 나올 때 플레이 중간 task에서 실행될 때 플레이 시작 시점에 로딩됨
목적 명령 결과 저장 (stdout 등) 동적 변수 생성, 조건 기반 변수 정의 정적 변수 정의
유지 범위 다음 task부터 사용 가능 다음 task부터 사용 가능 (ansible_facts로 저장) 전체 task에서 사용 가능
수정 가능 여부 X (자동 결과 저장) O (동적으로 재정의 가능) X (재정의하려면 다른 위치 필요)
대표 사용 예 명령 출력 재사용 조건 기반 변수 설정 기본 설정값 지정
 
 

 

✅ 언제 뭘 써야 할까?

상황추천 도구
어떤 명령의 결과를 저장하고 싶다 register
플레이 중간에 조건 따라 변수를 만들고 싶다 set_fact
설정값을 미리 정의해두고 재사용하고 싶다 vars
변수를 조건적으로 계속 갱신해야 한다 set_fact
한 번 실행한 명령의 출력을 재가공해서 쓰고 싶다 register + set_fact 조합
반응형

+ Recent posts