犬でも分かるAnsible(3): inventoryを定義する

inventory(インベントリ)ファイルはAnsibleのターゲットノードを定義するファイルです。
hostファイルとでも呼べば分かりやすいのに、なんでinventoryファイルと呼ぶのでしょうね。。
inventoryファイルの記述方法には、INI形式とYAML形式があって、どちらの形式で定義してもOKです。

1. INI形式

(1) 基本

INI形式は、inventoryファイルを記述するデフォルトの形式です。

・基本的に、IPアドレス、または ホスト名を1行ずつ記述すればOKです。ターゲットノードが少ない場合はこれだけでもOK。

# IPアドレスで定義
192.168.2.100
192.168.2.101
# ホスト名で定義
comp0
comp1

[グループ名] グループを定義することもできます。グループ名は、playbookの hostsディレクティブで使用することができます。同じ操作をしたいターゲットノードをグループ化しておくと便利です。
・Ansibleではデフォルトで 、all という全てのターゲットノードを意味するグループが存在するので、ノード数が少なければグループを定義しなくても良いと思います。

[comp]
# 計算ノード
192.168.2.100
192.168.2.101

[manage]
# 管理ノード
192.168.2.10
192.168.2.11

・IPアドレスやホスト名に規則性がある場合は、以下のようなメタ記述も可能です。多数台を管理するのに便利です。

[comp]
192.168.2.[100:199]  # 192.168.2.100~192.168.2.199

[manage]
mng-[a:c]  # mng-a,mng-b,mng-c
(2) 階層による管理

・グループを階層構造にすることもできます。この場合 [グループ名:children] を定義して、そのグループの下位に所属するグループ名を記述します。以下の例では、playbookのhostsディレクティブで、comp_smallを指定した場合は 192.168.2.[100:149] のノードが対象に、comp_largeを指定した場合は、192.168.2.[150:199] のノードが対象になり、また、上位の comp_all を指定した場合は、comp_small, comp_large の全てのノードが対象になります。

[comp_all:children]  # 計算ノード全体
comp_small
comp_large

[comp_small] # 小規模計算ノード
192.168.2.[100:149]
192.168.2.[150:199]

・comp_allより上位のグループを定義して、更に階層を増やすこともできます。

(3) ホスト変数とグループ変数

inventoryファイルにはターゲットノードをホスト名で定義することもできますが、/etc/hostsとinventoryファイルの両方でIPアドレスを定義するのは効率悪いです。

inventoryファイルの中で、ansible_host というホスト変数を使用して、ターゲットノードのIPアドレスと(playbookで参照する)ホスト名を定義することができます。

[comp]
comp0 ansible_host=192.168.2.100
comp1 ansible_host=192.168.2.101

ホスト変数は、ターゲットノードの右側に追記していきます。

グループに対して共通の変数を定義したい場合は、グループ変数 として定義します。
グループ変数は、[グループ名:vars] を記述した後に、変数定義を行います。

[comp]
comp0 ansible_host=192.168.2.100
comp1 ansible_host=192.168.2.101

[comp:vars]
ansible_port=10022

この例では、グループ comp で変数 ansible_portを定義して、ansibleが使用するsshのport番号を10022にする、という設定を行っています。セキュリティを重要視するデータセンターでは、sshのport番号を22から別のport番号に変更する場合があるので、そのようなときに有用です。
全てのターゲットノードに対して設定を行いたい場合は、[all:vars] の記述の後に、変数定義を行います。

変数を記述する場所によって、ホスト変数と呼ばれたり、グループ変数と呼ばれたりするってことですね。代表的な変数を以下の表にまとめます。

変数用途
ansible_hostターゲットノードのホスト名、IPアドレスを定義する。
ansible_portAnsibleで使用するsshのport番号を指定する。
ansible_userAnsibleで使用するsshのユーザ名を指定する。
ansible_passwordAnsibleで使用するsshのパスワード認証のパスワードを指定する。

2. YAML形式

inventoryファイルは、YAML形式でも記述できます。
ここでもYAMLかよ…。YAMLに慣れている人は、YAML形式で記述したほうが管理しやすいでしょうね。YAMLに慣れていない人は、シンプルなINI形式で記述すれば良いかと思います。

さて、以下のINI形式のinventoryファイルを…

[comp]
comp0 ansible_host=192.168.2.100
comp1 ansible_host=192.168.2.101

YAML形式で記述すると、以下のようになります。

---
all:
  hosts:
    comp0:
      ansible_host: 192.168.2.100
    comp1:
      ansible_host: 192.168.2.101
  children:
    comp:
      hosts:
        comp0:
        comp1:

グループとターゲットノードの階層構造がYAMLで表現されていることが確認できます。
デフォルトグループ all の子グループ(children)としてグループ comp が存在し、その構成ホスト(hosts)として comp0, comp1 が存在しています。
グループとターゲットノードの階層構造が同じなら、以下のようにYAMLを表現することもできます。

---
all:
  children:
    comp:
      hosts:
        comp0:
          ansible_host: 192.168.2.100
        comp1:
          ansible_host: 192.168.2.101

YAML形式においても、ホスト変数、グループ変数を使用することができます。

3. inventoryディレクトリによる管理

inventoryファイルはINI形式とYAML形式があるだけでもややこしいのに、inventoryディレクトリと呼ばれるディレクトリの下で、複数ファイルに分割してターゲットノードや変数を定義する、という方法もあります。ああ、更にややこしい。。

inventoryディレクトリによる定義の例を示します。
・ディレクトリとファイルの構造は以下の通りとします。

inventory/
  hosts.yml
  group_vars/
    all.yml
    manage.yml
  host_vars/
    manage01.yml

・この例では、inventoryディレクトリの名前をinventoryにしています(別のディレクトリ名でもOKです)。
・hosts.yml にターゲットノードを定義します(別のファイル名でもOKです。複数ファイルが存在する場合はファイル名のアルファベット順に読み込みされるようです)。

---
all:
  children:
    comp:
      hosts:
        comp0:
          ansible_host: 192.168.2.100
        comp1:
          ansible_host: 192.168.2.101
    manage:
      hosts:
        manage0:
          ansible_host: 192.168.2.200
        manage1:
          ansible_host: 192.168.2.210

・group_vars ディレクトリの下には、グループ名.yml のファイル名で、グループの変数を定義するファイルを作成することができます。例えば、inventory/group_vars/manage.yml を以下のように定義して、グループ manage に所属するターゲットノードの変数を定義することができます。

ansible_port: 10022

・host_vars ディレクトリの下には、ホスト名.yml のファイル名で、ターゲットノードの変数を定義するファイルを作成することができます。

4. inventoryファイル/ディレクトリの場所

inventoryファイルの参照の優先順位は、(4) > (3) > (2) > (1) です。
inventoryファイルをYAML形式で記述する場合はファイル名の拡張子を「.yml」に、INI形式で記述する場合はファイル名の拡張子を「.ini」にすると、分かりやすいかと思います(拡張子のルールはありません)。

(1) デフォルトのパス

/etc/ansible/hosts がinventoryファイルのデフォルトパスです。

(2) ansible.cfg の定義

Ansibleの設定ファイル ansible.cfg に以下のようにinventoryファイルのデフォルトパスを指定することができます。

[defaults]
inventory = /xxxx/hosts

Ansibleの設定ファイルの優先順位は、④ > ③ > ② > ① です。
① デフォルトのパスは、/etc/ansible/ansible.cfg
② ホームディレクトリの ~/.ansible.cfg
③ カレントディレクトリの ansible.cfg
④ 環境変数 ANSIBLE_CONFIG に指定したパス

(3) 環境変数 ANSIBLE_INVENTORY または ANSIBLE_INVENTORY_PATH

export ANSIBLE_INVENTORY=/xxxx/hosts

のようにinventoryファイルのパスを指定できます。

(4) ansible-playbookの -i オプション

$ ansible-playbook -i /xxx/hosts playbook.yml

のように -i オプションでinventoryファイルを明示的に指定することができます。

(1)~(4)で指定するパスには、3.で紹介したinventoryディレクトリのパスを指定することもできます。

広告主へのリンク

Ansibleのテストは、ミニPCにLinuxをインストールしてKVMで仮想マシンを作成して行っています(私はこの3台を使っています)。ミニPCは、Linuxのお勉強にとても良いよー。

このブログにおける関連リンク

犬でも分かるAnsibleシリーズ

コメント

タイトルとURLをコピーしました