概要
Ansibleの変数ファイルに変数を増やしていくにつれて、比較的頻繁に編集が必要な箇所を確認・修正するのに都合が悪くなったことはないでしょうか。
私自身Ansibleを業務上で利用していて編集箇所の確認・修正が手間になり、一部の変数のみを別ファイルに切り出そうということになりました。
本記事では、切り出し作業の際に数点引っかかった箇所について記載します。
この記事で伝えたいこと
- Ansibleで変数ファイル(
all.yml)から変数を切り出す際に、筆者が引っかかった点
この記事で伝えないこと
- Ansibleの基本的な使い方
修正前の構成
本記事での説明は、以下の構成に手を加える形で進めます。
ディレクトリ構成:
└── inventories
└── prod
├── group_vars
│ └── all.yml
└── hosts
all.yml
app1:
image: "app1:2.0.2"
.
.
.
app2:
image: "app2:2.0.3"
.
.
.
app3:
image: "app3:2.0.3"
引っかかった点
1. 変数ファイル・フォルダの名前
group_varsフォルダ以下の変数ファイルの名前は、基本的に各環境に設定したグループ名と同じである必要があります。
※all.ymlは例外的に、全てのグループに対する変数として認識されます。
私は変数を切り出す際に、以下のようにファイルを作成しましたが、images.ymlは認識されずall.ymlからのみ変数を探す状態になりました。
└── inventories
└── prod
├── group_vars
│ ├── all.yml
│ └── images.yml
└── hosts
この場合以下のようにグループ名と同じ名前のフォルダを作成することで、フォルダ以下のファイルがグループの変数ファイルとして認識されます。
└── inventories
└── prod
├── group_vars
│ └── all
│ ├── all.yml
│ └── images.yml
└── hosts
2. 変数の重複
私は1.の構成で変数を別ファイルに切り出す際、最初は以下のようにall.ymlの変数名をそのままにimages.ymlに切り出しました。
all.yml
app1:
image: "{{ app1.image }}"
.
.
.
app2:
image: "{{ app2.image }}"
.
.
.
app3:
image: "{{ app3.image }}"
images.yml(修正前)
app1:
image: "app1:2.0.2"
app2:
image: "app2:2.0.3"
app3:
image: "app3:2.0.3"
しかし、この形でプレイブックを実行した際、image以外の変数が存在しないとエラーが発生しました。
このエラーの原因はimages.yml上の変数が、本来目的としている参照元のall.yml以外からも利用される変数名(切り出し元そのまま)を利用していることでした。
変数ファイルが複数ある場合、プレイブック実行時に合致する変数名をフォルダ内のファイルから辞書順で探索します。
そのため、images.yml→all.ymlの順で変数を探索した際に、images.ymlに探索中の変数を発見→image以外の変数も必要だが見つからないのでエラー発生 の流れになったのでしょう。
解決方法は簡単で、all.ymlからのみ参照する用の変数を別途作成し、以下のような形に修正すればOKです。
images.yml(修正後)
app1_image: "app1:2.0.2"
app2_image: "app2:2.0.3"
app3_image: "app3:2.0.3"
要するに、以下のような形にするということですね
-
all.yml:変数の定義として直接参照される - それ以外の変数ファイル:
all.ymlからのみ参照される
まとめ
以上が私が変数切り出し時に引っかかった点でした。
同じところで詰まった方の助けになれば幸いです。
最終的には、以下のような構成になりました。
ディレクトリ構成:
└── inventories
└── prod
├── group_vars
│ └── all
│ ├── all.yml
│ └── images.yml
└── hosts
all.yml
app1:
image: "{{ app1_image }}"
.
.
.
app2:
image: "{{ app2_image }}"
.
.
.
app3:
image: "{{ app3_image }}"
images.yml
app1_image: "app1:2.0.2"
app2_image: "app2:2.0.3"
app3_image: "app3:2.0.3"