Uncategorized

テンプレートに環境変数を埋め込む。

Dockerコンテナを作るときに環境変数を使ってテンプレートから設定ファイルを作成します。

やりたいことは、次の2つなのですが、手軽な方法が見つかりません。

  • 環境変数が設定されていたら、それを使う
  • 環境変数がなければ、デフォルト値を使う

結局、ansibleのJinja2を使って次のようにしました。

テンプレートとplaybook

下記のようにテンプレートのtest.cfgとplaybookのmain.yamlを準備します。

$ cat templates/test.cfg
test={{ aaa }}
$ cat main.yaml
---
- name: setup proxy
hosts: all
vars:
aaa: "{{ lookup('env', 'AAA') | ternary(lookup('env', 'AAA'), 'default value') }}"
tasks:
- name: test
debug: msg="value is {{ aaa }}"
- template:
src: test.cfg
dest: /tmp/test.cfg
$

動作確認

環境変数がなければ、ternaryのfalse側の値がデフォルト値として採用され、環境変数が定義されていれば、環境変数の値が埋め込まれます。

$ ansible-playbook -i "localhost," -c local main.yaml > /dev/null  && cat /tmp/test.cfg
test=default value
$ AAA="env value" ansible-playbook -i "localhost," -c local main.yaml > /dev/null  && cat /tmp/test.cfg
test=env value
$

下記のような不満は、ちょっとありますが、一番良さそう。

  • 環境変数の表現が長い(lookup(env, “環境変数”)には省略形がほしい)
  • デフォルト値のternaryには、ちょっと馴染めない。
  • varsへの設定ではなく、テンプレート側に埋め込みたい

他に試した方法

envsubst

envsubstコマンドは、aptでインストール可能で、環境変数を${変数名}で置換するので最有力でしたが、デフォルト値が設定できなかったり、エスケープの問題が解決できず断念しまいた。

entrykit

DockerのEntrypointのための専用ツール、Jinja2風のテンプレート表記でデフォルト値の設定も可能と機能的には申し分なしでしたが、パッケージからのインストールができず、curl + tarが残念、また、Entrypointの表記が、ちょっと受け入れられなかった。

以上

タイトルとURLをコピーしました