このステップでは、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 モジュールを使用します。また、2 つの新しいエラーを導入します。引用符で囲まれていない 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