はじめに
Ansible を使い始めたばかりなら、すべてを 1 つの大きな playbook.yml ファイルにまとめても問題ありません。しかし、自動化の内容が数百行に増えると、そのファイルはすぐに整理しづらくなります。
この問題を解決するのが Ansible Role です。
Role は、書類棚のフォルダーのようなものです。1 つの巨大なドキュメントにすべてを詰め込むのではなく、「Web Server」用のタスク、「Database」用のタスクというように、論理的なフォルダーへ分けて管理します。
自動化は、やがてソフトウェアエンジニアリングの一部になります。Playbook が数個のタスクを超えて大きくなると、最初の実行を成功させることだけでなく、構造、命名、再利用性も重要になります。
この実験では、次のことを行います。
ansible-galaxyを使って標準的な Role の構造を作成する。- タスクをその Role に移動する。
- シンプルな「マスタープレイブック」から Role を実行する。
拡張性のある自動化には、整理された構造が必要です。コードベースが大きくなるほど、最初の実行を成功させることと同じくらい、コードの整理が重要になります。
Role を初期化する
まず、フォルダー構造を作成します。すべてのフォルダーを手動で作成することもできますが、Ansible にはそれを自動で行う ansible-galaxy というツールが用意されています。
この標準レイアウトを使うと、タスク、変数、ファイル、テンプレート、ハンドラーを配置する場所が Role ごとに決まります。構造を統一しておけば、チーム内でお互いの自動化コードを読みやすくなります。
プロジェクトディレクトリへ移動します。
cd ~/project
Role を格納するディレクトリを作成します。
mkdir roles
次に、myrole という名前の新しい Role を作成します。これは、自動化処理用の「パッケージ」または「モジュール」を作成するイメージです。
ansible-galaxy init roles/myrole
作成された内容を確認します。
ls -R roles/myrole
tasks、handlers、vars など、多数のフォルダーが表示されます。
- tasks: インストール、起動、コピーなど、実際に実行する手順を配置します。
- vars: 変数を配置します。
- files: 画像などの静的ファイルを配置します。
この実験では、tasks フォルダーに注目します。
Role のタスクを定義する
次に、Role に処理を追加します。Role のメインタスクリストは tasks/main.yml に記述します。
ここでは、ディレクトリ構造を確認するための便利なユーティリティである tree コマンドをインストールするタスクを作成します。
Role のタスクファイルを開きます。
nano roles/myrole/tasks/main.yml
次の内容を追加します。ここでは、すでに tasks ファイルの中にいるため、先頭に tasks: を記述しない点に注意してください。
---
## tasks file for roles/myrole
- name: Ensure tree is installed
apt:
name: tree
state: present
become: yes
重要な違い: 通常の Playbook には tasks: セクションがあります。一方、Role ではこのファイル自体がタスクのリストなので、タスクを直接記述し始めます。
この分離によって、Role の再利用性が高まります。Role は自動化ロジックの特定の部分を担当し、Playbook はその Role をいつ、どこで組み込むかを決定します。
保存して終了します。
マスタープレイブックを作成する
Role は作成できましたが、Role はそれだけでは実行されません。Role を呼び出す「マスタープレイブック」が必要です。
メインのプロジェクトフォルダーに site.yml という名前のファイルを作成します。
nano ~/project/site.yml
この Playbook は非常に短いものになります。実行する内容は、「これらのホストで、この Role を実行する」という指定だけです。
この時点で、Playbook はすべての詳細を格納するものではなく、処理を組み立てるオーケストレーターになります。これが、Role を使うことで実現する設計上の変化です。
---
- hosts: localhost
connection: local
roles:
- myrole
コードの説明:
roles::tasks:リストの代わりに、Role のリストを指定します。- myrole: Ansible はroles/ディレクトリ内にあるmyroleという名前のフォルダーを探し、その中のtasks/main.ymlに記述された内容を実行します。
保存して終了します。
検証して実行する
実行する前に、入力ミスがないことを確認します。Ansible には、組み込みの構文チェッカーがあります。
次のコマンドを実行します。
ansible-playbook -i inventory --syntax-check site.yml
問題がなければ、playbook: site.yml とだけ表示されます。
エラーが表示された場合は、メッセージを注意深く確認してください。通常は、インデントが間違っている正確な行番号が示されます。
次に、Playbook を実際に実行します。
ansible-playbook -i inventory site.yml
Role 内のタスクが実行され、次のような表示が出ることを確認します。
TASK [myrole : Ensure tree is installed] ... changed
まとめ
この実験では、Ansible を構造化する「プロフェッショナル」な方法を学びました。
- Role を初期化した:
ansible-galaxyを使って標準的なフォルダー構造を作成しました。 - タスクを定義した:
tasks/main.ymlの中にロジックを配置しました。 - Role を使用した: シンプルで整理されたマスタープレイブック
site.ymlから Role を呼び出しました。
自動化コードが増えるにつれて、apache、mysql、common など、さまざまな処理用の Role を作成するようになります。これにより、コードを再利用しやすく、読みやすくできます。


