web-dev-qa-db-ja.com

カピストラーノと環境変数

構成の環境変数 を使用するように切り替えましたが、非常にうまく機能します-capistranoを使用してタスクを展開または実行する必要がある場合を除きます。

Capistrano 3は、/usr/bin/envというプレフィックスが付いた各コマンドを実行するようで、.bashrcで設定した環境変数をすべて消去します。

[〜#〜] edit [〜#〜]-さらにいくつかの再調査を行うと、これは問題ではないかもしれませんが、問題はカピストラーノが実行されるためかもしれません非ログイン、非対話型シェルとして、.bashrcまたは.bash_profileをロードしません。しかし、まだ立ち往生しています。

Capistranoがタスクを実行するときに環境変数が設定されていることを確認する最良の方法は何でしょうか?

42
Rahul Sekhar

あなたは ENVIRONMENT VARIABLESおよびShell VARIABLES

SSHを起動すると、アプリは.bashrcファイル。これらはシェルの存続期間中のみ存在するため、ENV varsほど使用しません。

ENV varsを入れる方が良いかもしれません:

/etc/environment

このような:

export ENVIRONMENT_VAR=value

これにより、異なるシェルセッションだけでなく、システム全体で変数を使用できるようになります。


更新

やってみました

Capistrano:capセッション全体に環境変数を設定できますか?

set :default_env, { 
  'env_var1' => 'value1',
  'env_var2' => 'value2'
}
48
Richard Peck

これは回答済みですが、他の誰かが私と同じ状況にある場合に備えて、ここに残しておきます。

カピストラーノdoesload .bashrc。ただし、ファイルの上部にあることに気付くと、次のようになります。

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

解決策は、この設定の上にセットアップを配置するだけで、Capistranoは私が望むように動作します。

この解決策は このGitHubの問題 にも記載されています。

48
Delameko

問題の更新をデバッグするにはconfig/deploy.rb簡単なタスク:

namespace :debug do
  desc 'Print ENV variables'
  task :env do
    on roles(:app), in: :sequence, wait: 5 do
      execute :printenv
    end
  end
end

cap staging debug:envENV変数の効果的な構成を確認できるはずです。

ファイルの順序と名前は、ディストリビューションによって異なります。 Ubuntuでは、ソースシーケンスは次のとおりです。

  1. /etc/environment
  2. /etc/default/locale
  3. /etc/bash.bashrc
  4. ~/.bashrc

いつ ~/.bashrcには次のような最初の行が含まれます。その後のコードはソースされません。

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

capistranoがENV変数をロードする方法を理解するには、このチャート( source )が役立つ場合があります。

おそらく~/.bash*ファイルは、非対話型セッションのためにロードされません。

capistrano env variables loading

15
Tombart

/etc/environmentファイルに環境変数を設定して、システム内のすべてのユーザーとプロセスで使用できるようにする必要があります。 .bashrcまたは.bash_profileファイルの環境変数は、シェルセッション内でのみ使用でき、自動的に生成されたプロセスおよびサービスでは使用できません。

capistrano-env_configファイルを変更するだけで機能するクラスター全体で環境変数を管理および同期するために、先ほどCapistranoライブラリ( /etc/environment )を作成しました。使い方は簡単で、Herokuツールベルトを使用して環境変数を設定する方法に似ています。ここではいくつかの例を示します。

cap env:list
cap env:get[VARIABLE_NAME, VARIABLE_NAME, ...] 
cap env:unset[VARIABLE_NAME, VARIABLE_NAME, ...] 
cap env:set[VARIABLE_NAME=VALUE, VARIABLE_NAME=VALUE, ...] 
cap env:sync
1
Itay Grudev

私が決めた解決策は:

  1. デプロイする必要があるすべてのサーバーの/ etc/ssh/sshd_configでPe​​rmitUserEnvironmentオプションを有効にします。
  2. KEY = VALUEペアの形式でenv varsを使用してデプロイする各ユーザーのホームディレクトリに〜/ .ssh/environmentファイルを追加します(すべてのアプリとサービスを自分のユーザーを介してそのユーザーのホームディレクトリにデプロイします)。

リファレンス: http://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fenvironment

実際にはそれよりも悪いです。 Upstartを使用してPuma/Railsを管理しますが、そこにもenv変数を設定する必要があります。それで、数日間の実験の後、私は次の完全で恐ろしい解決策に行き着きました。

  1. 「export KEY = VALUE」を使用して、ユーザーの.bashrcにenv変数を設定します。 (だから、インタラクティブにSSHで接続するときに存在します。)
  2. 「KEY = VALUE」を使用して、ユーザーの.ssh/environmentファイルにenv変数を設定します。 (したがって、カピストラーノがSSHで接続するときに存在します。)
  3. /etc/init/puma.confの「スクリプト」セクションでenv変数を設定します。 (したがって、Puma/Railsの起動時に存在します。)

複数のファイル/テンプレートおよび複数の形式(エクスポートあり、エクスポートなし...)でenv変数の同じリストを維持するのは苦痛です。幸いなことに、Papipetを使用してノードの構成を管理することで、Capistranoを使用してデプロイすることで、わずかに簡単/信頼性が向上しました...

Linuxシェル、初期化、およびドットファイルのドメイン全体が本当に嫌いです。完全な再起動の時間です。

0
odigity