이 단계에서는 Ansible 의 강력한 템플릿 엔진인 Jinja2 와 관련된 오류를 해결합니다. Jinja2 표현식이 종종 따옴표로 묶여야 하는 이유와 플레이북이 지정된 템플릿 파일을 찾을 수 없을 때 디버깅하는 방법을 배우게 됩니다. 이들은 플레이북이 이미 구문 검사를 통과한 후에 발생하는 일반적인 런타임 오류입니다.
-
Jinja2 템플릿 파일 생성
먼저 템플릿 파일이 필요합니다. 정적 파일과 달리 템플릿에는 Ansible 이 플레이북 실행 중에 실제 값으로 대체할 변수가 포함될 수 있습니다. 간단한 HTML 템플릿을 생성합니다.
nano를 사용하여 프로젝트 디렉터리 (~/project/ansible_troubleshooting) 에 index.html.j2라는 파일을 생성합니다. .j2 확장자는 Jinja2 템플릿에 대한 일반적인 규칙입니다.
nano index.html.j2
다음 HTML 콘텐츠를 편집기에 복사하여 붙여넣습니다. {{ welcome_message }} 플레이스홀더는 Jinja2 변수입니다.
<h1>{{ welcome_message }}</h1>
<p>This page was deployed by Ansible.</p>
파일을 저장하고 nano를 종료합니다 (Ctrl+X, Y, Enter).
-
플레이북 수정하여 템플릿 사용 및 오류 발생
이제 webserver.yml 플레이북을 수정하여 ansible.builtin.template 모듈을 사용하도록 합니다. 또한 따옴표 없는 Jinja2 변수와 잘못된 템플릿 경로라는 두 가지 새로운 오류를 발생시킵니다.
nano로 webserver.yml을 엽니다.
nano webserver.yml
파일의 전체 내용을 다음 내용으로 바꿉니다. become: true 지시문은 Ansible 에 관리자 권한 (sudo 사용) 으로 작업을 실행하도록 지시하며, 이는 소프트웨어를 설치하고 /var/www/html과 같은 시스템 디렉터리에 파일을 쓰는 데 필요합니다.
---
- name: Configure Web Server
hosts: localhost
become: true
vars:
package_name: httpd
welcome_message: "Welcome to Ansible with Jinja2"
tasks:
- name: Install httpd package
ansible.builtin.dnf:
## ERROR 1: Unquoted Jinja2 variable
name: { { package_name } }
state: present
- name: Create a test index page from template
ansible.builtin.template:
## ERROR 2: Incorrect template source path
src: index.j2
dest: /var/www/html/index.html
편집기를 저장하고 종료합니다.
-
Jinja2 따옴표 오류 식별 및 수정
이것은 Jinja2 문제이지만 YAML 구문 오류로 나타날 수 있습니다. 구문 검사기를 실행하여 Ansible 이 이를 어떻게 해석하는지 확인합니다.
ansible-playbook --syntax-check webserver.yml
예상 출력 (오류): {{로 시작하는 YAML 값은 특수 구문으로 취급되므로 문자열로 해석되려면 따옴표로 묶어야 하므로 구문 오류가 발생합니다.
ERROR! A malformed block was encountered.
The error appears to be in '/home/labex/project/ansible_troubleshooting/webserver.yml': line 11, column 19, but may be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
## ERROR 1: Unquoted Jinja2 variable
name: {{ package_name }}
^ here
해결 방법: webserver.yml을 열고 Jinja2 변수를 큰따옴표로 묶습니다.
nano webserver.yml
Install httpd package 작업을 수정합니다.
## ... (rest of the file)
tasks:
- name: Install httpd package
ansible.builtin.dnf:
## FIX: Quote the Jinja2 expression
name: "{{ package_name }}"
state: present
## ... (rest of the file)
저장하고 종료합니다. 이제 구문 검사가 통과해야 합니다.
-
템플릿 경로 오류 식별 및 수정
이제 구문이 올바르게 되었으므로 플레이북을 실행해 봅니다.
ansible-playbook webserver.yml
예상 출력 (오류): 플레이북이 실패하지만 이번에는 구문 오류가 아니라 런타임 오류입니다. 오류 메시지는 소스 파일 index.j2를 찾을 수 없다고 명확하게 명시합니다.
TASK [Create a test index page from template] **********************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Could not find or access '/home/labex/project/ansible_troubleshooting/index.j2' on the Ansible Controller."}
이는 플레이북의 src 매개변수가 index.j2를 가리키지만 생성한 파일의 이름이 index.html.j2이기 때문에 발생합니다.
해결 방법: 마지막으로 webserver.yml을 열고 파일 이름을 수정합니다.
nano webserver.yml
Create a test index page from template 작업의 src 매개변수를 수정합니다.
## ... (rest of the file)
- name: Create a test index page from template
ansible.builtin.template:
## FIX: Correct template source filename
src: index.html.j2
dest: /var/www/html/index.html
## ... (rest of the file)
편집기를 저장하고 종료합니다.
-
플레이북 성공적으로 실행
플레이북을 다시 실행합니다. 이제 모든 작업을 성공적으로 완료해야 합니다.
ansible-playbook webserver.yml
예상 출력 (성공):
PLAY [Configure Web Server] ****************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Install httpd package] ***************************************************
changed: [localhost]
TASK [Create a test index page from template] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0