はじめに
この実験では、Ansible Roles を学びます。これは、Ansible コードをモジュール化して再利用可能な方法で整理および構造化するための強力な機能です。Roles は、既知のファイル構造に基づいて、関連する変数、ファイル、タスク、ハンドラ、およびその他の Ansible アーティファクトを自動的に読み込む方法を提供します。この実験が終了すると、Ansible Roles を作成、使用、および整理する方法を理解しており、それにより、より保守可能で拡張可能な自動化コードを記述できるようになります。
Ansible 役割の構造を理解する
独自の役割を作成する前に、Ansible Role の構造を理解しましょう。
Ansible Role は、8 つの主要な標準ディレクトリで構成された定義済みのディレクトリ構造を持っています。各ディレクトリには、関連するコンテンツを含む main.yml ファイルが必要です。以下は各ディレクトリの概要です。
tasks- 役割によって実行される主要なタスクのリストが含まれています。handlers- この役割内またはこの役割外で使用できるハンドラが含まれています。defaults- 役割のデフォルト変数。vars- 役割のその他の変数。files- この役割を通じて展開できるファイルが含まれています。templates- この役割を通じて展開できるテンプレートが含まれています。meta- この役割のメタデータを定義します。tests- 役割のテストが含まれています。
まずは簡単な役割構造を作成しましょう。まず、プロジェクトディレクトリに移動します。
cd ~/project
次に、役割用のディレクトリを作成します。
mkdir -p roles/example_role
cd roles/example_role
mkdir コマンドの -p フラグは、必要に応じて親ディレクトリを作成します。
次に、役割の基本構造を作成します。
mkdir {tasks,handlers,defaults,vars,files,templates,meta}
このコマンドは、役割に必要なすべてのディレクトリを一括で作成します。bash で複数のディレクトリを一度に作成する便利なショートカットです。
次に、tasks ディレクトリに main.yml ファイルを作成します。
nano tasks/main.yml
このファイルに以下のコンテンツを追加します。
---
- name: Print a message
debug:
msg: "This is a task from our example role!"
nano エディタを保存して終了します(Ctrl+X、次に Y、次に Enter)。
これで、単純なタスクを持つ基本的な役割構造が作成されました。次の手順では、これを拡張して役割の使い方を学びます。
役割の拡張
基本的な役割構造ができたので、典型的な Ansible 役割のさらに多くのコンポーネントを含めて拡張しましょう。変数、ハンドラ、テンプレートを追加します。
まず、デフォルト変数を追加しましょう。defaults ディレクトリに main.yml ファイルを作成します。
nano defaults/main.yml
以下のコンテンツを追加します。
---
example_variable: "This is a default value"
これは example_variable のデフォルト値を設定し、役割を使用する際に上書きできます。
次に、ハンドラを作成します。handlers ディレクトリに main.yml ファイルを作成します。
nano handlers/main.yml
以下のコンテンツを追加します。
---
- name: Restart example service
debug:
msg: "This would restart a service in a real scenario"
実際のシナリオでは、このハンドラはサービスを再起動する場合がありますが、この例ではメッセージを表示するだけです。
次に、テンプレートを作成します。templates ディレクトリに example_template.j2 という名前のファイルを作成します。
nano templates/example_template.j2
以下のコンテンツを追加します。
This is an example template.
The value of example_variable is: {{ example_variable }}
このテンプレートは、Jinja2 構文を使用して example_variable の値を含めています。
最後に、新しいコンポーネントを使用するように tasks/main.yml を更新しましょう。
nano tasks/main.yml
既存のコンテンツを以下のものに置き換えます。
---
- name: Print a message
debug:
msg: "This is a task from our example role!"
- name: Use our variable
debug:
msg: "The value of example_variable is: {{ example_variable }}"
- name: Create a file from our template
template:
src: example_template.j2
dest: /tmp/example_file.txt
notify: Restart example service
この更新されたタスクリストは、現在、変数を使用し、テンプレートからファイルを作成し、ハンドラに通知しています。
Playbook でのロールの使用方法
ロールを作成したので、それを Playbook で使用してみましょう。まず、プロジェクトのルートディレクトリに戻ります。
cd ~/project
Playbook を作成する前に、localhost を指定する簡単なインベントリファイルを作成しましょう。
nano inventory.ini
インベントリファイルに以下の内容を追加します。
[local]
localhost ansible_connection=local
このインベントリファイルは、ローカル接続を使用する localhost をメンバーとする local というグループを定義します。
次に、use_role.yml という名前の新しい Playbook ファイルを作成します。
nano use_role.yml
以下の内容を追加します。
---
- name: Use our example role
hosts: localhost
roles:
- example_role
この Playbook は、単純に example_role を localhost に適用します。
それでは、この Playbook を実行しましょう。
ansible-playbook -i inventory.ini use_role.yml
ロールで定義したタスクの実行を示す出力が表示されるはずです。
何が起こったのかを分解してみましょう。
- Ansible は
rolesディレクトリでexample_roleという名前のロールを探しました。 - ロールを見つけ、
tasks/main.ymlで定義されたタスクを実行しました。 defaults/main.ymlで設定したexample_variableのデフォルト値を使用しました。- テンプレートを使用して
/tmp/example_file.txtにファイルを 1 つ作成しました。 - 最後に、デバッグメッセージを出力したハンドラを呼び出しました。
これにより、関連するタスク、変数、ファイルをロールでパッケージ化し、Ansible コードをより整理され、再利用可能にできることがわかります。
役割変数のオーバーライド
Ansible 役割の強力な機能の 1 つは、デフォルト変数を上書きできることです。これにより、さまざまなシナリオで使用できる柔軟な役割を作成できます。
example_variable を上書きする新しいプレイブックを作成しましょう。override_role_var.yml という名前のファイルを作成します。
nano override_role_var.yml
以下のコンテンツを追加します。
---
- name: Use our example role with a custom variable
hosts: localhost
vars:
example_variable: "This is a custom value"
roles:
- example_role
このプレイブックでは、役割を適用する前に example_variable をカスタム値に設定しています。
次に、このプレイブックを実行しましょう。
ansible-playbook -i inventory.ini override_role_var.yml
タスクが現在、デフォルト値ではなく example_variable のカスタム値を使用することがわかるはずです。
これは、妥当なデフォルト値で役割を作成することができる一方で、必要に応じてその動作をカスタマイズする柔軟性も備えていることを示しています。
役割の依存関係
Ansible の役割は他の役割に依存することができます。これにより、より単純な役割を組み合わせて、より複雑な役割を作成できます。example_role に依存する新しい役割を作成しましょう。
まず、新しい役割構造を作成します。
cd ~/project/roles
mkdir -p dependent_role/{tasks,meta}
次に、役割の依存関係を定義します。meta ディレクトリに main.yml ファイルを作成します。
nano dependent_role/meta/main.yml
以下のコンテンツを追加します。
---
dependencies:
- role: example_role
これは、dependent_role が example_role に依存することを指定しています。
次に、dependent_role にタスクを追加します。tasks ディレクトリに main.yml ファイルを作成します。
nano dependent_role/tasks/main.yml
以下のコンテンツを追加します。
---
- name: Task from dependent role
debug:
msg: "This task is from the dependent role"
次に、dependent_role を使用するためのプレイブックを作成します。プロジェクトのルートに戻ります。
cd ~/project
nano use_dependent_role.yml
以下のコンテンツを追加します。
---
- name: Use our dependent role
hosts: localhost
roles:
- dependent_role
最後に、このプレイブックを実行します。
ansible-playbook -i inventory.ini use_dependent_role.yml
example_role と dependent_role の両方のタスクが実行されることがわかるはずです。これは、役割の依存関係が単純な役割を組み合わせることで、より複雑な自動化を構築できることを示しています。
まとめ
この実験では、Ansible コードを整理して構造化するための強力な機能である Ansible Roles について学びました。以下が主な要点です。
- Ansible Roles は、既知のファイル構造に基づいて、関連する変数、ファイル、タスク、ハンドラ、その他の Ansible アーティファクトを自動的に読み込む方法を提供します。
- 役割の基本構造には、タスク、ハンドラ、デフォルト、変数、ファイル、テンプレート、およびメタ情報用のディレクトリが含まれます。
- 役割を使用する際に上書きできるデフォルト変数を設定できるため、柔軟性と再利用性が備えられています。
- 役割内でテンプレートを使用して、動的なコンテンツを持つファイルを生成できます。
- 役割はプレイブックに簡単に含めることができ、1 行で複雑な構成を適用できます。
- プレイブックで役割変数を上書きできるため、役割自体を変更することなく役割の動作をカスタマイズできます。
- 役割は他の役割に依存することができ、単純な役割を組み合わせることでより複雑な自動化を構築できます。
Ansible Roles は、保守可能で再利用可能な Ansible コードを記述するための基本的な概念です。複雑な自動化タスクをより小さく、管理しやすい部分に分割し、組織全体でのコードの再利用を促進します。Ansible を使い続けるうちに、役割が自動化ツールキットの必須ツールになること、特に大規模で複雑なプロジェクトではそうなることに気付くでしょう。


