ksaitoの日記

日々試したことの覚え書き

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

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の表記が、ちょっと受け入れられなかった。

以上