2011-09-29 31 views
32

Tôi đã có một máy chủ dàn dựng với cả Ruby và Ruby Enterprise chuẩn được cài đặt. Theo tiêu chuẩn Ruby từ chối cài đặt một gem quan trọng, tôi cần thiết lập $ PATH sao cho ruby ​​/ gem/rake/etc. luôn luôn tham khảo các phiên bản REE. Và kể từ khi tôi sử dụng Capistrano để triển khai cho các máy của chúng tôi, tôi cần phải làm điều đó trong Capistrano.Capistrano: Tôi có thể đặt biến môi trường cho toàn bộ phiên làm việc không?

Làm cách nào để đặt biến môi trường một lần và có thể tồn tại trong suốt phiên Capistrano?

1) Dễ dàng thực hiện trong các tệp bashrc, nhưng Capistrano không đọc tệp bashrc.

2) Tôi muốn sử dụng Capistrano của

default_environment['PATH'] = 'Whatever' 

nhưng Capistrano sử dụng các biến môi trường như

env PATH=Whatever command arg ... 

và họ đang bị mất bất cứ khi nào vỏ khác được kéo thành sợi lên trong thực thi thông qua với ENV. Giống như khi bạn sử dụng sudo. Đó là khá quan trọng:

[[email protected] trunk]$ env VAR=hello ruby -e "puts ENV['VAR']" 
hello 
[[email protected] trunk]$ env VAR=hello sudo ruby -e "puts ENV['VAR']" 
nil 

3) Và tôi không thể sử dụng lệnh xuất khẩu bash, vì đây là những mất quá - Capistrano dường như bắt đầu lên một cái vỏ mới cho mỗi lệnh (hoặc một cái gì đó như thế), và đó là bị mất, quá:

cap> export MYVAR=12 
[establishing connection(s) to xxx.xxx.xxx.xxx] 
cap> echo $MYVAR 
** [out :: xxx.xxx.xxx.xxx] 
cap> 

4) tôi đã thử rối tung với Capistrano của: vỏ và: tùy chọn pty cũng (và kết hợp với các phương pháp khác), nhưng không có may mắn đó, một trong hai.

Vì vậy - cách thích hợp để thực hiện việc này là gì? Điều này có vẻ như một nhiệm vụ cơ bản như vậy nên có một cách thực sự đơn giản để thực hiện nó, nhưng tôi không có ý tưởng. Bất kỳ ai?

Cảm ơn trước!

Trả lời

5

Tôi nghĩ rằng bạn có trong thực tế 2 vấn đề:

1) Bạn muốn thay đổi PATH trên máy chủ từ xa của bạn (s).

Alter/thiết lập các đường dẫn trong .bashrc của bạn trên máy chủ của bạn từ xa (s) và chạy cap> printenv, nếu đường dẫn của bạn là đúng, goto # 2, nếu không cố gắng thêm export BASH_ENV=~/.bashrc để bạn /etc/profile (hãy cẩn thận, ~ /. bashrc sau đó sẽ chạy cho tất cả vỏ không tương tác cho tất cả người dùng)

2) bạn muốn sudo để giữ PATH của bạn

Run visudo trên máy chủ từ xa của bạn (s) và thêm:

Defaults  exempt_group = "<your_user>" 
+0

Cuộc gọi tốt - Tôi không biết rằng sudo che khuất môi trường cục bộ. Có vẻ như chỉ cần thêm tùy chọn -E sửa chữa hầu hết các trường hợp, nhưng $ PATH là đặc biệt ([tham khảo] (http://stackoverflow.com/questions/257616/sudo-changes-path-why)). Tôi sẽ chơi xung quanh với điều này nhiều hơn một chút và lấy lại cho bạn. Chúc mừng! –

9

Nếu bạn cần đặt biến trên máy chủ từ xa ngoài PATH, bạn nên biết rằng sshd chỉ cho phép các biến môi trường nhất định theo mặc định là /etc/profile hoặc ~/.bashrc vì lý do bảo mật. Như Lou đã nói, bạn có thể làm cap shell và sử dụng lệnh cap> printenv hoặc bạn có thể thực hiện cap COMMAND=printenv invoke trong một lệnh.

Nếu bạn thấy biến khi bạn ssh vào vỏ từ xa bình thường, nhưng bạn không nhìn thấy nó trong lệnh nắp printenv, đây là một giải pháp:

  1. Set PermitUserEnvironment yes trong tập tin /etc/ssh/sshd_config máy chủ từ xa của bạn, và khởi động lại sshd
  2. Sửa ~/.ssh/environment tập tin cho người dùng từ xa mà bạn đang ssh'ing trong khi, và đặt biến của bạn (s) có như VARIABLE=value

Bây giờ những người sẽ hiện lên khi bạn làm cap COMMAND=printenv invoke

+0

Điều này có thể hoạt động, nhưng nó yêu cầu thay đổi cài đặt đặc quyền gốc. Xem câu trả lời của tôi. –

3

Tôi cần thiết để đặt biến môi trường cho một tác vụ cụ thể để hoạt động. Các "chạy" lệnh cho phép bạn vượt qua tùy chọn bao gồm: env:

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

Trong trường hợp của tôi, tôi muốn thêm biến môi trường đến một công việc mà tôi đã không viết, vì vậy tôi sử dụng default_run_options được sử dụng bởi tất cả các lời gọi chạy. Tôi thêm này đến đỉnh Capfile tôi:

default_run_options[:env] = { 'name' => 'value' } 
+0

Tôi đã nhìn thấy giải pháp này ở nơi khác, nhưng tôi không thể làm cho nó làm việc cho tôi - tôi nhận được một 'NameError: biến không xác định cục bộ hoặc phương pháp' default_run_options 'cho lỗi chính: Object'. Tôi đặt câu lệnh gán đó ở đầu của 'Capfile' của tôi, trước khối' namespace: deploy do' đầu tiên. Tôi có thể làm gì khác? – sameers

+0

Bạn đang chạy tác vụ như thế nào? Nếu bạn chạy tác vụ cap, nó sẽ xác định default_run_options trong quá trình tải vì vậy nó sẽ có sẵn theo thời gian nó được đưa vào Capfile của bạn. Ngay cả với một Capfile một dòng mà chỉ nói default_run_options [: x] = {'y' => 'z'}, tôi có thể chạy cap shell. –

46

Tôi có vấn đề chính xác như nhau, nhưng tôi nghĩ rằng giải pháp này là tốt hơn:

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

này làm việc cho tôi như một say mê.

+0

hmmm, không hoạt động cho tôi xem http://stackoverflow.com/questions/16889642/capistrano-environment-variable?lq=1 – juanpastas

+19

Trong Capistrano 3 nó là 'set: default_env, {...}' – Confusion

+1

Câu hỏi ngu ngốc, nhưng Tôi đang cố gắng điều tương tự và nó không hoạt động. Dù sao để gỡ lỗi nó? – codenoob

0

Tôi đã cố gắng không thành công để sử dụng kỹ thuật @ brian-deterling, thường được sử dụng bởi những người khác đã thảo luận về điều này ... Có lẽ tôi đang làm điều gì sai, nhưng trong khi đó tôi tìm thấy đá quý dotenv-rails và nó hoạt động rất độc đáo để tải các giá trị ra khỏi tệp .env trong thư mục gốc của dự án của tôi.

Hướng dẫn trên Github repo của chúng tôi khá đơn giản. Tôi đã thêm Dotenv.load vào config/application.rb

Các vấn đề liên quan