hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

Ansibleの使い方(Handlersセクション編)



1 はじめに

1つのプレイブックは、1つ以上のプレイから構成されます。プレイは、以下のセクションから構成されます。本記事では、Handlersセクションについて動作確認をしてみます。

セクション名 概要
Targetsセクション ターゲットノードへの接続に関する情報を定義します
Tasksセクション 実行する処理を定義します
Handlersセクション notifyディレクティブで指定したタスクを実行するセクションです。サービスの再起動や設定の更新などに使用します
Varsセクション 変数を定義します

2 検証環境

動作検証をするための環境は以下のとおりです。enp1s0はNICの名前です。

                          192.168.122.0/24
control(enp1s0) -------------------------------------(enp1s0) node1
               .220                               .87
ホスト名 役割
control コントロールノードとして動作します。Ansibleをインストールします
node1 ターゲットノードとして動作します

コントロールノード、ターゲットノードのAlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 9.2 (Turquoise Kodkod)

コントロールノード、ターゲットノードのカーネル版数は以下のとおりです。

[root@server ~]# uname -r
5.14.0-284.11.1.el9_2.x86_64

3 事前準備

Ansibleのインストールや公開鍵認証の設定方法などは、Ansibleの使い方(モジュール編) - hana_shinのLinux技術ブログを参照してください。

4 インベントリファイルの作成

インベントリファイルを作成します。

[root@control ~]# cat hosts.ini
[nodes]
node1 ansible_host=192.168.122.220

5 notifyディレクティブの動作確認

notifyディレクティブあり/なしの場合の動作確認をしてみます。

5.1 notifyディレクティブありの場合

Playbookを作成します。このPlaybookは、Tasksセクションでfileモジュールを実行してファイルを作成します。ファイルが作成されると、notifyディレクティブが実行され、それによりHandlersセクション内のdebugモジュールが呼び出されます。debugモジュールが実行されると、指定されたメッセージが表示されます。

[root@control ~]# cat test.yml
- name: Sample Playbook
  hosts: nodes
  tasks:
    - name: Create file
      ansible.builtin.file:
        path: /tmp/test.txt
        state: touch
      notify: Display

  handlers:
    - name: Display
      ansible.builtin.debug:
        msg: The handlers section is called.

Playbookを実行すると、指定したメッセージが表示されることがわかります。

[root@control ~]# ansible-playbook -i hosts.ini test.yml

PLAY [Sample Playbook] **************************************************************************************

TASK [Gathering Facts] **************************************************************************************
ok: [node1]

TASK [Create file] ******************************************************************************************
changed: [node1]

RUNNING HANDLER [Display] ***********************************************************************************
ok: [node1] => {
    "msg": "The handlers section is called."
}

PLAY RECAP **************************************************************************************************
node1                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@control ~]#

5.2 notifyディレクティブなしの場合

Playbookを作成します。このPlaybookでは、リモートノードに対してファイルを作成するタスクを実行します。ただし、notifyディレクティブが定義されていないため、Tasksセクションでファイルを作成しても、Handlersセクションのdebugモジュールは実行されません。

[root@control ~]# vi test.yml
[root@control ~]# cat test.yml
- name: Sample Playbook
  hosts: nodes
  tasks:
    - name: Create file
      ansible.builtin.file:
        path: /tmp/test.txt
        state: touch

  handlers:
    - name: Display
      ansible.builtin.debug:
        msg: The handlers section is called.

Playbookを実行します。notifyディレクティブが定義されていないため、メッセージが表示されないことがわかります。

[root@control ~]# ansible-playbook -i hosts.ini test.yml

PLAY [Sample Playbook] **************************************************************************************

TASK [Gathering Facts] **************************************************************************************
ok: [node1]

TASK [Create file] ******************************************************************************************
changed: [node1]

PLAY RECAP **************************************************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@control ~]#

6 実践編(httpdの起動)

httpdパッケージをインストールしたら、httpdサービスを起動するplaybookを作成します。

[root@control ~]# vi test.yml
[root@control ~]# cat test.yml
- name: Sample Playbook
  hosts: nodes
  tasks:
    - name: Install Apache
      ansible.builtin.dnf:
        name: httpd
        state: present
      notify:
        - Start Apache

  handlers:
    - name: Start Apache
      ansible.builtin.service:
        name: httpd
        state: started

playbookを実行します。

[root@control ~]# ansible-playbook -i hosts.ini test.yml

PLAY [Sample Playbook] *******************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [node1]

TASK [Install Apache] ********************************************************************
changed: [node1]

RUNNING HANDLER [Start Apache] ***********************************************************
changed: [node1]

PLAY RECAP *******************************************************************************
node1                      : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@control ~]#

httpdサービスの状態を確認するとactiveになっていることがわかります。

[root@node1 ~]# systemctl is-active httpd
active