はじめに

Ansible を使い始めたばかりなら、すべてを 1 つの大きな playbook.yml ファイルにまとめても問題ありません。しかし、自動化の内容が数百行に増えると、そのファイルはすぐに整理しづらくなります。

この問題を解決するのが Ansible Role です。

Role は、書類棚のフォルダーのようなものです。1 つの巨大なドキュメントにすべてを詰め込むのではなく、「Web Server」用のタスク、「Database」用のタスクというように、論理的なフォルダーへ分けて管理します。

自動化は、やがてソフトウェアエンジニアリングの一部になります。Playbook が数個のタスクを超えて大きくなると、最初の実行を成功させることだけでなく、構造、命名、再利用性も重要になります。

この実験では、次のことを行います。

  1. ansible-galaxy を使って標準的な Role の構造を作成する。
  2. タスクをその Role に移動する。
  3. シンプルな「マスタープレイブック」から 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 を構造化する「プロフェッショナル」な方法を学びました。

  1. Role を初期化した: ansible-galaxy を使って標準的なフォルダー構造を作成しました。
  2. タスクを定義した: tasks/main.yml の中にロジックを配置しました。
  3. Role を使用した: シンプルで整理されたマスタープレイブック site.yml から Role を呼び出しました。

自動化コードが増えるにつれて、apache、mysql、common など、さまざまな処理用の Role を作成するようになります。これにより、コードを再利用しやすく、読みやすくできます。