序章
Ansibleは、リモートサーバーのセットアップと保守のタスクを容易にする最新の構成管理ツールであり、ユーザーを迅速に稼働させることを目的とした最小限の設計を備えています。 Ansibleは、インベントリファイルを使用して、インフラストラクチャの一部であるホストと、コマンドやプレイブックを実行するためにそれらに到達する方法を追跡します。
環境とプロジェクトのニーズに応じて、Ansibleインベントリファイルを設定する方法は複数あります。 このガイドでは、インベントリファイルを作成し、サーバーをグループとサブグループに編成する方法、ホスト変数を設定する方法、およびパターンを使用してホストごとおよびグループごとにAnsibleコマンドとプレイブックの実行を制御する方法を示します。
前提条件
このガイドに従うには、次のものが必要です。
- 1つのAnsibleコントロールノード:SSHキーを使用してAnsibleホストに接続するようにAnsibleがインストールおよび構成されたUbuntu20.04マシン。 サーバーの初期設定ガイドで説明されているように、コントロールノードにsudo権限とファイアウォールが有効になっている通常のユーザーがいることを確認してください。 Ansibleをセットアップするには、 Ubuntu20.04にAnsibleをインストールして構成する方法に関するガイドに従ってください。
- 2つ以上のAnsibleホスト:2つ以上のリモートUbuntu20.04サーバー。
ステップ1—カスタムインベントリファイルを作成する
インストール時に、Ansibleは通常/etc/ansible/hostsにあるインベントリファイルを作成します。 これは、プレイブックまたはコマンドの実行中に、カスタムインベントリファイルが-iオプションで提供されていない場合にAnsibleによって使用されるデフォルトの場所です。
このファイルは問題なく使用できますが、プロジェクトごとのインベントリファイルを使用することは、コマンドとプレイブックを実行するときにサーバーが混在しないようにするための良い方法です。 プロジェクトごとのインベントリファイルがあると、プロジェクトのコードリポジトリ内にインベントリファイルを含めることができ、共同作業者とプロビジョニング設定を共有することも容易になります。
開始するには、ホームフォルダーにアクセスし、Ansibleファイルを保持するための新しいディレクトリを作成します。
cd ~ mkdir ansible
そのディレクトリに移動し、選択したテキストエディタを使用して新しいインベントリファイルを開きます。 ここでは、nanoを使用します。
cd ansible nano inventory
機能インベントリファイルを設定するには、1行に1台のサーバーを含むノードのリストで十分です。 ホスト名とIPアドレスは交換可能です。
〜/ ansible / Inventory
203.0.113.111 203.0.113.112 203.0.113.113 server_hostname
インベントリファイルを設定したら、ansible-inventoryコマンドを使用して、Ansibleインベントリに関する情報を検証および取得できます。
ansible-inventory -i inventory --list
Output{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"ungrouped"
]
},
"ungrouped": {
"hosts": [
"203.0.113.111",
"203.0.113.112",
"203.0.113.113",
"server_hostname"
]
}
}
インベントリ内にグループを設定していませんが、出力には、Ansibleによって自動的に推測される2つの異なるグループallとungroupedが表示されます。 名前が示すように、allは、それらがどのように編成されているかに関係なく、インベントリファイルからすべてのサーバーを参照するために使用されます。 ungroupedグループは、グループ内にリストされていないサーバーを参照するために使用されます。
カスタムインベントリを使用したコマンドとプレイブックの実行
カスタムインベントリファイルを使用してAnsibleコマンドを実行するには、次のように-iオプションを使用します。
ansible all -i inventory -m ping
これにより、カスタムインベントリファイルにリストされているすべてのホストでpingモジュールが実行されます。
同様に、カスタムインベントリファイルを使用してAnsibleプレイブックを実行する方法は次のとおりです。
ansible-playbook -i inventory playbook.yml
注:ノードへの接続方法の詳細については、Ansibleの使用方法ガイドを参照してください。接続オプションの詳細が示されています。
これまで、基本的なインベントリを作成する方法と、コマンドやプレイブックを実行するためにそれを使用する方法を見てきました。 次のステップでは、ノードをグループとサブグループに編成する方法を説明します。
ステップ2—サーバーをグループとサブグループに編成する
インベントリファイル内で、サーバーをさまざまなグループおよびサブグループに編成できます。 この方法では、ホストの順序を維持するだけでなく、グループ変数を使用できるようになります。これは、Ansibleで複数のステージング環境の管理を大幅に容易にする機能です。
ホストは複数のグループの一部になることができます。 次のINI形式のインベントリファイルは、webservers、dbservers、development、およびproductionの4つのグループでのセットアップを示しています。 サーバーは、目的(Webとデータベース)と使用方法(開発と本番)の2つの異なる品質でグループ化されていることに気付くでしょう。
〜/ ansible / Inventory
[webservers] 203.0.113.111 203.0.113.112 [dbservers] 203.0.113.113 server_hostname [development] 203.0.113.111 203.0.113.113 [production] 203.0.113.112 server_hostname
このインベントリファイルを使用してansible-inventoryコマンドを再度実行すると、次のように表示されます。
Output{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"dbservers",
"development",
"production",
"ungrouped",
"webservers"
]
},
"dbservers": {
"hosts": [
"203.0.113.113",
"server_hostname"
]
},
"development": {
"hosts": [
"203.0.113.111",
"203.0.113.113"
]
},
"production": {
"hosts": [
"203.0.113.112",
"server_hostname"
]
},
"webservers": {
"hosts": [
"203.0.113.111",
"203.0.113.112"
]
}
}
複数のグループを「親」グループの下に子として集約することもできます。 その場合、「親」はメタグループと呼ばれます。 次の例は、メタグループを使用して以前のインベントリを整理し、比較可能でありながらよりきめ細かい配置を実現する別の方法を示しています。
〜/ ansible / Inventory
[web_dev] 203.0.113.111 [web_prod] 203.0.113.112 [db_dev] 203.0.113.113 [db_prod] server_hostname [webservers:children] web_dev web_prod [dbservers:children] db_dev db_prod [development:children] web_dev db_dev [production:children] web_prod db_prod
サーバーの数が多いほど、必要に応じてサーバーのより小さなグループをターゲットにできるように、グループを分割したり、代替の配置を作成したりすることが理にかなっています。
ステップ3—ホストエイリアスの設定
コマンドやプレイブックを実行するときに、後でサーバーを参照しやすいように、エイリアスを使用してサーバーに名前を付けることができます。
エイリアスを使用するには、エイリアス名の後にansible_hostという名前の変数を含めます。これには、そのエイリアスに応答する必要があるサーバーの対応するIPアドレスまたはホスト名が含まれます。
〜/ ansible / Inventory
server1 ansible_host=203.0.113.111 server2 ansible_host=203.0.113.112 server3 ansible_host=203.0.113.113 server4 ansible_host=server_hostname
このインベントリファイルを使用してansible-inventoryコマンドを実行すると、次のような出力が表示されます。
Output{
"_meta": {
"hostvars": {
"server1": {
"ansible_host": "203.0.113.111"
},
"server2": {
"ansible_host": "203.0.113.112"
},
"server3": {
"ansible_host": "203.0.113.113"
},
"server4": {
"ansible_host": "server_hostname"
}
}
},
"all": {
"children": [
"ungrouped"
]
},
"ungrouped": {
"hosts": [
"server1",
"server2",
"server3",
"server4"
]
}
}
サーバーがIPアドレスやホスト名ではなくエイリアスによってどのように参照されているかに注目してください。 これにより、コマンドやプレイブックを実行するときに個々のサーバーをターゲットにすることが容易になります。
ステップ4—ホスト変数の設定
インベントリファイルを使用して、ノードに接続してコマンドを実行するときのAnsibleのデフォルトの動作を変更する変数を設定することができます。 これは実際、前のステップでホストエイリアスを設定したときに行ったことです。 ansible_host変数は、エイリアスがそのサーバーを参照するために使用される場合に、リモートノードを見つける場所をAnsibleに指示します。
インベントリ変数は、ホストごとまたはグループごとに設定できます。 Ansibleのデフォルト設定をカスタマイズすることに加えて、これらの変数はプレイブックからもアクセスできるため、個々のホストやグループをさらにカスタマイズできます。
次の例は、このインベントリファイルにリストされている各ノードに接続するときにデフォルトのリモートユーザーを定義する方法を示しています。
〜/ ansible / Inventory
server1 ansible_host=203.0.113.111 ansible_user=sammy server2 ansible_host=203.0.113.112 ansible_user=sammy server3 ansible_host=203.0.113.113 ansible_user=myuser server4 ansible_host=server_hostname ansible_user=myuser
同様の設定でホストを集約するグループを作成し、グループレベルでそれらの変数を設定することもできます。
〜/ ansible / Inventory
[group_a] server1 ansible_host=203.0.113.111 server2 ansible_host=203.0.113.112 [group_b] server3 ansible_host=203.0.113.113 server4 ansible_host=server_hostname [group_a:vars] ansible_user=sammy [group_b:vars] ansible_user=myuser
この在庫配置は、ansible-inventoryで次の出力を生成します。
Output{
"_meta": {
"hostvars": {
"server1": {
"ansible_host": "203.0.113.111",
"ansible_user": "sammy"
},
"server2": {
"ansible_host": "203.0.113.112",
"ansible_user": "sammy"
},
"server3": {
"ansible_host": "203.0.113.113",
"ansible_user": "myuser"
},
"server4": {
"ansible_host": "server_hostname",
"ansible_user": "myuser"
}
}
},
"all": {
"children": [
"group_a",
"group_b",
"ungrouped"
]
},
"group_a": {
"hosts": [
"server1",
"server2"
]
},
"group_b": {
"hosts": [
"server3",
"server4"
]
}
}
すべてのインベントリ変数が、ansible-inventoryによって生成されたJSON出力の_metaノード内にリストされていることに注意してください。
ステップ5—パターンを使用してコマンドとプレイブックの実行をターゲットにする
Ansibleでコマンドやプレイブックを実行するときは、ターゲットを指定する必要があります。 パターンを使用すると、インベントリファイル内の特定のホスト、グループ、またはサブグループをターゲットにできます。 それらは非常に柔軟性があり、正規表現とワイルドカードをサポートします。
次のインベントリファイルについて考えてみます。
〜/ ansible / Inventory
[webservers] 203.0.113.111 203.0.113.112 [dbservers] 203.0.113.113 server_hostname [development] 203.0.113.111 203.0.113.113 [production] 203.0.113.112 server_hostname
ここで、本番環境で実行されているデータベースサーバーのみを対象とするコマンドを実行する必要があると想像してください。 この例では、その基準に一致するのはserver_hostnameのみです。 ただし、そのグループにデータベースサーバーの大規模なグループがある場合があります。 各サーバーを個別にターゲットにする代わりに、次のパターンを使用できます。
ansible dbservers:\&production -m ping
&文字は、論理演算ANDを表します。つまり、有効なターゲットは両方のグループに含まれている必要があります。 これはBashで実行されるアドホックコマンドであるため、式に\エスケープ文字を含める必要があります。
前の例では、dbserversグループとproductionグループの両方に存在するサーバーのみを対象としています。 dbserversに存在するが、productionグループのには存在しないサーバーのみを対象とする、逆の操作を行う場合は、代わりに次のパターンを使用します。
ansible dbservers:\!production -m ping
ターゲットが特定のグループに'であってはならないことを示すために、!文字を使用できます。 ここでも、&と!はどちらもBashで解析できる特殊文字であるため、コマンドラインエラーを回避するために式に\エスケープ文字を含めます。
次の表には、Ansibleでコマンドやプレイブックを実行するときに使用できる一般的なパターンのいくつかの異なる例が含まれています。
| パターン | 結果目標 |
|---|---|
all
|
インベントリファイルのすべてのホスト |
host1
|
単一のホスト(host1)
|
host1:host2
|
host1とhost2の両方
|
group1
|
単一のグループ(group1)
|
group1:group2
|
group1およびgroup2のすべてのサーバー
|
group1:\&group2
|
group1とgroup2の両方であるサーバーのみ
|
group1:\!group2
|
group1 のサーバー(を除く)group2のサーバー
|
位置パターンや正規表現を使用してターゲットを定義するなど、より高度なパターンオプションについては、パターンに関する公式のAnsibleドキュメントを参照してください。
結論
このガイドでは、Ansibleのインベントリについて詳しく調べました。 ノードをグループとサブグループに編成する方法、インベントリ変数を設定する方法、およびコマンドとプレイブックを実行するときにパターンを使用してサーバーのさまざまなグループをターゲットにする方法を見てきました。
このシリーズの次のパートでは、Ansibleアドホックコマンドを使用して複数のサーバーを管理する方法を説明します。