質問
次のテンプレートと単位ファイルが与えられたら、起動時にプロセスにsystemctl
最終的に渡される環境変数を取得しようとします(サービスが現在実行中かどうかにかかわらず)。
/etc/systemd/system/[email protected]
...
[Service]
Environment="VAR1=val1"
Environment="VAR2=val2"
...
/etc/systemd/system/[email protected]/unit.conf
[Service]
Environment="VAR2=Overridden by %i"
提供されたオプションを参照した後、出力に変数が単一の文字列として含まれているsystemctl
以外は何も見つかりません。systemctl show example-template@example-unit --property=Environment
Environment=VAR1=val1 VAR2=Overridden by example-unit
しかし、便利な区切り文字は含まれていないので、元の変数を復元するために解析することを避けることをお勧めします。
EnvironmentFile
最初は、変数を独自のファイルに移動し、私のスクリプトからインポートすることで、そのディレクティブを活用したかったのです。残念ながら私の変数の1つ以上%i
にEnvironmentFile
。
必要なものを達成するより良い方法はありますか?
コンテキスト
OpenSUSEサーバーからCentOS 7サーバーに移行された80個のTomcatインスタンスがあります。歴史的に、これは各インスタンスに対して複製されたSystem V initスクリプトによって管理されていました。初期化スクリプトは機能的に同じですが、catalina.sh
開始/停止コマンドをTomcatに付属のスクリプトに委任する前にエクスポートする値が異なります。一般的な機能を更新するには、すべての80ファイルに変更を適用する必要があります。
これに加えて、に委任しcatalina.sh
、そのオプションを追加し、配布されたファイルを削除するか、ログファイルを追跡するラッパースクリプトがあります。これは環境変数について知る必要があるスクリプトです。現在の環境変数は、サーバーが実行されているかどうかに関係なく、特定のパラメーターを使用してinitスクリプトを呼び出すことによって公開されます。
System Vに固執し、共通の機能を単一のソース対応スクリプト(元の意図)に統合するのではなく、systemd
この状況を念頭に置いて設計されたように見えたので、ユニットファイルテンプレートのサポートを活用するために移行することにしました。これにより、個々のインスタンスが特定の変数をオーバーライドできるようにしながら、デフォルトのTomcat設定をグローバルに定義できます(たとえば、JVMのメモリを増やしたり、新しいバージョンのTomcatに対してアプリケーションをテストしたりできます)。各インスタンスに固有の環境変数には、PIDファイル(catalina.sh
注意が必要)とTomcatのデフォルト(設定)の場所が含まれます。
これを念頭に置いて私が直面する問題は、上記のラッパースクリプトがTomcatインスタンスの環境変数にアクセスできなくなることです(たとえば、変数の1つは、デプロイされたCATALINA_HOME
アプリケーション、ログ、および構成ファイルを含むパスです)。 )。スクリプトの一部の機能はサーバーの実行を必要としないため(停止したサーバーのクリーンアップなど)、プロセスから環境をインポートすることはできません。
ラッパースクリプトがユニット名からこの情報を派生(推測)できるようにしたり、ラッパースクリプトがスクリプトを直接呼び出すようにして、Tomcatサーバーをサービスとして実行するのを完全に中止することができますcatalina.sh
。サービスはサービス自体になり、systemd
サービスが障害状態になると自動的に再起動するなど、一部の機能を利用することもできます。
バージョン情報
- CentOS Linuxバージョン7.6.1810
- システム 219
- bash 4.2.46(2)-リリース
答え1
最近、これらの移行を完了しました。
すべてのデバイスに適用されるデフォルト値は、テンプレートファイルのEnvironment =ディレクティブにあります。 EnvironmentFile=production.%i.env は、インスタンス固有のオーバーライドをロードするために使用されます。
Production.foo.envでは%iが利用できないので心配しないでください。そのファイルに「foo」をハードコードするだけです。必要に応じてこのタスクを自動化できます。