プログラマ行進曲第二章

主にソフトウェア関連の技術をネタにした記事を執筆するためのブログ

Ansibleの変数の優先順位を理解してなくて詰まってしまったという話

TL;DR

基本的に以下の記事の方と同じハマり方をした、という話しです。

qiita.com

詰まった箇所

具体的に言うと、既存のansible roleを使ったplaybookを修正する必要があり、その際デフォルトで以下のようなフラグ変数を用意して、JenkinsのLTSを通常使用するようにしようとしました。

jenkins_lts_use: true

そして、LTSを使用しないサイトでは jenkins_lts_use: false とやって、この変数の値に応じて別の変数(yum repositoryのURLなど)を分岐させるという作りにして動作検証していたところ、 jenkins_lts_use: false とhost_varsに書いたのに上書きされない状態で「何故だ!?」と時間を消費することに。

ちゃんとdebugモジュールを使って変数の値が変わったかどうか確認したところ、私の意図とは違い、 jenkins_lts_use: true という値のままでした。

原因

「これはすっかり忘れてたけど、多分ansibleの変数が使われる優先順位の問題だろうな」と思ったのでインターネットでググったとこ ろ、この記事冒頭で紹介した記事を見つけ、ビンゴでした。

公式ドキュメントでは以下の箇所にあたります。

docs.ansible.com

Here is the order of precedence from least to greatest (the last listed variables winning prioritization):

  • command line values (eg “-u user”)
  • role defaults [1]
  • inventory file or script group vars [2]
  • inventory group_vars/all [3]
  • playbook group_vars/all [3]
  • inventory group_vars/* [3]
  • playbook group_vars/* [3]
  • inventory file or script host vars [2]
  • inventory host_vars/* [3]
  • playbook host_vars/* [3]
  • host facts / cached set_facts [4]
  • play vars
  • play vars_prompt
  • play vars_files
  • role vars (defined in role/vars/main.yml)
  • block vars (only for tasks in block)
  • task vars (only for the task)
  • include_vars
  • set_facts / registered vars
  • role (and include_role) params
  • include params
  • extra vars (always win precedence)

冒頭の記事とこの公式ドキュメントの記述を見た後、私が追加したデフォルト変数はどこに追加したものか確認したところ、role defaults ではなく role vars (defined in role/vars/main.yml) でした。

jenkins_lts_use: false を追加したのは playbook host_vars/* だったので role vars (defined in role/vars/main.yml) より優先順位が低く、この影響で変数が上書きされない状態だったと言うことが分かりました。

jenkins_lts_use: truerole defaults に書くようにして問題解決。

一応対処出来てよかったです。