`thực thi 'là người dùng mơ hồ, không root, với đầu bếp-solo?


10

Tôi đang cố chạy lệnh đầu bếp sau:

# install zombiejs, q (promises), should, coffee-script & mocha                 
execute "install q and zombiejs" do                                             
  cwd "/home/vagrant"                                                           
  user "vagrant"                                                                
  action :run                                                                   
  command "npm install -g q zombie should mocha coffee-script"                  
end

Nhưng nó liên tục thất bại vì không thể tìm thấy npm:

thực hiện [install q và zombiejs] (Chef-redtail :: dòng mặc định 205) có lỗi: Errno :: ENOENT: Không có tệp hoặc thư mục như vậy - npm install -gq zombie nên mocha coffee-script

Đăng nhập vào vagrant qua vagrant sshvà chạy lệnh thủ công hoạt động hoàn toàn tốt. Đăng nhập bằng root, thông qua sudo -ivà chạy lệnh không thành công vì lý do tương tự công thức đầu bếp thất bại (npm được cài đặt cục bộ chỉ dành cho người dùng mơ hồ, không phải cho root: đây là điều tôi muốn).

Vậy ... làm thế nào tôi có thể chỉ định executekhối đầu bếp này chạy như người dùng mơ hồ và không root?


CẬP NHẬT : Tôi nghĩ rằng điều này tổng hợp vấn đề của tôi:

(ssh) /vagrant git:backbone ❯ whoami
vagrant

(ssh) /vagrant git:backbone ❯ which npm
/home/vagrant/.local/bin/npm

(ssh) /vagrant git:backbone ❯ echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i which npm
npm not found

thông qua http://tickets.opscode.com/browse/CHEF-2517


CẬP NHẬT KHÁC : Vì vậy, tôi chỉ nhận thấy sự khác biệt này:

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i echo $PATH
/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

(ssh) /vagrant git:backbone ❯ sudo -H -u vagrant -i export
HOME=/home/vagrant
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LOGNAME=vagrant
MAIL=/var/mail/vagrant
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
SHELL=/bin/zsh
SSH_AUTH_SOCK=/tmp/ssh-uJUopA4146/agent.4146
SUDO_COMMAND='/bin/zsh -c export'
SUDO_GID=1001
SUDO_UID=1000
SUDO_USER=vagrant
TERM=xterm
USER=vagrant

Nhận thấy sự khác biệt trong PATH? Xuất khẩu không có /home/vagrant/.local/binthư mục được liệt kê trong đó ... tại sao tiếng vang đầu tiên sẽ trở lại PATHvới nó và lần xuất thứ hai trở lại PATHmà không có nó? Đây có phải là vấn đề?

Câu trả lời:


13

Để thực thi tập lệnh hoặc lệnh với tư cách người dùng, bạn cần kết hợp su -lbash -i :

 execute "npm_install" do
    command "su vagrant -l -c 'cd /shared-with-host/helperScripts/ && bash -i npm install -g q zombie should mocha coffee-script'" 
    action :run
  end

Do một số lỗi , đầu bếp không đặt đúng môi trường cho người dùng được chỉ định thực thi . Giải pháp của narced133 sẽ không hoạt động.


6

Bạn có thể sử dụng environmentđể đặt các biến môi trường HOME và USER trong khối thực thi của mình.

execute "install q and zombiejs" do                                             
    cwd "/home/vagrant"                                                           
    user "vagrant"                                                                
    action :run   
    environment ({'HOME' => '/home/vagrant', 'USER' => 'vagrant'})                                                             
    command "npm install -g q zombie should mocha coffee-script"                  
end

Tôi sử dụng điều này thường xuyên để cài đặt các plugin mơ hồ với tư cách là người dùng mơ hồ bên trong máy ảo của tôi. Bạn cũng có thể đặt các biến môi trường khác nếu cần bằng bất kỳ lệnh nào bạn đang cố thực hiện.


Đây là một câu trả lời rất rõ ràng IMHO.
Ben Liyanage

2

Nghe có vẻ như Chef đang thực thi với tư cách là người dùng mơ hồ nhưng không tìm kiếm cùng một PATH như vỏ của bạn. Đăng nhập bằng cách sử dụng vagrant sshvà chạy which npm. Nó sẽ trả lại một cái gì đó như /path/to/bin/npm. Thay thế /path/to/bin/bên dưới để buộc Chef tìm kiếm thư mục thích hợp.

execute "install q and zombiejs" do                                             
    cwd "/home/vagrant"                                                           
    user "vagrant"                                                                
    action :run   
    path ["/path/to/bin/"]                                                               
    command "npm install -g q zombie should mocha coffee-script"                  
end

Chỉ cần thử nó; không có con xúc xắc. Vẫn thất bại với cùng một lỗi trong bài. Bất cứ một đề nghị nào khác?
neezer

Có thể thử trỏ lệnh trực tiếp vào liên kết tượng trưng npm thay vì cố gắng thực hiện đúng đường dẫn. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133

Tôi có thể xác nhận rằng "đường dẫn" không làm gì cả, nhưng việc trỏ lệnh trực tiếp vào nhị phân thực hiện thủ thuật. Điều này có vẻ như là một lỗi trong Chef.
FRKT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.