На этом этапе вы устраните ошибки, связанные с Jinja2, мощным движком шаблонизации Ansible. Вы узнаете, почему выражения Jinja2 часто нуждаются в кавычках, и как устранять проблемы, когда плейбук не может найти указанный файл шаблона. Это распространенные ошибки времени выполнения, которые возникают после того, как плейбук уже прошел проверку синтаксиса.
-
Создание файла шаблона Jinja2
Сначала вам понадобится файл шаблона. В отличие от статического файла, шаблон может содержать переменные, которые Ansible заменит фактическими значениями во время выполнения плейбука. Вы создадите простой HTML-шаблон.
Используйте nano для создания файла с именем index.html.j2 в вашем каталоге проекта (~/project/ansible_troubleshooting). Расширение .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 без кавычек и неправильный путь к шаблону.
Откройте webserver.yml с помощью nano:
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:
## ... (остальная часть файла)
tasks:
- name: Install httpd package
ansible.builtin.dnf:
## FIX: Quote the Jinja2 expression
name: "{{ package_name }}"
state: present
## ... (остальная часть файла)
Сохраните и выйдите. Проверка синтаксиса теперь должна пройти успешно.
-
Выявление и исправление ошибки пути к шаблону
Теперь, когда синтаксис правильный, попробуйте запустить плейбук.
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
Измените параметр src в задаче Create a test index page from template:
## ... (остальная часть файла)
- 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
## ... (остальная часть файла)
Сохраните и выйдите из редактора.
-
Успешный запуск плейбука
Запустите плейбук снова. Теперь он должен успешно выполнить все задачи.
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