在此步骤中,你将处理与 Jinja2(Ansible 强大的模板引擎)相关的错误。你将了解为什么 Jinja2 表达式通常需要加引号,以及如何调试 playbook 找不到指定模板文件的问题。这些是 playbook 通过语法检查后常见的运行时错误。
-
创建 Jinja2 模板文件
首先,你需要一个模板文件。与静态文件不同,模板可以包含变量,Ansible 在 playbook 执行期间会用实际值替换这些变量。你将创建一个简单的 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
)。
-
修改 Playbook 以使用模板并引入错误
现在,修改你的 webserver.yml
playbook 以使用 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)
保存并退出。语法检查现在应该通过了。
-
识别并修复模板路径错误
现在语法正确了,尝试运行 playbook。
ansible-playbook webserver.yml
预期输出(错误): Playbook 将会失败,但这次是运行时错误,而不是语法错误。错误消息清楚地表明找不到源文件 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."}
这是因为你的 playbook 中的 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)
保存并退出编辑器。
-
成功运行 Playbook
再次运行 playbook。它现在应该成功完成所有任务。
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