数日前、Vagrantを使用して3ノードのAnsibleラボをセットアップする方法について説明しました。 Linuxでは。この記事では、Ansibleインベントリや構成ファイルなどのAnsibleの基本的な概念について詳しく学習します。
Ansibleの基本構造
ansibleを使い始めるとき、理解しておくべき2つの重要なファイルがあります。 1つはAnsibleインベントリです ファイルと2番目はAnsible構成です ファイル。
構成 ファイルには、実行時にansibleが使用するすべての構成が含まれています。 OSパッケージマネージャーを使用してansibleをインストールすると、「ansible.cfg
」という名前のデフォルトの構成ファイルがあることがわかります。 "/etc/ansible
で作成 ディレクトリ。
インベントリファイル 使用する管理対象ホストのリストに関するIPアドレスまたはDNS情報が含まれています。 Ansibleはインベントリファイルからホスト名を読み取り、タスク/再生はそのノードで実行されます。インベントリファイルはini
で作成できます 、yaml
、およびjson
フォーマット。
以下は私のプロジェクトの構造です。 ansible.cfg
があります 構成ファイル、hostsファイル、およびyaml
で記述されたプレイブック フォーマット。
プレイブックをトリガーすると、ansibleはansible.cfg
から構成を読み取ります プレイを実行するためのファイルとhostsファイルからのホストの詳細。
[email protected]:~/ansible_project$ tree . . ├── ansible.cfg ├── hosts └── playbook.yml 0 directories, 3 files
これら2つのファイルについて詳しく話しましょう。最終的に、いくつかのアドホックコマンドを実行します。
Ansible構成ファイル
Ansibleは、構成ファイルを使用して、ansibleタスクの実行に必要なパラメーターをロードします。 パッケージマネージャーを使用してansibleをインストールした場合 、ansible.cfg
があります /etc/ansible
内のファイル ディレクトリ。
以下は、ansible.cfg
のサンプルです。 ファイル。

Ansibleは次の順序で構成ファイルを検索します。
-
ANSIBLE_CONFIG
-環境変数 -
ansible.cfg
-コマンドを実行している現在のディレクトリ -
.ansible.cfg
-ユーザーのホームディレクトリ -
/etc/ansible/ansible.cfg
-/etc/ansible
内 ディレクトリ
ansible --version
を実行します コマンドを使用して、ansibleが選択している構成ファイルを確認します。
$ ansible --version ansible [core 2.12.3] config file = /home/vagrant/ansible_project/ansible.cfg configured module search path = ['/home/vagrant/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible ansible collection location = /home/vagrant/.ansible/collections:/usr/share/ansible/collections executable location = /usr/local/bin/ansible python version = 3.8.10 (default, Nov 26 2021, 20:14:08) [GCC 9.3.0] jinja version = 2.10.1 libyaml = True
カスタムプロジェクトディレクトリを作成し、ansible.cfg
を作成しました ファイル。私の設定ファイルには、インベントリの場所と無効になっているホストキーチェックの2つのプロパティしか含まれていません。
[defaults] inventory = /home/karthick/ansible_project/hosts host_key_checking = False
他にもたくさんのプロパティがありますが、現時点では「インベントリ」プロパティだけを追加することでそれらを使い始めることができます。
Ansible Inventory File
インベントリファイルでは、サーバー名、ネットワークデバイス、クラウドサービス、またはansibleが使用できるものすべてのIPアドレスまたはDNSを指定します。
インベントリはini
で記述できます 、json
、およびyaml
フォーマットであり、ある在庫フォーマットを他のフォーマットに変換するためのスクリプトもあります。
デフォルトでは、インベントリファイル(ホスト)は/etc/ansible
にあります。 OSパッケージマネージャーを使用してansibleをインストールした場合はディレクトリ。別のプロジェクトディレクトリを作成し、インベントリと構成ファイルを作成することを常にお勧めします。
次の表は、私のansibleラボがどのように設定されているかを表しています。このラボセットアップ用のインベントリファイルを作成し、pingモジュールを実行して、インベントリファイルでの動作を示します。
ノードタイプ | ノード名 | IPアドレス | OSフレーバー |
コントロールノード | controller.anslab.com | 192.168.10.3 | ubuntu / focus64 |
管理対象ノード | managed1.anslab.com | 192.168.10.4 | ubuntu / focus64 |
管理対象ノード | managed2.anslab.com | 192.168.10.5 | ubuntu / focus64 |
明示的なグループ化のないインベントリファイル
インベントリファイルには、リソースをグループ化し、そのグループに対してタスクを実行するグループ化と呼ばれる概念があります。次のような構造になります。
[group-name] Resource1 Resource2 .... Resource N
グループを使用せずにインベントリファイルを作成できます。この場合、Ansibleは2つのデフォルトグループ "all"を使用します および「グループ化されていない」 。
- すべてのグループ -インベントリファイルでデフォルトで使用可能なすべてのリソースは、すべてのグループに割り当てられます 。
- グループ化されていない -ユーザー定義グループの一部ではないリソースは、グループ化されていないグループに自動的に割り当てられます 。
グループなしでインベントリファイルを作成しました。これで、これら2つのノードは、グループ化されていないグループだけでなく、すべてのグループに分類されます。
$ cat hosts
managed1.anslab.com
managed2.anslab.com
次のansibleコマンドを実行して、すべてのグループ化されていないグループの下にあるホストのリストを確認できます。
$ ansible all --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
$ ansible ungrouped --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
グループ化された在庫ファイル
先に述べたように、グループ化はリソースを整理するための優れた方法であるため、特定のグループに対してタスクを簡単に実行できます。 2つの管理対象ノードがあり、Ubuntu20.04LTSを実行しています。
OSタイプに基づいてインベントリファイルをグループ化したい場合、インベントリファイルは次のようになります。ここでubuntu はグループ名です。
[ubuntu]
managed1.anslab.com
managed2.anslab.com
このグループに対してタスクを実行できます。
$ ansible ubuntu -m ping -o managed1.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} managed2.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
ここで「グループ化されていない」グループを確認すると、ホストは存在しません。
$ ansible ungrouped --list-hosts
[WARNING]: No hosts matched, nothing to do
hosts (0):
インベントリファイルに必要な数のグループを作成し、同じリソース名を使用できます。
[ubuntu] managed1.anslab.com managed2.anslab.com [dev] managed1.anslab.com [test] managed2.anslab.com
$ ansible ubuntu -m ping -o $ ansible dev -m ping -o $ ansible test -m ping -o
範囲のある在庫ファイル
リソースに共通の命名パターンがある場合は、範囲を使用できます。 DNSを繰り返す代わりに、範囲を使用して短縮した以下の例を見てください。
[ubuntu]
managed[1:2].anslab.com
子グループを含むインベントリファイル
グループを作成し、その下で他のグループ名を使用できます。以下の例を見てください。サーバー名を持つubuntuグループがあります。 ubuntuグループを含むserverという名前の別のグループを作成しました。
:childrenを追加することが重要です それ以外の場合、サーバーグループは「 ubuntu」を扱います。 「グループ名の代わりにサーバー名として。
[ubuntu] managed[1:2].anslab.com [server:children] ubuntu
ホスト変数とグループ変数を含むインベントリファイル
インベントリファイルは、ホスト変数とグループ変数をサポートします。ホスト変数は、インベントリファイルでホストに渡される変数とその値に他なりません。以下の構成では、 ostechnixを使用するようにansibleに指示しています。 私のユーザーとして 標準のsshポートを使用する代わりに、ポート2222を使用します 。
[ubuntu]
managed1.anslab.com ansible_user=ostechnix ansible_port=2222
managed2.anslab.com ansible_user=ostechnix ansible_port=2222
グループ変数はホスト変数と同じですが、変数は単一のホストではなくグループ全体に適用されます。上記の設定からわかるように、ansible_userとansible_portは両方のノードで同じです。したがって、変数がグループ内のすべてのノードに継承されるグループ変数を作成できます。 :varsを追加する必要があります グループをグループ変数として作成します。
[ubuntu] managed1.anslab.com managed2.anslab.com [ubuntu:vars] ansible_user=ostechnix ansible_port=2222
ヘッズアップ: 同じノードにグループ変数とホスト変数の両方がある場合、ホスト変数が優先されます。
使用できるインベントリパラメータは多数あり、公式ドキュメントからリストを取得できます。 。
エイリアス付きインベントリファイル
以下のように、リソースのエイリアスを作成できます。ここで、m1とm2はエイリアスです。
[ubuntu] m1 ansible_host=managed1.anslab.com m2 ansible_host=managed2.anslab.com
これで、このエイリアスを使用していくつかのタスクを実行できます。
$ ansible m1 -m ping -o m1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} $ ansible m2 -m ping -o m2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
YAML形式のインベントリファイル
インベントリファイルはYAML形式で書き込むこともできます。前のセクションで説明したものはすべて、YAML形式で記述されています。
次の画像は、2つのホスト変数を持つ2つのノードを表しています。

下の画像は、グループ変数を持つ2つのノードを表しています。

Ansible Inventory Command
Ansibleには、インベントリファイル情報を表示するのに非常に役立つインベントリコマンドがあります。
サポートされているオプションのリストを取得するには、helpコマンドを実行します。
$ ansible-inventory --help
在庫の詳細をグラフ形式で取得するには、--graph
を使用します 国旗。異なるインベントリファイルがある場合は、-i
を使用できます インベントリファイルを明示的に指すフラグ。
$ ansible-inventory --graph

--vars
を渡すことで、ホストとグループの変数情報を出力できます。 --graph
とともにフラグを立てる フラグ。
$ ansible-inventory --graph --vars

--list
を使用する場合 フラグを立てると、出力はJSON形式になります。
$ ansible-inventory -list

--host
を使用して、特定のノードに関する情報を取得できます。 フラグ。
$ ansible-inventory --host managed1.anslab.com

結論
この記事では、ansibleアーキテクチャのコアを形成する重要な概念を見てきました。初心者の場合は、ini形式でインベントリを作成することに集中してください。そうすれば、本番プロジェクトでの作業を開始するときに、ベストプラクティスについて詳しく知ることができます。
次を読む:
- AnsibleSSH認証と特権昇格
- Ansibleアドホックコマンドの使用を開始する