ファイル内の環境変数をすばやく置換する方法



設定ファイル(例えばKubernetes YAMLファイル)に格納された資格情報やその他の機密価値が悪いことを知っていますが、複雑な文字列置換やカスタムPythonスクリプトを書くことなく、簡単に値を交換できますか?
私はしばしば個人用環境変数ファイルを持っています.プロジェクトに取り組む前に、対応する設定ファイルをシェルセッションにします.ただし、これらのファイルはgitリポジトリに保存することはできません.さらに悪いことに、リポジトリには変更される必要があるファイルがあります.
よくわかるように、すでに良い解決策があり、それはenvsubstと呼ばれています.EnvSubstを使用して設定ファイル内の環境変数プレースホルダを置き換えることができます.
envsubst < config.txt

エンヴァンスト


The envsubstgettext UNIXの国際化(I 18 N)とローカライズ(L 10 N)プロジェクト.使い方はとても簡単で、これが説明することを望みます.

Some systems have gettext with envsubst preinstalled. However, if it is missing, you can install it using a package manager. For macOS you can use homebrew:

brew install gettext

Learn more about homebrew in my article about setting about your development machine in one script



のは、私たちは誰かに与えるか、ボットを使用して、既存の設定ファイルを持っているとしましょう.理想的には、そのファイルに資格情報を含める必要はありません.
# my configuration file
server: https://gitlab.com/skofgar
username: foo_user
password: mymonkey

サンプル設定ファイルの作成


Gitリポジトリにその情報をチェックしたくないし、我々はそれを敷設したり、このような誰かにそれを送信しますか?ファイル内の環境変数を置換します.
server: $SERVER_URL
username: $USER_NAME
password: $USER_PASSWORD

2 .環境変数の設定


そしてこれらの環境変数をシェルセッションで定義することで定義します.
export SERVER_URL=https://gitlab.com/skofgar
export USER_NAME=foo_user
export USER_PASSWORD=mymonkey
またはそれらをファイルに保存し、ソースを使用して現在のシェルセッションに読み込みます.env

Make sure to use export, otherwise your variables are considered shell variables and might not be accessible to envsubst

Read more here: https://ostechnix.com/difference-between-defining-bash-variables-with-and-without-export/


置換


実際の置換を実行するには、次のコマンドを実行します.
> envsubst < config.txt  
server: https://gitlab.com/skofgar
username: foo_user
password: mymonkey
新しいファイルに代入することもできます.
> envsubst < config.txt > confidential_config.txt

Kubernetesと他のツールへの配管置換


Kubernetes ( K 8 S )のために、出力をlessやkubectlのような他のコマンドにパイプすることができます.
# pipe into less
> envsubst < config.txt | less

# pipe a deployment "deploy.yml" into kubectl apply
> envsubst < deploy.yml | kubectl apply -f -

結論


これはあなたの継続的な統合と継続的な配置(CI/CD)パイプラインを改善したり、独自のワークフローを簡素化する素晴らしい方法です.私たちは、一時的に必要とされる資格情報を交換しなければならないプロジェクトのためにこれを使用します.
あなたがこの解決策について何を考えているか、そして、あなたが代わりのアプローチに遭遇したならば、私にコメントを知らせてください.
以下にまとめました.
# print content of configuration file
> cat config.txt
server: $SERVER_URL
username: $USER_NAME
password: $USER_PASSWORD

# load environment variables
> source .env

# replace environment variables in file content
> envsubst < config.txt
server: https://gitlab.com/skofgar
username: foo_user
password: mymonkey

# replace environment variables and write to new file
> envsubst < config.txt > confidential_config.txt

# pipe into less
> envsubst < config.txt | less

# pipe a deployment "deploy.yml" into kubectl apply
> envsubst < deploy.yml | kubectl apply -f -

ソース


私がこの記事のために使用したいくつかのソースは以下の通りです.
  • KubernetesのためのEnvSust :https://serverfault.com/a/843883
  • gettextドキュメントhttps://www.gnu.org/software/gettext/
  • 当初公開Skofgar’s Blog .