command lineでテンプレートファイルに環境変数を埋め込む

毎回忘れてしまうのでメモとして残しておく。

設定ファイルとかを使う時に環境変数を埋め込みたい時とかがある。
例えばDBへの接続情報を管理するような次のようなファイルがあったとする。

- DB_HOST: xxx.yyy.zzz
- DB_USER: fugafuga
- DB_PASS: hogehoge

ただこの秘匿値をいれたファイルの管理はどうするかは毎回悩む。
Gitで管理したいので秘匿値だけencodeしたりプロビジョニングツールとか使ってテンプレートに埋め込んだりする。
今回はその解決策の1つ

envsubst というものを使う。

これは環境変数を置き換える

ただそれだけ!!
めっちゃシンプル

インストール

envsubstはgettextの中に入っているので各OSからは次のようにインストールする。

Mac

brew install gettext

Ubuntu

apt-get install gettext

使い方

先程のようなDBへの接続情報をまず次のようなテンプレートにする。

- DB_HOST: ${DB_HOST}
- DB_USER: ${DB_USER}
- DB_PASS: ${DB_PASS}

後は環境変数で次のように管理されたマシンがあれば

export DB_HOST=xxx.yyy.zzz
export DB_USER=fugafuga
export DB_PASS=hogehoge

次のコマンドで最初と同じファイルが生成される。

$ cat template.yml | envsubst > db.yml

まとめ

envsubstはテンプレートエンジンみたいに多機能なわけでもなくただ環境変数を置き換えるシンプルなツールを紹介した。
シンプルが故に便利な時もある。