4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ansibleにおける変数切り出し

4
Last updated at Posted at 2022-08-23

概要

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.ymlall.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"

参考

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?