변수와 템플릿

AnsibleBeginner
지금 연습하기

소개

서버 100 대를 관리한다고 해서 모든 서버를 완전히 동일하게 구성할 필요는 없습니다. 서버마다 고유한 호스트 이름, IP 주소 또는 특정 구성 설정이 필요할 수 있습니다.

Ansible 은 변수와 템플릿으로 이를 처리합니다.

  • 변수: 데이터의 자리 표시자입니다 (예: port: 8080 또는 server_name: "web-01").
  • 템플릿: 내부에“빈칸”이 있는 텍스트 파일입니다. Ansible 은 이 빈칸을 변수로 채워 최종 파일을 만듭니다.

이 조합을 사용하면 자동화를 반복 작업이 아니라 재사용 가능한 작업으로 만들 수 있습니다. 여러 호스트에 동일한 일반 구조를 유지하면서 환경이나 시스템마다 삽입되는 데이터만 변경할 수 있습니다.

Ansible 은 Jinja2라는 템플릿 언어를 사용합니다. 하나의 템플릿이 제공된 변수에 따라 서로 다른 최종 구성 파일을 만들 수 있으므로 자동화를 더욱 재사용하기 쉬워집니다.

그리고 다음과 같이 바꿉니다: Welcome to web-01

이 실습에서는 변수와 템플릿을 사용해 서버용 사용자 지정 HTML 웹 페이지를 생성합니다.

템플릿 만들기

먼저 파일을 정리해야 합니다. Ansible 은 templates라는 특정 디렉터리에서 템플릿을 찾습니다.

이 규칙은 Ansible 의 설계 철학에 포함되어 있습니다. 자동화를 쉽게 읽고 여러 팀이 공유할 수 있도록 예측 가능한 디렉터리 구조를 사용합니다.

프로젝트 디렉터리 안에 다음 디렉터리를 만듭니다.

mkdir -p ~/project/templates

이제 템플릿 파일을 만듭니다. 템플릿 파일의 확장자는 일반적으로 .j2입니다 (Jinja2 를 의미).

nano를 열어 index.html.j2를 만듭니다.

nano ~/project/templates/index.html.j2

다음 HTML 코드를 추가합니다. 특수한 {{ }} 괄호에 주목하세요. 이 표기법은 Ansible 에“여기에 변수를 넣으세요”라고 알려줍니다.

<html>
  <head>
    <title>{{ page_title }}</title>
  </head>
  <body>
    <h1>Welcome to {{ inventory_hostname }}</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

변수 이해하기:

  • {{ page_title }}: 사용자 지정 변수입니다. 나중에 플레이북에서 값을 정의합니다.
  • {{ inventory_hostname }}: 매직 변수입니다. Ansible 이 자동으로 알고 있는 값이며, 현재 작업 중인 서버의 이름입니다 (이 실습에서는 localhost).

이 두 가지 값의 종류를 구분하는 것이 중요합니다. 일부 변수는 사용자가 정의하고, 다른 변수는 Ansible 이 인벤토리와 실행 컨텍스트에서 자동으로 제공합니다.

저장하고 종료합니다 (Ctrl+X, Y, Enter).

변수 정의하기

이제 이 템플릿을 사용할 플레이북이 필요합니다. 플레이북에서 사용자 지정 변수인 page_title의 값을 정의합니다.

playbook.yml이라는 새 파일을 만듭니다.

nano ~/project/playbook.yml

먼저 플레이와 변수를 정의합니다.

---
- name: Deploy Web Page
  hosts: localhost
  vars:
    page_title: "My LabEx Web Server"
  tasks:

코드 이해하기:

  • vars:: 변수를 나열하는 섹션입니다.
  • page_title: "...": 템플릿에서 Ansible 이 {{ page_title }}를 발견하면 이를 "My LabEx Web Server"로 바꾸도록 지정합니다.

다음 단계에서 사용할 수 있도록 파일을 열어 둡니다.

Template 모듈 사용하기

이제 실제 작업을 수행하는 태스크를 추가합니다. 여기서는 template 모듈을 사용합니다. 이 모듈은 .j2 파일을 읽고 변수 값을 채운 다음 그 결과를 서버에 저장합니다.

실제 환경에서는 template 모듈을 사용해 다양한 구성 파일을 배포합니다. 정적인 파일을 복사하는 대신 공통 패턴에서 호스트별 버전을 렌더링할 수 있습니다.

playbook.yml에 태스크를 추가합니다. 들여쓰기에 주의하세요!

---
- name: Deploy Web Page
  hosts: localhost
  become: yes
  vars:
    page_title: "My LabEx Web Server"
  tasks:
    - name: Create index.html from template
      template:
        src: templates/index.html.j2
        dest: /var/www/html/index.html
        mode: "0644"

코드 이해하기:

  • template:: 사용할 모듈입니다.
  • src: 원본 파일입니다 (자리 표시자가 포함된 템플릿).
  • dest: 최종 HTML 파일을 저장할 대상 경로입니다.
  • mode: "0644": 웹 서버가 파일을 읽을 수 있도록 파일 권한을 설정합니다.
  • become: yes: /var/www/html에 파일을 쓰려면 root 권한이 필요하므로 추가합니다.

파일을 저장하고 종료합니다.

배포하고 확인하기

플레이북을 실행해 결과를 확인합니다.

플레이북을 실행합니다.

ansible-playbook -i inventory playbook.yml

정상적으로 실행되면 changed 상태가 표시됩니다.

이제 Ansible 이 만든 최종 파일을 확인합니다. 자리 표시자가 사라지고 실제 텍스트로 바뀌어 있어야 합니다.

생성된 HTML 파일을 읽습니다.

cat /var/www/html/index.html

예상 결과:

<html>
  <head>
    <title>My LabEx Web Server</title>
  </head>
  <body>
    <h1>Welcome to localhost</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

확인해 보세요. {{ page_title }}는 "My LabEx Web Server"가 되었고, {{ inventory_hostname }}는 "localhost"가 되었습니다.

요약

이 실습에서는 구성을 동적으로 만드는 방법을 배웠습니다.

  1. 템플릿: {{ placeholders }}가 포함된 .j2 파일을 만들었습니다.
  2. 변수: 플레이북의 vars 섹션에서 값을 정의했습니다.
  3. 매직 변수: Ansible 이 자동으로 제공하는 inventory_hostname을 사용했습니다.
  4. Template 모듈: template 모듈을 사용해 변수와 템플릿을 결합하고 최종 구성 파일을 만들었습니다.

이 강력한 기능을 사용하면 하나의 템플릿으로 수천 대의 서버를 구성하면서 각 서버에 필요한 고유한 세부 정보도 적용할 수 있습니다.