web-dev-qa-db-ja.com

カピストラーノ:キャップセッション全体の環境変数を設定できますか?

標準の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オプション(および他のアプローチと組み合わせて)をいじってみましたが、そこにも運がありませんでした。

だから-これを行うには正しい方法は何ですか?これは非常に基本的なタスクのように思えますが、それを達成するための本当に簡単な方法があるはずですが、私はアイデアがありません。誰でも?

前もって感謝します!

34
Xavier Holt

私はまったく同じ問題を抱えていますが、この解決策の方が良いと思います:

set :default_environment, { 
  'env_var1' => 'value1',
  'env_var2' => 'value2'
}

これは私にとって魅力のように機能します。

51
Peter Lee

リモートホストでPATH以外の変数を設定する必要がある場合、sshdはセキュリティ上の理由から、デフォルトでは特定の/etc/profileまたは~/.bashrc環境変数のみを許可することを知っておく必要があります。ルーが言ったように、cap Shellを実行してcap> printenvコマンドを使用するか、1つのコマンドでcap COMMAND=printenv invokeを実行できます。

通常、リモートシェルにSSHでログインしたときに変数が表示されても、cap printenvコマンドで変数が表示されない場合は、次の1つの解決策があります。

  1. リモートサーバーのPermitUserEnvironment yesファイルに/etc/ssh/sshd_configを設定し、sshdを再起動します
  2. Sshを実行しているリモートユーザーの~/.ssh/environmentファイルを編集し、変数をVARIABLE=valueとしてそこに配置します。

こうすることで、これらが表示されますcap COMMAND=printenv invoke

10
bjnord

私はあなたが実際に2つの問題を抱えていると思います:

1)リモートホストのPATHを変更したい

リモートホスト上の.bashrcのパスを変更または設定し、cap> printenvを実行します。パスが正しい場合は、#2に進みます。そうでない場合は、export BASH_ENV=~/.bashrc/etc/profileに追加してみてください(注意してください、〜/ .bashrcは、すべてのユーザーのすべての非対話型シェルに対して実行されます)

2)SudoにPATHを保持させたい

リモートホストでvisudoを実行し、以下を追加します。

Defaults        exempt_group = "<your_user>"
5

特定のタスクが機能するように環境変数を設定する必要がありました。 「run」コマンドを使用すると、:envを含むオプションを渡すことができます。

run "cmd", :env => { 'name' => 'value' }

私の場合、私が記述していないタスクに環境変数を追加したかったので、runのすべての呼び出しで使用されるdefault_run_optionsを使用しました。これをCapfileの上部に追加しました:

default_run_options[:env] = { 'name' => 'value' }
3
Brian Deterling

@ brian-deterlingのテクニックを使用しようとして失敗しました。これは、これについて議論した他の人がかなり一般的に使用しています...多分私は何か間違っているのですが、その間にdotenv-Rails gemを見つけ、それは非常にうまく機能しましたプロジェクトルートの.envファイルから値をロードするため。

Github repo に関する指示は非常に簡単です。 Dotenv.loadconfig/application.rbに追加しました

0
sameers