Ansible基礎 #4 - ロール

Last Edited: 12/6/2025

このブログ記事では、Ansibleにおけるロールと他の関連する機能について紹介します。

DevOps

前回の記事では、特定のノードやタスクをターゲットにするためのグループ化とタグ、そしてファイル、サービス、 ユーザーを管理するためのいくつかの便利なモジュールについて説明しました。これらの機能を活用し、 より大規模なプロジェクトの構成を管理するにつれて、プレイブックは必然的に長くなります。 そこで、この記事では、タスクを整理し、柔軟な構成を処理することを可能にするロールやその他の機能について説明します。

ロール

Ansibleにおけるロールは異なるタスクやその他の関連コンポーネントを別々のディレクトリにバンドルし、 それらを異なるホストに割り当てることができます。以下は、ルートのmain.yamlファイルでホストにロールを割り当てる方法を示しています。

main.yaml
- host: all
  become: true
  roles:
    - base
 
- host: web_servers
  become: true
  roles:
    - web_servers
 
- host: db_servers
  become: true
  roles:
    - db_servers

ロールのタスクは、rolesディレクトリの<role_name>/tasksサブディレクトリ内のmain.yamlファイルで整理できます。 例えば、以下に示すように、web_serversロール用のApacheとPHPパッケージをインストールするタスクを定義できます。

roles/web_servers/tasks/main.yaml
- name: install apache and php
  package:
      name:
          - "{{ apache_package }}"
          - "{{ php_package }}"
      state: latest
      update_cache: yes

tasksディレクトリ内のmain.yamlファイルはタスクブックと呼ばれます。これは、タスクのみを定義し、 通常プレイブックで使用されるhostsbecome、その他のフィールドを指定しないためです。 ansible-playbook main.yamlを実行すると、ホストに割り当てられたロールのタスクブックで定義されたタスクが、 ルートプレイブックで定義されたかのように実行されます。

ホスト変数 & ハンドラー & テンプレート

上記のweb_serverロールのタスクは、ホスト変数を置き換えることができるテンプレート機能を利用しています。 前回の記事では、インベントリファイルでホスト変数の値を定義しましたが、より良い整理のために、 以下に示すようにhost_varsディレクトリ内の<host>.yamlファイルでホスト変数を定義することもできます。

253.78.154.178.yaml
apache_package: httpd
php_package: php

また、registerの代わりにnotifyを使用して、notifyを持つ少なくとも1つのタスクで行われた変更が別のタスクを適切にトリガーできるようにすることもできます。 notifyから通知を受けるタスクはハンドラーと呼ばれ、notifyは変数の代わりにハンドラーの名前を使用します。

roles/web_servers/handlers/main.yaml
- name: restart_apache
  service:
    name: "{{ apache_name }}"
    state: restarted

ハンドラーは、上記に示すように、<role_name>/handlersサブディレクトリ内のmain.yamlファイルで整理できます。 同じロール内で定義されたタスクは、notify: restart_apacheを使用してハンドラーをトリガーできます。 さらに、以下に示すようにtemplateモジュールを使用して、他のファイルでもホスト変数のテンプレートを使用できます。

roles/base/tasks/main.yaml
- name: generate ssh_config file from template
  tags: ssh
  template:
    src: "{{ ssh_template_file }}"
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: 0644
  notify: restart_ssh

ssh_template_fileはホスト変数の1つで、その値はroles/base/templatesディレクトリ内のテンプレートファイルの名前です (テンプレートがロール内で定義されている場合、フルパスは不要です)。ssh_configなどのテンプレートは{{ ssh_users }}のような変数を使用し、 対応するホスト変数の値で置き換えることができます。

boostrap.yaml
host_vars
main.yaml
roles/
├── base/
│   ├── handlers
│   ├── tasks
│   └── templates
...

上は、これまで説明してきた機能を活用して、Ansibleを使用して大規模プロジェクトのインフラストラクチャ構成を管理するための1つのファイル構造の例です。 ファイル構造と機能は、プロジェクトの要件に基づいて選択する必要があります。

結論

この記事では、Ansibleの様々なコンポーネントを整理するためのロールとその他の関連機能について説明しました。 Ansibleファイルは、適切なバージョン管理とCI/CDのために、Git/GitHubやTerraformなどの他のDevOpsツールで管理する必要があります。 他にも便利なモジュールや機能が利用可能なので、それらを探索することを強くお勧めします。

リソース