AnsiblePlaybookでハンドラーを定義して使用する方法
一言で言えば、ハンドラーは、 notify
指令。 ハンドラーは、すべてのタスクが終了すると、プレイの最後に実行されます。
Ansibleでは、ハンドラーは通常、サービスの開始、リロード、再起動、および停止に使用されます。 プレイブックに構成ファイルの変更が含まれている場合、変更を有効にするためにサービスを再起動する必要がある可能性が高くなります。 この場合、そのサービスのハンドラーを定義し、 notify
そのサービスハンドラーを必要とするすべてのタスクのディレクティブ。
このシリーズの前のセクションでは、テンプレートを使用してデフォルトのNginxページをカスタムHTMLランディングページに置き換える方法を説明しました。 実際には、Nginx Webサーバーをセットアップするときに、新しいサーバーブロックファイルをに含める可能性があります。 sites-available
ディレクトリ、シンボリックリンクの作成、またはサーバーのリロードまたは再起動が必要な設定の変更。
このようなシナリオを考慮すると、Nginxサービスを再起動するハンドラーは次のようになります。
...
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
このハンドラーをトリガーするには、 notify
Nginxサーバーでの再起動が必要なタスクのディレクティブ。
次のプレイブックは、組み込みのAnsibleモジュール replace を使用して、Nginxの構成ファイルのデフォルトのドキュメントルートを置き換えます。 このモジュールは、によって定義された正規表現に基づいてファイル内のパターンを検索します。 regexp
、次に、見つかった一致を、によって定義されたコンテンツに置き換えます。 replace
. 次に、タスクは通知をに送信します Restart Nginx
できるだけ早く再起動するためのハンドラー。 つまり、再起動をトリガーする回数は関係ありません。再起動は、すべてのタスクの実行がすでに終了し、ハンドラーの実行が開始された場合にのみ発生します。 さらに、一致するものが見つからない場合、システムに変更は加えられないため、ハンドラーはトリガーされません。
と呼ばれる新しいファイルを作成します playbook-12.yml
あなたの中で ansible-practice
ディレクトリ:
- nano ~/ansible-practice/playbook-12.yml
新しいプレイブックファイルに次の行を追加します。
---
- hosts: all
become: yes
vars:
page_title: My Second Landing Page
page_description: This is my second landing page description.
doc_root: /var/www/mypage
tasks:
- name: Install Nginx
apt:
name: nginx
state: latest
- name: Make sure new doc root exists
file:
path: "{{ doc_root }}"
state: directory
mode: '0755'
- name: Apply Page Template
template:
src: files/landing-page.html.j2
dest: "{{ doc_root }}/index.html"
- name: Replace document root on default Nginx configuration
replace:
path: /etc/nginx/sites-available/default
regexp: '(\s+)root /var/www/html;(\s+.*)?$'
replace: \g<1>root {{ doc_root }};\g<2>
notify: Restart Nginx
- name: Allow all access to tcp port 80
ufw:
rule: allow
port: '80'
proto: tcp
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
完了したら、ファイルを保存して閉じます。
ハンドラーを使用するときに覚えておくべき重要なことの1つは、ハンドラーを定義するタスクが notify
トリガーにより、サーバーが変更されます。 このプレイブックを考慮に入れて、初めて実行するとき replace
タスクはNginx構成ファイルを変更するため、再起動が実行されます。 ただし、後続の実行では、置き換えられる文字列がファイルに存在しなくなるため、タスクによって変更が発生したり、ハンドラーの実行がトリガーされたりすることはありません。
提供することを忘れないでください -K
このプレイブックを実行する場合は、オプションが必要です。 sudo
権限:
- ansible-playbook -i inventory playbook-12.yml -u sammy -K
OutputBECOME password:
PLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.10]
TASK [Install Nginx] ************************************************************************************
ok: [203.0.113.10]
TASK [Make sure new doc root exists] ********************************************************************
changed: [203.0.113.10]
TASK [Apply Page Template] ******************************************************************************
changed: [203.0.113.10]
TASK [Replace document root on default Nginx configuration] *********************************************
changed: [203.0.113.10]
TASK [Allow all access to tcp port 80] ******************************************************************
ok: [203.0.113.10]
RUNNING HANDLER [Restart Nginx] *************************************************************************
changed: [203.0.113.10]
PLAY RECAP **********************************************************************************************
203.0.113.10 : ok=7 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
出力を見ると、プレイが終了する直前に「RestartNginx」ハンドラーが実行されていることがわかります。 ブラウザにアクセスしてサーバーのIPアドレスにアクセスすると、次のページが表示されます。
このシリーズの次の最後のパートでは、すべての点を接続し、静的HTMLWebサイトをホストするためのリモートNginxサーバーのセットアップを自動化するプレイブックをまとめます。