以下に示すように、ユーザー名とパスワードパラメータを含むabc.ymlファイルがあります。これらのパラメータをLinuxユーザーのenv変数に保存しましたが、アプリケーションがabc.ymlファイルを実行してもenv変数の値は印刷されません。環境変数のみを印刷します。
abc.yml:
type: MYSQL
host: localhost
port: 3307
username: '${user_mysql}'
password: '${pass_mysql}'
Linux端末環境変数の確認:
[arc@rnd-2 conn]$ echo ${user_mysql}
root
[arc@rnd-2 conn]$ echo ${pass_mysql}
notmypassword
abc.ymlファイルを実行したときのログ:
Caused by: java.sql.SQLInvalidAuthorizationSpecException: (conn=375) Access denied for user '${user_mysql}'@'localhost' (using password: YES)
Current charset is UTF-8. If password has been set using other charset, consider using option 'passwordCharacterEncoding'
答え1
Java(?)プログラムが特定の外観を見て環境変数を見つける方法がわからない場合、${variable}
ローカルでは機能しません。
ただし、YAMLファイルを解析して変数の値を変更し、プログラムで処理されたYAMLファイルを使用するようにすることもできます。この問題を解決するのに役立つツールは次のとおりです。envsubst
答え2
YAMLファイルの変数を一致させる代わりに、YAML認識ツールを使用してトップレベルとキーのusername
値を設定できます。password
これの利点は、ドキュメントに合わせて値をエンコードできることです。
アイデアは、YAML文書を読むソフトウェアで使用する前に、YAML文書を適切に変更(または変更されたコピーを作成)することです。
以下が使用されますyq
Andrey Kislyukが提供するPythonベースのツールこれはよく知られているJSONプロセッサを取り巻くラッパーですjq
。
パスワードは、任意の文字列をサポートすることを示すためにリテラルタブで終わります。また、スラッシュとバックスラッシュ(パスワードで見られる文字)も挿入しました。
user_mysql=ruut
pass_mysql='not\/my\/password '
yq -y \
--arg username "$user_mysql" \
--arg password "$pass_mysql" \
'. += $ARGS.named' abc.yml
これが機能するために入力にキーが存在する必要はありませんが、存在する場合、その値はコマンドラインに渡された引数によってオーバーライドされます。
質問の入力文書が与えられると、以下が出力されます。
type: MYSQL
host: localhost
port: 3307
username: ruut
password: "not\\/my\\/password\t"
「所定の位置で」を変更するには、適切なオプションまたはオプションとyq
一緒に使用してください。--in-place
-i
また、これを行うことができますyq
Mike Farahが提供するGoベースのツール:
user_mysql=ruut
pass_mysql='not\/my\/password '
export user_mysql pass_mysql
yq '.username = strenv(user_mysql) |
.password = strenv(pass_mysql)' abc.yml
この場合、値を設定する構文は少し異なります。環境を介して変数を渡し、式内strenv()
の値を読み込みますyq
。これは、両方の変数をエクスポートするか、yq
プロセス環境で使用できるようにする必要があることを意味します。
オプションが提供されると、yq
ユーティリティは「内部」編集を実行することもできます-i
。
問題の文書の出力を提供します。
type: MYSQL
host: localhost
port: 3307
username: 'ruut'
password: "not\\/my\\/password\t"