標準のRubyおよびRuby Enterpriseがインストールされています。標準としてRubyが重要な宝石、Ruby/gem/rake/etc。が常にREEバージョンを参照するように$ PATHを設定する必要があります。また、Capistranoを使用してマシンにデプロイするため、Capistranoで実行する必要があります。
環境変数を一度設定して、カピストラーノセッション全体で永続化するにはどうすればよいですか?
1)bashrcファイルで行うのは簡単ですが、Capistranoはbashrcファイルを読み取りません。
2)私はカピストラーノを使用します
default_environment['PATH'] = 'Whatever'
capistranoはこれらの環境変数を次のように使用します
env PATH=Whatever command arg ...
また、envに渡された実行可能ファイル内で別のシェルが起動されると、それらは失われます。 Sudoを使用するときのように。これは少し重要です:
[holt@Michaela trunk]$ env VAR=hello Ruby -e "puts ENV['VAR']"
hello
[holt@Michaela trunk]$ env VAR=hello Sudo Ruby -e "puts ENV['VAR']"
nil
3)そして、これらも失われるので、bash exportコマンドを使用できません-Capistranoは、各コマンド(またはそのようなもの)に対して新しいシェルを起動するようであり、それも失われます。
cap> export MYVAR=12
[establishing connection(s) to xxx.xxx.xxx.xxx]
cap> echo $MYVAR
** [out :: xxx.xxx.xxx.xxx]
cap>
4)Capistranoの:Shellおよび:ptyオプション(および他のアプローチと組み合わせて)をいじってみましたが、そこにも運がありませんでした。
だから-これを行うには正しい方法は何ですか?これは非常に基本的なタスクのように思えますが、それを達成するための本当に簡単な方法があるはずですが、私はアイデアがありません。誰でも?
前もって感謝します!
私はまったく同じ問題を抱えていますが、この解決策の方が良いと思います:
set :default_environment, {
'env_var1' => 'value1',
'env_var2' => 'value2'
}
これは私にとって魅力のように機能します。
リモートホストでPATH以外の変数を設定する必要がある場合、sshdはセキュリティ上の理由から、デフォルトでは特定の/etc/profile
または~/.bashrc
環境変数のみを許可することを知っておく必要があります。ルーが言ったように、cap Shell
を実行してcap> printenv
コマンドを使用するか、1つのコマンドでcap COMMAND=printenv invoke
を実行できます。
通常、リモートシェルにSSHでログインしたときに変数が表示されても、cap printenv
コマンドで変数が表示されない場合は、次の1つの解決策があります。
PermitUserEnvironment yes
ファイルに/etc/ssh/sshd_config
を設定し、sshdを再起動します~/.ssh/environment
ファイルを編集し、変数をVARIABLE=value
としてそこに配置します。こうすることで、これらが表示されますcap COMMAND=printenv invoke
私はあなたが実際に2つの問題を抱えていると思います:
1)リモートホストのPATHを変更したい
リモートホスト上の.bashrcのパスを変更または設定し、cap> printenv
を実行します。パスが正しい場合は、#2に進みます。そうでない場合は、export BASH_ENV=~/.bashrc
を/etc/profile
に追加してみてください(注意してください、〜/ .bashrcは、すべてのユーザーのすべての非対話型シェルに対して実行されます)
2)SudoにPATHを保持させたい
リモートホストでvisudo
を実行し、以下を追加します。
Defaults exempt_group = "<your_user>"
特定のタスクが機能するように環境変数を設定する必要がありました。 「run」コマンドを使用すると、:envを含むオプションを渡すことができます。
run "cmd", :env => { 'name' => 'value' }
私の場合、私が記述していないタスクに環境変数を追加したかったので、runのすべての呼び出しで使用されるdefault_run_optionsを使用しました。これをCapfileの上部に追加しました:
default_run_options[:env] = { 'name' => 'value' }
@ brian-deterlingのテクニックを使用しようとして失敗しました。これは、これについて議論した他の人がかなり一般的に使用しています...多分私は何か間違っているのですが、その間にdotenv-Rails
gemを見つけ、それは非常にうまく機能しましたプロジェクトルートの.env
ファイルから値をロードするため。
Github repo に関する指示は非常に簡単です。 Dotenv.load
をconfig/application.rb
に追加しました