Ansible グループインベントリ

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

はじめに

この実験では、Ansible インベントリファイルを作成および構成する方法を学びます。Ansible は、インベントリファイルを使用して管理対象のホストを定義および組織化します。インベントリファイルの基本構造を調べ、グループを作成し、グループ階層を確立し、グループに変数を割り当てます。これらのスキルは、Ansible を使ってインフラストラクチャを効果的に管理するために欠かせないものです。

基本的なインベントリの作成

この実験環境では、ローカルマシンへの SSH アクセスが事前に設定されています。この実験では、すべての Ansible 操作の対象ホストとして localhost を使用できます。

Ansible のインベントリファイルは、プレイブック内のコマンド、モジュール、タスクが実行されるホストとホストのグループを定義します。では、基本的なインベントリファイルを作成しましょう。

/home/labex/project ディレクトリに inventory という名前の新しいファイルを作成します。

nano /home/labex/project/inventory

ファイルに以下の内容を追加します。

localhost ansible_connection=local

これを分解してみましょう。

  • localhost:これはホストの名前です。この場合、ローカルマシンです。
  • ansible_connection=local:これは Ansible の変数で、Ansible にこのホストに SSH 経由ではなくローカルで接続するように指示します。これはローカルマシンを管理する際に便利です。

ファイルを保存してエディタを終了します(nano では、Ctrl+X を押してから Y を押し、その後 Enter を押します)。

では、Ansible の ping モジュールを使ってインベントリをテストしましょう。ping モジュールは実際に ICMP ping プロトコルを使用していません。代わりに、Ansible がホストに接続して Python コードを実行できるかどうかを検証します。

このコマンドを実行します。

ansible -i inventory -m ping all

このコマンドを分解してみましょう。

  • -i inventory:使用するインベントリファイルを指定します。
  • -m ping:Ansible に ping モジュールを使用するように指示します。
  • all:インベントリ内のすべてのホストを対象にします。

接続成功を示す出力が表示されるはずです。

localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

この出力が表示された場合、Ansible が正常に localhost に接続して ping モジュールを実行したことを意味します。

ホストのグループ化

Ansible を使えば、ホストをグループにまとめることができます。これは、複数のホストに同時に設定を適用したり、タスクを実行したりする際に便利です。では、グループを含むようにインベントリを変更しましょう。

inventory ファイルを編集します。

nano /home/labex/project/inventory

内容を以下のように更新します。

[webservers]
localhost ansible_connection=local

これは、localhost を含む webservers という名前のグループを定義します。Ansible では、グループ名を角括弧 [] で囲むことで定義されます。グループの下に列挙されたすべてのホストはそのグループに属します。

保存してエディタを終了します。

では、ping モジュールを使ってグループをテストしましょう。

ansible -i inventory -m ping webservers

このコマンドは前のものと似ていますが、all の代わりに webservers グループを対象にしています。

1 台のホストだけでは不要に見えるかもしれませんが、インベントリが増えるにつれて、特定のホストセットを対象にするためのグループ化はますます便利になります。

グループ階層の作成

Ansible はネストされたグループをサポートしており、階層を作成できます。これは、ホストを役割や環境に基づいて整理する際に便利です。では、別のグループを追加して階層を作成しましょう。

inventory ファイルを編集します。

nano /home/labex/project/inventory

内容を以下のように更新します。

[webservers]
localhost ansible_connection=local

[production:children]
webservers

これは、webservers グループ内のすべてのホストを含む production という名前の新しいグループを作成します。:children サフィックスは、このグループがホストのグループではなく、グループのグループであることを Ansible に伝えます。

この階層の意味は以下の通りです。

  • webservers グループ内の任意のホストは、暗黙的に production グループにも属します。
  • production グループを対象にすることで、すべての本番環境のホストに設定を適用できます。
  • 必要に応じて、まだ webservers だけを対象にすることもできます。

保存してエディタを終了します。

新しいグループ階層をテストします。

ansible -i inventory -m ping production

このコマンドは、production グループ内のすべてのホスト(この場合、webservers グループ内のすべてのホスト、今のところは localhost のみ)に ping を送信します。実際のシナリオでは、この構造により強力で柔軟なホスト管理が可能になります。

グループに変数を割り当てる

Ansible を使えば、インベントリファイル内のグループに変数を割り当てることができます。これらの変数は、プレイブックやテンプレートで使用でき、Ansible コードをより柔軟で再利用可能にすることができます。

inventory ファイルを編集します。

nano /home/labex/project/inventory

内容を以下のように更新します。

[webservers]
localhost ansible_connection=local

[production:children]
webservers

[webservers:vars]
http_port=80

これは、webservers グループ内のすべてのホストに値 80 の変数 http_port を割り当てます。:vars サフィックスは、グループ用の変数を定義するために使用されます。

保存してエディタを終了します。

では、この変数を表示するための簡単なプレイブックを作成しましょう。プレイブックは、ホストで実行する一連のタスクを定義する YAML ファイルです。show_http_port.yml という名前の新しいファイルを作成します。

nano /home/labex/project/show_http_port.yml

以下の内容を追加します。

---
- name: Show HTTP Port
  hosts: webservers
  tasks:
    - name: Display HTTP Port
      debug:
        msg: "The HTTP port is {{ http_port }}"

このプレイブックは、

  • webservers グループを対象にしています。
  • debug モジュールを使ってメッセージを表示する単一のタスクを持っています。
  • インベントリで定義した変数を参照するために {{ http_port }} 構文を使用しています。

保存してエディタを終了します。

プレイブックを実行します。

ansible-playbook -i inventory show_http_port.yml

HTTP ポート値が表示される出力が表示されるはずです。

PLAY [Show HTTP Port] ********************************************************

TASK [Gathering Facts] ********************************************************
ok: [localhost]

TASK [Display HTTP Port] ******************************************************
ok: [localhost] => {
    "msg": "The HTTP port is 80"
}

PLAY RECAP ********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

これは、インベントリで定義した変数がプレイブック内でアクセス可能であることを示しています。

まとめ

この実験では、Ansible のインベントリ管理の基本を学びました。基本的なインベントリファイルを作成し、Ansible の ping モジュールを使って接続性を検証する方法を学びました。また、ホストをグループ化してグループ階層を作成する方法を調べました。これらは、大規模なインフラストラクチャを整理し管理する際に欠かせない要素です。最後に、グループに変数を割り当て、簡単なプレイブックで使用する方法を学びました。

これらのスキルは、Ansible を使った作業の基礎を形成しており、より複雑な自動化タスクに取り組む際に非常に役立ちます。効果的なインベントリ管理は、拡張可能で保守可能な Ansible プロジェクトの鍵であることを忘れないでください。Ansible の学習を続ける際には、動的インベントリやインベントリプラグインなど、より高度なインベントリ機能を探ってみることを検討してください。

これらの概念を習得する鍵は練習です。より複雑なインベントリを作成したり、異なるグループ構造を試したり、より高度なプレイブックで変数を使用したりしてみてください。Ansible を使う機会が増えるにつれて、その強力な自動化機能に慣れるでしょう。