Ansibleで静的および動的インベントリを使用する方法-パート4


Ansibleシリーズのこのパート4では、静的および動的インベントリを使用してAnsibleでホストのグループを定義する方法について説明します。

Ansibleでは、Ansibleコントロールノードによって制御される管理対象ホストまたはサーバーは、で説明されているようにホストインベントリファイルで定義されます。ホストインベントリファイルは、管理対象ホストまたはリモートサーバーのホスト名またはIPアドレスで構成されるテキストファイルです。

管理対象ホストは、個別のエントリとして一覧表示することも、後で説明するようにグループ名で分類することもできます。 Ansibleには、静的と動的の2種類のインベントリファイルがあります。

これらのそれぞれを見て、どのように管理できるかを見てみましょう。ここまでで、コントロールノードにAnsibleをインストールし、管理対象ホストへのパスワードなしのSSH接続を構成していることを前提としています。

Ansibleでは、静的インベントリファイルは、ホスト名またはIPアドレスのいずれかを使用してホストグループの下で宣言された管理対象ホストのリストを含むプレーンテキストファイルです。

ホストグループ名は角かっこで囲まれています(例: [group name] )。管理対象ホストのエントリは、後でグループ名の下に、それぞれ独自の行にリストされます。前に説明したように、ホストはホスト名またはIPアドレスのいずれかを使用してリストされます。

[group name]

Host A ip_address 
Host B ip_address
Host c ip_address

説明のために、静的インベントリファイルを作成します。

# mkdir test_lab && cd test_lab
# vim hosts
[webservers]
173.82.115.165

[database_servers]
173.82.220.239

[datacenter:children]
webservers
database_servers

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

上記のインベントリファイルでわかるように、webserversとdatabase_serversの2つのホストグループを作成しました。また、上記のように ':children' サフィックスで示されるホストグループのグループを含むdatacenterという追加のグループを作成しました。

Ansibleでは、ホストのグループをグループ名で配置することもできます。上記のインベントリファイルでは、webserversグループとdatabase_serversグループがデータセンターの下に配置されています。

注:管理対象ホストをホストグループに配置することは必須ではありません。たとえば、ホスト名やIPアドレスを使用して簡単に一覧表示できます。

173.82.202.239
172.82.115.165
load_balancer.pnl.com

ここで、ホストインベントリファイルを参照するためにいくつかのAnsibleコマンドを使用してみましょう。在庫管理の基本的な構文は次のとおりです。

$ ansible {host-pattern} -i /path/of/inventory/file --list-hosts

例えば、

$ ansible all -i /root/test_labs/hosts --list-hosts

または、ワイルドカード文字 * を使用して ‘all’ 引数を置き換えることもできます。

$ ansible * -i /root/test_labs/hosts --list-hosts

グループ内のホストを一覧表示するには、host-patternの代わりにホストグループを指定します。

$ ansible webservers -i /root/test_labs/hosts --list-hosts

構成(特に、サーバーを追加または廃止するときにインベントリファイルが絶えず変化するAWSなどのクラウドセットアップ)では、インベントリファイルで定義されたホストのタブを維持することが実際の課題になります。ホストファイルに戻ってホストのリストをIPアドレスで更新するのは不便になります。

そして、これが動的在庫の出番です。では、動的在庫とは何ですか?動的インベントリは、Python、PHP、またはその他のプログラミング言語で記述されたスクリプトです。これは、仮想サーバーが停止して再起動するとIPアドレスが変更されるAWSなどのクラウド環境で役立ちます。

Ansibleは、Google Compute Engine、Amazon EC2インスタンス、OpenStack、RackSpace、cobblerなどのパブリッククラウドプラットフォーム用のインベントリスクリプトをすでに開発しています。

  • Dynamic inventories do a perfect job of reducing human error as information is gathered using scripts.
  • Minimal effort is required in managing inventories.

選択したプログラミング言語で、独自のカスタマイズされた動的インベントリを作成できます。適切なオプションが渡されると、インベントリはJSON形式を返す必要があります。

動的インベントリの作成に使用されるスクリプトは、Ansibleが使用できるように実行可能にする必要があります。

動的インベントリスクリプト内のホストに関する情報を取得するには、実行するだけです。

# ./script --list 

前に指摘したように、出力は以下の形式のJSONである必要があります。

  • A list of managed hosts per group
  • A dictionary of variables
  • Hosts and hostvars
{
  "webservers": {
    "hosts": [
      "webserver1.example.com",
      "webserver2.example.com"
    ],
    "vars": {}
  },
  "database_servers": {
    "hosts": [
      "mysql_db1",
      "mysql_db2"
    ],
    "vars": {}
  },
  "_meta": {
    "hostvars": {
      "mysql_db2": {},
      "webserver2.example.com": {},
      "webserver1.example.com": {}, 
      "mysql_db1": {}
    }
  }
}

この記事では、静的インベントリと動的インベントリの両方を作成する方法を示しました。要約すると、静的インベントリファイルは、番号とIPアドレスがほぼ一定のままである管理対象ホストまたはリモートノードのリストを含むプレーンテキストファイルです。

一方、動的ホストファイルは、新しいホストを追加したり、古いホストを廃止したりすると、変化し続けます。新しいホストシステムを停止および開始すると、ホストのIPアドレスも動的になります。このチュートリアルが参考になることを願っています。