無能が苦悩したメモ

無能な著者が学んだことを忘れないための覚え書きです...

Ansible:インベントリ変数について

インベントリ変数は以下の2つの方法で定義することができます。

  • インベントリファイルに直接記述する
  • host_vars、group_varsを作成し、その下のファイルに記述する

インベントリファイルに変数を記述する場合

ホスト変数

ホスト変数は、インベントリファイル内のホスト名、またはIPアドレスの後に「変数名=値」の書式でスペース区切りで記載します。1つのホストに対して複数のホスト変数を設定すると1行が長くなりますが、途中で改行することはできません…


以下の例では、serverA_01にはfooというホスト変数が定義され、serverA_02にはfooとbarの2つのホスト変数が定義されています。
※ちなみに、ansible_hostはansibleがリモートマシンへの接続のために用いる特殊な変数です。

[serverA]
serverA_01 ansible_host=192.168.1.1 foo="ホスト変数foo"
serverA_02 ansible_host=192.168.1.2 foo="ホスト変数foo" bar="ホスト変数bar"

グループ変数

グループ変数を定義する場合、新たに「グループ名:vars」の名前でセクションを作り、その下に記載します。


以下の例では、serverAというグループにfooとbarの2つの変数を定義しています。

[serverA]
serverA_01 ansible_host=192.168.1.1
serverA_02 ansible_host=192.168.1.2

[serverA:vars]
foo="グループ変数foo"
bar="グループ変数bar"


親子関係のグループの場合

グループが親子関係でも同じように「グループ名:vars」で変数を定義できます。親で定義した変数は子にも受け継がれます。親、子で変数が重複した場合、子の変数が適用されます。

[parent]

[parent:vars]
foo="parentグループ変数foo"
bar="parentグループ変数bar"

[parent:children]
serverA

[serverA]
serverA_01 ansible_host=192.168.1.1

[serverA:vars]
foo="serverAグループ変数foo"

---
- hosts: all
  tasks:
    - debug:
        msg: "{{ foo }}"
    - debug:
        msg: "{{ bar }}"

$ ansible-playbook -i inventory -l serverA_01 play_serverA.yml

PLAY [all] **************************************************************************************************************************************************

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

TASK [debug] ************************************************************************************************************************************************
ok: [serverA_01] => {
    "msg": "serverAグループ変数foo"
}

TASK [debug] ************************************************************************************************************************************************
ok: [serverA_01] => {
    "msg": "parentグループ変数bar"
}

PLAY RECAP **************************************************************************************************************************************************
serverA_01                 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0


ホスト変数とグループ変数で変数が重複する場合

ホスト変数とグループ変数に重複して変数を定義した場合、ホスト変数の値が適用されます。

[serverA]
serverA_01 ansible_host=192.168.1.1 foo="ホスト変数foo" bar="ホスト変数bar"

[serverA:vars]
foo="グループ変数foo"
bar="グループ変数bar"

---
- hosts: all
  tasks:
    - debug:
        msg: "{{ foo }}"
    - debug:
        msg: "{{ bar }}"

$ ansible-playbook -i inventory -l serverA_01 play_serverA.yml

PLAY [all] **************************************************************************************************************************************************

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

TASK [debug] ************************************************************************************************************************************************
ok: [serverA_01] => {
    "msg": "ホスト変数foo"
}

TASK [debug] ************************************************************************************************************************************************
ok: [serverA_01] => {
    "msg": "ホスト変数bar"
}

PLAY RECAP **************************************************************************************************************************************************
serverA_01                 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0


全ホストに共通する変数を定義する

インベントリファイルに定義した全てのホストは「all」というグループに所属します。「all:vars」に変数を定義することで全ホストに共通した値を定義することができます。

なお、「グループ名:vars」と「all:vars」で重複して変数を定義した場合、「グループ名:vars」で定義した値が適用されます。

[serverA]
serverA_01 ansible_host=192.168.1.1

[serverA:vars]
foo="serverAグループ変数foo"

[all:vars]
foo="allグループ変数foo"
bar="allグループ変数bar"

---
- hosts: all
  tasks:
    - debug:
        msg: "{{ foo }}"
    - debug:
        msg: "{{ bar }}"

$ ansible-playbook -i inventory -l serverA_01 play_serverA.yml

PLAY [all] **************************************************************************************************************************************************

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

TASK [debug] ************************************************************************************************************************************************
ok: [serverA_01] => {
    "msg": "serverAグループ変数foo"
}

TASK [debug] ************************************************************************************************************************************************
ok: [serverA_01] => {
    "msg": "allグループ変数bar"
}

PLAY RECAP **************************************************************************************************************************************************
serverA_01                 : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0


host_vars、group_vars下のファイルに変数を記述する場合

インベントリ変数はインベントリファイルに記載する以外にも、host_varsやgroup_varsのようなディレクトリを用意し、その下のファイルに記載することもできます。


イメージとしては以下のようなディレクトリ構成です。host_vars、group_varsはインベントリファイルと同じ階層に作成しなければなりません。

|-- group_vars
|   |-- all.yml
|   `-- serverA.yml
|-- host_vars
|   |-- serverA_01.yml
|   `-- serverA_02.yml
|-- inventory
`-- play_serverA.yml

ホスト変数

host_varsの下にホスト名と同じ名前でyamlファイルを作成し、その中にホスト変数を定義します。

|-- inventory
`-- host_vars
    |-- serverA_01.yml
    `-- serverA_02.yml

foo: "serverA_01のホスト変数foo"
bar: "serverA_01のホスト変数bar"

foo: "serverA_02のホスト変数foo"
bar: "serverA_02のホスト変数bar"


ホスト変数をさらにファイルに分割する

host_varsの下にホスト名と同じ名前のディレクトリを作成し、その下にホスト変数を記述したyamlファイルを配置することもできます。yamlファイルのファイル名はどんなものでもかまいません。この場合、サーバの機能や特徴ごとにファイルを分けるのがよさそうです。

|-- inventory
`-- host_vars
    `-- serverA_01
        |-- feature1
        `-- feature2

foo: "serverA_01のホスト変数foo"

bar: "serverA_01のホスト変数bar"

グループ変数

group_varsの下にグループ名と同じ名前でyamlファイルを作成し、その中にグループ変数を定義します。

|-- inventory
`-- group_vars
    |-- all
    |-- serverA.yml
    `-- serverB.yml

foo: "serverAのグループ変数foo"
bar: "serverAのグループ変数bar"

foo: "serverBのグループ変数foo"
bar: "serverBのグループ変数bar"

グループ変数をさらにファイルに分割する

ホスト変数と同様に、group_varsの下にグループ名と同じ名前のディレクトリを作成し、その下にグループ変数を記述したyamlファイルを配置できます。yamlファイルのファイル名はどんなものでもかまいません。

|-- inventory
`-- group_vars
    `-- serverA
        |-- feature1.yml
        `-- feature2.yml

foo: "serverAのグループ変数foo"

bar: "serverAのグループ変数bar"


親子関係のグループの場合

親グループも子グループもgroup_varsの下に作成します。

|-- inventory
`-- group_vars
    |-- parent.yml
    `-- serverA.yml

[parent]

[parent:children]
serverA

[serverA]
serverA_01 ansible_host=192.168.1.1

foobar: "parentのグループ変数:foobar"

foo: "serverAのグループ変数:foo"
bar: "serverAのグループ変数:bar"