Chapter 05

インベントリーの基本

y_mrok
y_mrok
2021.10.17に更新

次の 6 台を「機器一覧表 = インベントリー」に定義します。

# ホスト名 IP アドレス os ユーザー名 パスワード
1 marutamachi 192.168.111.101/24 CentOS/8 vagrant vagrant
2 takeyamachi 192.168.111.102/24 CentOS/7 vagrant vagrant
3 ebisugawa 192.168.111.103/24 Ubuntu 20.04 LTS vagrant vagrant
4 nijyo 192.168.111.104/24 Ubuntu 18.04 LTS vagrant vagrant
5 oshikoji 192.168.111.105/24 Debian 10 vagrant vagrant
6 oike 192.168.111.106/24 AlmaLinux 8 vagrant vagrant

インベントリーを記述したファイルをインベントリーファイルと呼びます。ファイル名は任意に設定でき、 「hosts」 , 「hosts.yml」 , 「inventory」 , 「production」 , 「staging」 などが使用されます。今回は 「hosts.yml」 を使用します。

インベントリーの基本

インベントリー内の管理対象ノードはグルーピングして記述します。すべての管理対象ノードは "all" グループに含まれます。

基本的な書き方です。

---                    # YAML は ”---" から開始する
all:                   # "all" グループの宣言
  hosts:                 # "all" グループに含まれるホストに関する情報を定義する宣言
    管理対象ノード名:      # 管理対象ノードの情報を定義する宣言 
      ansible_host: IP アドレス
      ansible_user: ユーザー名
      ansible_password: パスワード
      ansible_ssh_private_key_file: 秘密鍵の path
      ansible_python_interpreter: Python インタープリターの path
      ansible_port: ポート番号
項目名 説明
ansible_host 管理対象ノードの IP アドレス
ansible_user 管理対象ノードにログインするときのユーザー名
ansible_password 管理対象ノードにパスワード認証でログインするときのパスワード
ansible_ssh_private_key_file 管理対象ノードに鍵認証でログインするときの秘密鍵の path
ansible_python_interpreter 管理対象ノードで使用する Python インタープリターの path
ansible_port 管理対象ノードに接続するときのポート番号 (デフォルト:22)

管理対象ノードをインベントリーに定義した内容です。 ansible_python_interpreter は管理対象ノードに複数の Python インタープリターがインストールされている時、 Ansible が使用するインタープリターを指定します。

hosts.yml
---
all:
  hosts:
    marutamachi:
      ansible_host: 192.168.111.101
      ansible_user: vagrant
      ansible_password: vagrant
    takeyamachi:
      ansible_host: 192.168.111.102
      ansible_user: vagrant
      ansible_password: vagrant
    ebisugawa:
      ansible_host: 192.168.111.103
      ansible_user: vagrant
      ansible_password: vagrant
    nijyo:
      ansible_host: 192.168.111.104
      ansible_user: vagrant
      ansible_password: vagrant
    oshikoji:
      ansible_host: 192.168.111.105
      ansible_user: vagrant
      ansible_password: vagrant
      ansible_python_interpreter: /usr/bin/python3
    oike:
      ansible_host: 192.168.111.106
      ansible_user: vagrant
      ansible_password: vagrant
      ansible_python_interpreter: /usr/libexec/platform-python

インベントリー内のすべての管理対象ノードに次の 2 行が含まれています。

      ansible_user: vagrant
      ansible_password: vagrant

このようにグループ内のすべての管理対象ノードに含まれる変数 (項目) は vars を使用してまとめて定義します。 vars はグループ内のすべての管理対象ノードに適用する変数を定義をするときの宣言です。

vars を使用して書き直したインベントリーです。

hosts.yml
---
all:
  vars:
    ansible_user: vagrant
    ansible_password: vagrant
  hosts:
    marutamachi:
      ansible_host: 192.168.111.101
    takeyamachi:
      ansible_host: 192.168.111.102
    ebisugawa:
      ansible_host: 192.168.111.103
    nijyo:
      ansible_host: 192.168.111.104
    oshikoji:
      ansible_host: 192.168.111.105
      ansible_python_interpreter: /usr/bin/python3
    oike:
      ansible_host: 192.168.111.106
      ansible_python_interpreter: /usr/libexec/platform-python

子グループ

管理対象ノードを共通な内容でグルーピングします。例えば設置場所、用途などです。今回は用途ごとにグルーピングします。 "all" グループがすべての親グループになり、この共通なことでまとめたグループは子グループになります。管理対象ノードは複数の子グループに含められます。

# ホスト名 用途
1 marutamachi -
2 takeyamachi web
3 ebisugawa web
4 nijyo web, mail
5 oshikoji database
6 oike database

children は子グループを定義するときの宣言です。 children 以降は子グループの定義です。

hosts.yml
---
all:
  vars:
    ansible_user: vagrant
    ansible_password: vagrant
  hosts:
    marutamachi:
      ansible_host: 192.168.111.101
  children:
    web:
      hosts:
        takeyamachi:
          ansible_host: 192.168.111.102
        ebisugawa:
          ansible_host: 192.168.111.103
        nijyo:
          ansible_host: 192.168.111.104
    mail:
      hosts:
        nijyo:
    database:
      hosts:
        oshikoji:
          ansible_host: 192.168.111.105
          ansible_python_interpreter: /usr/bin/python3
        oike:
          ansible_host: 192.168.111.106
          ansible_python_interpreter: /usr/libexec/platform-python

子グループ内のすべての管理対象ノードに適用する変数は vars で宣言します。例えば web グループに "http_port: 8080" を適用する場合、次のようになります。

hosts.yml
---
all:
  vars:
    ansible_user: vagrant
    ansible_password: vagrant
  hosts:
    marutamachi:
      ansible_host: 192.168.111.101
  children:
    web:
      vars:
        http_port: 8080
      hosts:
        takeyamachi:
          ansible_host: 192.168.111.102
        ebisugawa:
          ansible_host: 192.168.111.103
        nijyo:
          ansible_host: 192.168.111.104
    mail:
      hosts:
        nijyo:
    database:
      hosts:
        oshikoji:
          ansible_host: 192.168.111.105
          ansible_python_interpreter: /usr/bin/python3
        oike:
          ansible_host: 192.168.111.106
          ansible_python_interpreter: /usr/libexec/platform-python

"ungrouped"グループ

どの子グループにも含まれない ("all" グループだけに含まれる) 管理対象ノードを集めて暗黙の "ungrouped" グループが作られます。ここまで見てきたインベントリーでは管理対象ノード marutamachi が "ungrouped" グループに含まれます。

"ungrouped" グループがあるので、管理対象ノードは必ず "all" グループといずれかの子グループの 2 つ以上のグループに含まれます。

ホスト変数とグループ変数

このインベントリーでホスト変数とグループ変数を見ていきます。

hosts.yml
---
all:
  vars:
    ansible_user: vagrant
    ansible_password: vagrant
  hosts:
    marutamachi:
      ansible_host: 192.168.111.101
  children:
    web:
      vars:
        http_port: 8080
      hosts:
        takeyamachi:
          ansible_host: 192.168.111.102
        ebisugawa:
          ansible_host: 192.168.111.103
        nijyo:
          ansible_host: 192.168.111.104
    mail:
      hosts:
        nijyo:
    database:
      hosts:
        oshikoji:
          ansible_host: 192.168.111.105
          ansible_python_interpreter: /usr/bin/python3
        oike:
          ansible_host: 192.168.111.106
          ansible_python_interpreter: /usr/libexec/platform-python

Ansible が用意している変数

Ansible が用意している変数はプレフィックス ansible_ [1]が付きます。

  • ansible_host
  • ansible_user
  • ansible_password
  • ansible_python_interpreter

ホスト変数

各管理対象ノードだけに適用される変数です。

  • ansible_host

グループ変数

グループ内のすべての管理対象ノードに適用される変数です。

  • ansible_user
  • ansible_password
  • http_port

演習問題

演習問題はこのリンクをクリックしてください。

脚注
  1. ansible_ 変数は「Connecting to hosts: behavioral inventory parameters」(https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#connecting-to-hosts-behavioral-inventory-parameters) を参照ください。 ↩︎