ICTSC2026 一次予選 問題解説: 問38

問38

Ansibleで以下のように hosts.yml が設定されています。

all:
  vars:
    VAR_A: "all"

  children:
    webservers:
      vars:
        VAR_A: "webservers"

      hosts:
        web01:
          ansible_host: 192.168.10.10

        web02:
          ansible_host: 192.168.10.20
          VAR_A: "web02"

以下のコマンドを実行しました。

ansible -i hosts.yml all -m debug -a "var=VAR_A"

このとき表示される VAR_A の値の組み合わせとして、最も適切なものを1つ選びなさい。

web01 web02
A all web02
B webservers webservers
C webservers web02
D all webservers

選択肢(択一選択)

  1. A
  2. B
  3. C
  4. D

正解

3

解説

Ansibleにおいて今回のように同じインベントリファイル内で同名の変数が定義されている場合、より具体的な対象に定義された変数が優先される。
つまり子グループの変数は親グループの変数より優先され、ホストに直接定義された変数はグループ変数より優先されることになる。

このhosts.ymlでのVAR_Aの優先順位は、以下の通りである。左側ほど優先順位が高い。

ホストに直接定義された変数 > webserversのグループ変数 > allのグループ変数

webserversはallの子グループであり、web01とweb02はどちらもwebserversに所属している。それぞれのホストで採用される値は以下の通りである。

ホスト 値の決定過程 表示されるVAR_A
web01 allグループの値"all"より、子グループwebserversの値"webservers"が優先される。 webservers
web02 グループ変数より、ホスト自身に定義された値"web02"が優先される。 web02

なお、実行コマンドのallは実行対象のホストを指定することを意味する引数であり、インベントリ内での変数評価には関係がない。
-m debug -a "var=VAR_A"によって、各ホストで上記の優先順位に従って決定されたVAR_Aの値が表示される。

したがって、web01はwebservers、web02はweb02となり、組み合わせはCである。正答は 3 である。