Ansible プレイブックに変数を渡す方法

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

はじめに

Ansible は、IT インフラストラクチャ管理を合理化することができる強力な自動化ツールです。Ansible の重要な機能の 1 つは、変数を扱う能力であり、これによりプレイブックをより動的かつ適応性の高いものにすることができます。このチュートリアルでは、基本的なことからより高度なテクニックまで、Ansible プレイブックに変数を渡す方法を探り、自動化ワークフローを最適化する手助けをします。

Ansible 変数の紹介

Ansible は、インフラストラクチャとアプリケーションを簡単に管理できる強力な IT 自動化ツールです。Ansible の重要な機能の 1 つは、変数を扱う能力です。これらの変数は、プレイブック内でデータを格納および操作するために使用されます。

Ansible の変数は、以下を含む様々なレベルで定義できます。

ホストレベルの変数

これらは、特定のホストまたはホストグループに固有の変数です。インベントリファイルまたは個別の変数ファイルで定義できます。

## inventory.yml
all:
  hosts:
    webserver1:
      ansible_host: 192.168.1.100
      app_version: 2.0
    webserver2:
      ansible_host: 192.168.1.101
      app_version: 2.1

グループレベルの変数

これらは、ホストグループに適用される変数です。インベントリファイルまたは個別の変数ファイルで定義できます。

## group_vars/webservers.yml
app_name: MyApp
db_host: 10.0.0.50

プレイレベルの変数

これらは、プレイブック内の特定のプレイに固有の変数です。プレイ自体の中で定義できます。

- hosts: webservers
  vars:
    app_port: 8080
    log_level: info

タスクレベルの変数

これらは、プレイ内の特定のタスクに固有の変数です。タスク自体の中で定義できます。

- name: Install package
  apt:
    name: "{{ package_name }}"
    state: present
  vars:
    package_name: nginx

これらの異なるタイプの変数を扱う方法を理解することは、Ansible プレイブックを効果的に管理し、インフラストラクチャを自動化するために重要です。

Ansible プレイブックに変数を渡す

ここでは、Ansible 変数の基本的な理解があることを前提に、Ansible プレイブックに変数を渡す方法を探ります。これを行う方法はいくつかあります。

コマンドライン引数

ansible-playbook コマンドを実行する際に、-e または --extra-vars オプションを使用して、プレイブックに変数を渡すことができます。

ansible-playbook site.yml -e "app_version=2.2 db_host=10.0.0.60"

変数ファイル

別の YAML ファイルで変数を定義し、--extra-vars オプションを使用してプレイブックに渡すことができます。

ansible-playbook site.yml --extra-vars "@vars.yml"
## vars.yml
app_name: MyApp
app_version: 2.2
db_host: 10.0.0.60

インベントリ変数

前のセクションで述べたように、インベントリファイルで変数を定義すると、それらの変数はプレイブックで使用できるようになります。

## inventory.yml
all:
  hosts:
    webserver1:
      ansible_host: 192.168.1.100
      app_version: 2.0
    webserver2:
      ansible_host: 192.168.1.101
      app_version: 2.1

プレイブック変数

vars キーワードを使用して、プレイブック内で変数を定義することもできます。

- hosts: webservers
  vars:
    app_name: MyApp
    app_version: 2.2
    db_host: 10.0.0.60
  tasks:
    - name: Print variables
      debug:
        msg: "App name: {{ app_name }}, App version: {{ app_version }}, DB host: {{ db_host }}"

これらの異なる方法で Ansible プレイブックに変数を渡すことを理解することで、自動化をより柔軟にし、さまざまな環境や要件に適応させることができます。

Ansible における高度な変数処理

Ansible プレイブックに変数を渡す基本的な方法は直感的ですが、Ansible は変数を扱うためのより高度な機能も提供しています。これらのいくつかを見てみましょう。

変数の優先順位

Ansible は変数に明確な優先順位が定義されており、複数の変数ソースを扱う際に理解することが重要です。優先順位は高い方から低い方へ次の通りです。

  1. コマンドラインパラメータ(例:-e "var=value"
  2. タスクパラメータ(例:タスク内の vars
  3. インクルードパラメータ(例:インクルードされたファイル内の vars
  4. ブロックパラメータ(例:ブロック内の vars
  5. プレイパラメータ(例:プレイ内の vars
  6. ロールのデフォルト変数(例:defaults/main.yml
  7. インベントリ変数(例:inventory.yml 内)
  8. ホストファクト(例:setup モジュールによって収集される)
  9. ロールおよびインクルード変数(例:vars/main.yml
  10. 設定ファクト(例:set_fact モジュールを使用する)

この優先順位を理解することで、競合を解決し、変数が意図したとおりに使用されることを確認できます。

変数フィルターとテスト

Ansible は、変数を操作および検証するために使用できる豊富な Jinja2 フィルターとテストを提供しています。いくつかの例を挙げると、

  • default フィルター: {{ my_var | default('default_value') }}
  • to_json フィルター: {{ my_dict | to_json }}
  • is_defined テスト:{% if my_var is defined %}...{% endif %}
  • is_number テスト:{% if my_var is number %}...{% endif %}

これらは複雑な変数シナリオを扱うのに非常に役立ちます。

Vault で暗号化された変数

Ansible の Vault 機能を使用すると、パスワードや API キーなどの機密変数を暗号化し、安全に保存してプレイブックで使用することができます。これはインフラストラクチャ自動化におけるセキュリティ維持に特に重要です。

## vars.yml
db_password: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  32313633326533343161663036623463
  3163303236303836343239653533326134
  3134613161623464

これらの高度な変数処理技術を理解することで、Ansible 自動化を次のレベルに引き上げ、より堅牢で安全かつ組織のニーズに適応したものにすることができます。

まとめ

この Ansible チュートリアルでは、単純な変数の割り当てからより複雑な変数処理技術まで、Ansible プレイブックに変数を渡す方法を学びました。変数管理を習得することで、変化するインフラストラクチャのニーズに適応する柔軟で動的な Ansible プレイブックを作成することができます。これらの戦略を適用して、Ansible を活用した自動化を強化し、IT 運用を次のレベルに引き上げましょう。