소개
서버 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"가 되었습니다.
요약
이 실습에서는 구성을 동적으로 만드는 방법을 배웠습니다.
- 템플릿:
{{ placeholders }}가 포함된.j2파일을 만들었습니다. - 변수: 플레이북의
vars섹션에서 값을 정의했습니다. - 매직 변수: Ansible 이 자동으로 제공하는
inventory_hostname을 사용했습니다. - Template 모듈:
template모듈을 사용해 변수와 템플릿을 결합하고 최종 구성 파일을 만들었습니다.
이 강력한 기능을 사용하면 하나의 템플릿으로 수천 대의 서버를 구성하면서 각 서버에 필요한 고유한 세부 정보도 적용할 수 있습니다.


