変数とテンプレート

AnsibleBeginner
オンラインで実践に進む

はじめに

100 台のサーバーを管理する場合、すべてを完全に同じにする必要はありません。各サーバーには、それぞれ固有のホスト名、IP アドレス、または特定の設定が必要になることがあります。

Ansible では、変数とテンプレートを使ってこの問題に対応します。

  • 変数:データ用のプレースホルダーです(port: 8080 や server_name: "web-01" など)。
  • テンプレート:「穴」が空いたテキストファイルです。Ansible はその穴を変数で埋め、最終的なファイルを作成します。

この組み合わせにより、自動化を繰り返し作業ではなく、再利用可能なものにできます。多くのホストで共通の構造を 1 つだけ保持し、環境やマシンごとに挿入するデータを変更できます。

Ansible は、Jinja2 というテンプレート言語を使用します。指定した変数に応じて異なる最終設定ファイルを 1 つのテンプレートから生成できるため、自動化をより再利用しやすくなります。

そして、次のように変換されます。Welcome to web-01

この実験では、変数とテンプレートを使って、サーバー用のカスタム HTML Web ページを生成します。

テンプレートを作成する

まず、ファイルを整理します。Ansible は templates という名前の専用フォルダー内でテンプレートを探します。

この規約は、Ansible の設計思想の一部です。自動化の内容を読みやすくし、チーム間で共有しやすくするために、予測しやすいディレクトリ構成を使用します。

プロジェクトフォルダー内に、このディレクトリを作成します。

mkdir -p ~/project/templates

次に、テンプレートファイルを作成します。テンプレートファイルの末尾には、通常 .j2(Jinja2 を表します)を付けます。

index.html.j2 を作成するために nano を開きます。

nano ~/project/templates/index.html.j2

次の HTML コードを追加します。{{ }} という特殊な括弧に注目してください。これは Ansible に「ここに変数を入れる」と指示する記法です。

<html>
  <head>
    <title>{{ page_title }}</title>
  </head>
  <body>
    <h1>Welcome to {{ inventory_hostname }}</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

変数について

  • {{ page_title }}:これはカスタム変数です。後で Playbook に値を定義します。
  • {{ inventory_hostname }}:これはマジック変数です。Ansible が自動的に認識します。現在 Ansible が処理しているサーバーの名前で、この実験では localhost です。

この 2 種類の値を区別すると便利です。変数の中には自分で定義するものがあり、Ansible がインベントリと実行コンテキストから自動的に提供するものもあります。

保存して終了します(Ctrl+X、Y、Enter)。

変数を定義する

次に、このテンプレートを使用する Playbook が必要です。Playbook で、カスタム変数 page_title の値を定義します。

playbook.yml という名前の新しいファイルを作成します。

nano ~/project/playbook.yml

まず、Play と変数を定義します。

---
- name: Deploy Web Page
  hosts: localhost
  vars:
    page_title: "My LabEx Web Server"
  tasks:

コードについて

  • vars::変数を一覧にして定義するセクションです。
  • page_title: "...":テンプレート内で {{ page_title }} が見つかった場合に、Ansible がそれを "My LabEx Web Server" に置き換えるよう指定しています。

次のステップで使用するため、ファイルは開いたままにしておきます。

Template モジュールを使用する

次に、実際の処理を行うタスクを追加します。ここでは template モジュールを使用します。このモジュールは .j2 ファイルを読み込み、変数を埋め込み、その結果をサーバーに保存します。

実際の環境では、template モジュールを使って多くの設定ファイルをデプロイします。静的なファイルをコピーするのではなく、共通のパターンからホスト固有のファイルを生成します。

playbook.yml にタスクを追加します。インデントに注意してください。

---
- name: Deploy Web Page
  hosts: localhost
  become: yes
  vars:
    page_title: "My LabEx Web Server"
  tasks:
    - name: Create index.html from template
      template:
        src: templates/index.html.j2
        dest: /var/www/html/index.html
        mode: "0644"

コードについて

  • template::使用するモジュールです。
  • src:ソースファイルです。プレースホルダーを含むテンプレートを指定します。
  • dest:保存先です。最終的な HTML ファイルを配置する場所を指定します。
  • mode: "0644":Web サーバーがファイルを読み取れるように、ファイルの権限を設定します。
  • become: yes:/var/www/html への書き込みには root 権限が必要なため追加しています。

ファイルを保存して終了します。

デプロイして確認する

Playbook を実行して、処理結果を確認します。

Playbook を実行します。

ansible-playbook -i inventory playbook.yml

正常に実行されると、changed というステータスが表示されます。

次に、Ansible が作成した最終ファイルを確認します。プレースホルダーがなくなり、実際のテキストに置き換わっているはずです。

生成された HTML ファイルを表示します。

cat /var/www/html/index.html

期待される結果:

<html>
  <head>
    <title>My LabEx Web Server</title>
  </head>
  <body>
    <h1>Welcome to localhost</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

確認できましたか。{{ page_title }} は "My LabEx Web Server" に、{{ inventory_hostname }} は "localhost" に変換されています。

まとめ

この実験では、設定を動的にする方法を学びました。

  1. テンプレート:{{ placeholders }} を含む .j2 ファイルを作成しました。
  2. 変数:Playbook の vars セクションで値を定義しました。
  3. マジック変数:Ansible が自動的に提供する inventory_hostname を使用しました。
  4. Template モジュール:template モジュールを使い、変数とテンプレートを組み合わせて最終的な設定ファイルを作成しました。

この強力な機能を使えば、1 つのテンプレートで何千台ものサーバーを設定できます。各サーバーには、それぞれ固有の情報を適用できます。