Ansibleテンプレートを作成して構成時間を節約する方法

複数のサーバーと環境の設定を管理することは、Ansibleの利用の大きな利点です。ただし、サーバーごとに構成ファイルが異なる場合はどうなりますか?サーバーや環境ごとに別々の構成ファイルを作成する代わりに、Ansibleのテンプレートを利用することを検討してください。

このチュートリアルでは、Ansibleのテンプレートとは何か、どのように機能し、Ansibleのテンプレートモジュールを使用して時間を大幅に節約する方法を学びます。

前提条件

この投稿はステップバイステップのチュートリアルです。一緒に進める場合は、Ansibleコントローラーホストがあることを確認してください。このチュートリアルではAnsible v2.9.18を使用します。

Ansibleのテンプレートとは何ですか?

時々、テキストファイルをリモートホストに転送する必要があります。これらのテキストファイルは通常、ある種の構成ファイルです。たとえば、単一のサーバーで作業している場合、app.confという構成ファイルを作成する必要があるかもしれません。

その設定ファイルには、ホスト名、IPアドレスなど、そのサーバー固有の情報が含まれている可能性があります。単一のサーバーで作業している場合、Ansibleコントローラー上でファイルを作成し、copyモジュールを使用してサーバーにコピーすることができます。playbook

しかし、複数のWebサーバーがそれぞれ固有の値を必要とする同じ設定ファイルが必要な場合はどうでしょうか?単一のサーバー向けに構築された設定ファイルをすべてのマシンにコピーすることはできません。各マシンには特定のホスト名、IPアドレスなどがあります。Ansibleテンプレートが必要です。

Ansibleテンプレートを使用すると、静的な値ではなく変数を含むテキストファイルを定義し、プレイブック実行時にそれらの変数を置換できます。

Ansibleテンプレートはどのように見えるのでしょうか?

Ansibleテンプレートは、Jinja2テンプレート言語を使用して構築されたテキストファイルで、j2拡張子を持っています。Jinja2テンプレートは、リモートホストに配置したいテキストファイルとまったく同じように見えます。唯一の違いは、静的な値の代わりに、ファイルに変数が含まれていることです。

たとえば、おそらくすべてのウェブサーバーでapp.confという構成ファイルを取得する必要があります。このファイルにはそれぞれのサーバーのIPアドレス、Ansibleホスト、およびAnsibleユーザーへの参照が含まれています。単一のサーバーのapp.confファイルは以下の例のようになります。

my_ip    = "192.168.0.1"
my_host  = "ANSBILECONTROL"
my_user  = "ansible_user"

各アイテムはリモートホストのIP、Ansibleコントローラーのホスト名、およびAnsibleユーザーに依存するため、このファイルを各ウェブサーバーにコピーすることはできません。

これらの値を静的に設定する代わりに、Ansibleテンプレートを使用してこれらの値を定義し、実行時に解釈されてリモートホスト上で置き換えることができます。

app.conf.j2テンプレートファイルの例が以下にあります。これで、各静的な値が両側に二重の中括弧で囲まれた変数で置き換えられていることがわかります。この場合、これらの変数はAnsibleの事実から来ています。

テンプレートファイルは常にJ2ファイル拡張子を持ち、通常はターゲットホストに作成されるファイルと同じ名前を持っています。

my_ip    = "{{ansible_default_ipv4["address"]}}"
my_host  = "{{ansible_host}}"
my_user  = "{{ansible_user}}"

リモートホストでテンプレートファイルはどのように作成されますか?

テンプレートを作成したら、そのテンプレートファイルをリモートホストに転送し、それを実際のテキストファイルに「変換」する必要があります。これを行うには、プレイブックでテンプレートファイルを参照する必要があります。

ほとんどのAnsible管理者は、リモートホストにファイルを転送するためにcopyモジュールを使用しますが、前述のように、これはテンプレートでは実現不可能です。

以下に、プレイブックからの単純な例の参照を示します。このプレイブックは、app.confファイルをプレイブックの対象ホスト全ての/optディレクトリにコピーします。

- name: copy file from local host to remote host
  copy:                               # Declaring Copy Module 
    src: "app.conf"                   # Source Location 
    dest: "/opt/app.conf"             # Destination Location on remote host

では、今、app.conf構成ファイルをテンプレートファイルapp.conf.j2に変換し、前のセクションでカバーしたAnsibleコントローラ上でのテンプレート化が必要です。app.confが変数で置き換えられた実際の値で/optディレクトリに移動する必要があります。

プレイブックにapp.confファイルを/optディレクトリに作成するように指示するには、以下に示すようにcopyリファレンスをtemplateに置き換えるだけです。これを行うと、Ansibleはtemplateモジュールを呼び出してテンプレートを転送し、変数を静的な値で置き換えます。

- name: template file to remote host
  template:                 # Ansible template module
    src: "app.conf.j2"      # This is template src i.e source location 
    dest: "/opt/app.conf"   # Destination of Remote host

上記のタスクがプレイブックで実行されると、Ansibleはapp.conf.j2をリモートホストの/optディレクトリにコピーし、変数を静的な値で置き換えてファイル名をapp.confに変更します。

テンプレートsrcにディレクトリパスを提供すると、Ansibleは//files/ディレクトリでテンプレートを探します。ファイル名のみを提供した場合、Ansibleは代わりに//templates/ディレクトリでテンプレートを探します。

設定ファイルのレンダリング:テンプレート例

では、Ansibleテンプレートを設定し、Ansibleテンプレートモジュールを使用して設定ファイルを動的に生成するデモに飛び込みましょう。この例では、app.confというファイルをサーバーSRV1上の/etcディレクトリに作成しています。

このセクションの手順は、任意のテキストファイルに適用できます。チュートリアルでは、一つの例として設定ファイルを使用します。

1. Ansibleを管理する際に通常使用するユーザーでAnsibleコントローラーホストにSSHで接続します。

2. このチュートリアルのデモファイルを保持するためのフォルダをホームディレクトリに作成し、作業ディレクトリをそれに変更します。

mkdir ~/ansible_template_demo
cd ~/ansible_template_demo

3. 下記のようなテンプレートファイルapp.conf.j2をディレクトリに作成します。

my_ip = {{ansible_default_ipv4["address"]}}
my_host  = {{ansible_host}}
my_user  = {{ansible_user}}

テンプレートには、Ansibleテンプレートモジュール自体に特有の様々な変数も使用できます。

4. 同じディレクトリにmy_playbook.ymlというシンプルなプレイブックを作成します。このプレイブックは/etcディレクトリにapp.confファイルを作成します。


name: Ansible template example 
hosts: myserver 
remote_user: ubuntu   # Using Remote host as ubuntu 
tasks: 
 - name: Create the app.conf configuration file
   template:
     src: "~/ansible_template_demo/app.conf.j2"
     dest: "/etc/app.conf"
   become: true 

5. SRV1リモートホストを対象としてAnsibleプレイブックを呼び出します。

ansible-playbook my_playbook.yml --inventory SRV1
You should then see Ansible execute the playbook.

6. 確認してください/etc/app.conf構成ファイルが存在し、期待される値を持っているかどうか。

confirm the /etc/app.conf configuration file

テンプレートモジュールを使用してファイルのアクセス許可を更新する

テンプレートモジュールの基本を見てきたので、今度は少し高度な内容に移りましょう。このデモでは、以前に表示されたのと同じapp.confファイルを作成しますが、今回はそのファイルの所有者とアクセス許可を設定します。

テンプレートモジュールが作成するファイルのアクセス許可を変更するには、プレイブック内で3つのパラメーターを使用する必要があります:

  • owner – ファイルの所有者
  • group – ファイルが所属するグループ
  • mode – アクセス許可。この文字列は、記号または8進数として表すことができます。

記号モードでは、uは「ユーザー」を表し、gは「グループ」を表し、oは「その他」を表します。

仮定しますが、前のセクションで作成したフォルダ~/ansible_template_demoがまだあるとします。次に、my_playbook.ymlプレイブックを開き、以下の内容に置き換えます。この例では、Ansibleは接続変数を使用して所有者とグループをAnsibleユーザーに設定します。その後、ファイルのパーミッションを0644に設定します。これは以下を表します:

  • 所有者に読み取り/書き込み権限があります
  • グループのユーザーとその他のすべてのユーザーに読み取り権限があります
---
- name: Ansible file permission example
  remote_user: ubuntu
  tasks:
    - name: Create the app.conf configuration file and assign permissions
      template:
          src: "~/ansible_template_demo/app.conf.j2"
          dest: "/etc/app.conf"
	  owner: "{{ ansible_user }}"
          group: "{{ ansible_user }}"
          mode:  0644 ## OR  mode: u=rw, g=w,o=r       
      become: true

利用可能なすべてのテンプレートモジュールパラメータは、Ansibleテンプレートモジュールドキュメントで見つけることができます。

次に、以下に示すようにプレイブックを再度実行します。

ansible-playbook my_playbook.yml --inventory SRV1

今、app.confに期待されるファイルパーミッションが割り当てられていることが確認できます。

app.conf

複数のファイルをテンプレート化するためのループの使用

時には単一のファイルだけでは不十分な場合があります。そのような場合には、ループをテンプレートモジュールとともに使用できます。loopパラメータを使用してループを定義すると、ディレクトリに格納された多くのテキストファイルを追加できます。

仮定しますが、前のセクションで作成したフォルダ~/ansible_template_demoがまだあるとします。すでにapp.conf.j2がそこにあるはずです。

1. 次のようにして、~/ansible_template_demoフォルダ内にapp2.conf.j2という名前の2番目のテンプレートファイルを作成します。

 template_host = "{{ template_host }}"
 template_uid = "{{ template_uid }}"
 template_path = "{{ template_path }}"
 template_fullpath = "{{ template_fullpath }}"
 template_run_date = "{{ template_run_date }}"

2. my_playbook.ymlブックを開いて、以下のYAMLで内容をすべて置換してください。このPlaybookでは、{{item}}変数を使用してループで処理される各テンプレートファイルを表します。その後、loopパラメータは、ループで処理する各テンプレートファイルを定義します。

---
- name: Ansible file permission example 
  remote_user: ubuntu 
  tasks: 
   - name: Create the app.conf configuration file and assign permissions 
     template:   
        src: "~/ansible_template_demo/{{item}}.j2"    # 2つのテンプレートを繰り返し処理
        dest: "/etc/{{item}}"
        owner: "{{ ansible_user }}"   
        group: "{{ ansible_user }}"   
        mode:  0644 ## または mode: u=rw, g=w,o=r
     become: true     
     loop: # テンプレートモジュールにこれらのテンプレートを見つけて処理するように指示します
      - app1.conf 
      - app2.conf 

3. 今、Playbookを再度実行してください。ansible-playbook my_playbook.yml --inventory SRV1

ansible-playbook my_playbook.yml --inventory SRV1
Notice now that Ansible sees each template file and processes them accordingly.

結論

Ansibleテンプレートとテンプレートモジュールは、多くの時間を節約し、リモートホスト上のすべての動的テキストファイルを作成できます。コピーモジュールも似た機能を提供しますが、動的なテキストファイルを作成する必要がある場合は、テンプレートモジュールが便利です。

Source:
https://adamtheautomator.com/ansible-template/