AnsibleSpecを使う上でのAnsibleにおける変数定義場所の制約

Ansibleで変数を様々な場所に定義できるが、AnsibleSpecでそれらを参照するには(すべてを網羅して読み出すspec_helper.rbないしRakefileがないので)現状では決まった場所に定義しなければならないようだ。

先に作成したRakefileでは、spec_vars/*.ymlに保存したhostvars[inventory_hostname]を参照するようにしている。
(そしてその保存はansible-spec.ymlという、ホスト構築とは別のプレイブックで行っていた)。
つまりhostvars[inventory_hostname]がロードしている限りの変数(=インベントリファイル内のホスト毎やグループに記載された変数)しか参照されず、
プレイブック内に記載されていたり、tasksやroles内で加工されたデータも参照されない。

inventories/devel.ini

[groupA]
host1       ansible_connection=local my_var_ok=OK牧場
host2       ansible_connection=winrm my_var_ok=OK牧場

[groupA:vars]
my_gvar_ok=OK牧場

my_var_okはhostvars[inventory_hostname]をダンプして参照可能。
my_gvar_okはvarsをダンプして参照可能。

sites.yml

- name: "My Sample Server Group - A"
  hosts: groupA
    vars:
      my_var_ng=NG牧場

my_var_ngはhostvars[inventory_hostname]やvarsをダンプしただけでは参照不可。

group_vars/groupA.yml

---
my_var_ng=NG牧場

my_var_ngはhostvars[inventory_hostname]やvarsをダンプしただけでは参照不可。

host_vars/{{ inventory_hostname }}.yml

---
my_var_ng=NG牧場

my_var_ngはhostvars[inventory_hostname]やvarsをダンプしただけでは参照不可。

(ホスト構築用プレイブックの最後にhostvars[inventory_hostname]をやれば、set_factで設定した変数は参照可能)

そのため、AnsibleSpecでホスト・グループに設定された値を参照するには、以下の制約に従うかRakefile or spec_helper.rbの修正を行う必要がある。

  1. すべてインベントリファイルに書く、もしくはインベントリファイルにキーとなる変数を埋め込む
  2. ホスト構築に与える設定はプレイブック内記載を止め全てgroup_varsやhost_varsに保存し、Rakefileないしspec_helper.rbでそれらを参照するよう修正する
  3. Rakefileでロール列挙次に、ロール毎に設定された変数も全て渡すよう修正する

1は仕組みの修正がいらない代わりに、定義の修正が大幅に必要であり、かつ完成図の視認性が悪そうな…。
2ならspec_vars/{{ inventory_hostname }}.ymlを追加でロードしている仕組みを応用すれば実現は容易と思われる。
3はRubyスペシャリストじゃないので厳しい。

まずはプレイブック内に書いていた変数(特にroleに渡しているもの)はhost_varsに収めるように直しておこう…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です