`jalankan` sebagai pengguna gelandangan, bukan root, dengan chef-solo?

10

Saya mencoba menjalankan perintah koki berikut:

# 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

Tetapi terus gagal karena tidak dapat menemukan npm:

mengeksekusi [install q dan zombiejs] (chef-redtail :: default line 205) memiliki kesalahan: Errno :: ENOENT: Tidak ada file atau direktori seperti itu - npm install -gq zombie harus mocha coffee-script

Masuk ke gelandangan melalui vagrant sshdan menjalankan perintah secara manual berfungsi dengan baik. Masuk sebagai root, melalui sudo -idan menjalankan perintah gagal karena alasan yang sama resep koki gagal (npm diinstal secara lokal hanya untuk pengguna gelandangan, bukan untuk root: ini yang saya inginkan).

Jadi ... bagaimana saya bisa menentukan executeblok koki ini untuk dijalankan sebagai pengguna gelandangan dan bukan root?


UPDATE : Saya pikir ini meringkas masalah saya:

(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

via http://tickets.opscode.com/browse/CHEF-2517


PEMBARUAN LAIN : Jadi saya perhatikan perbedaan ini:

(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

Perhatikan perbedaannya PATH? Ekspor tidak memiliki /home/vagrant/.local/bindirektori yang terdaftar di dalamnya ... mengapa gema pertama kembali PATHdengan itu dan ekspor kedua PATHtanpa itu? Apakah ini masalahnya?

neezer
sumber

Jawaban:

13

Untuk menjalankan skrip atau perintah sebagai pengguna, Anda harus menggabungkan su -l dan bash -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

Karena beberapa bug , chef tidak mengatur dengan benar lingkungan untuk pengguna tertentu dalam mengeksekusi . Solusi narced133 tidak akan bekerja.

Skarab
sumber
6

Anda bisa menggunakan environmentuntuk mengatur variabel lingkungan HOME dan USER di blok eksekusi Anda.

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

Saya sering menggunakan ini untuk menginstal plugin gelandangan sebagai pengguna gelandangan di dalam VM saya. Anda juga dapat mengatur variabel lingkungan lain jika diperlukan oleh perintah apa pun yang Anda coba jalankan.

Michael Goetz
sumber
Ini adalah jawaban IMHO yang sangat bersih.
Ben Liyanage
2

Sepertinya Chef mengeksekusi sebagai pengguna gelandangan tetapi tidak mencari PATH yang sama dengan shell Anda. Login menggunakan vagrant sshdan menjalankan which npm. Ini akan mengembalikan sesuatu seperti /path/to/bin/npm. Ganti di /path/to/bin/bawah ini untuk memaksa Chef untuk mencari direktori yang sesuai.

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
narced133
sumber
Baru saja mencobanya; tidak ada dadu. Masih gagal dengan kesalahan yang sama di pos. Ada saran lain?
neezer
Bisa mencoba mengarahkan perintah langsung ke symlink npm daripada mencoba untuk mendapatkan jalan yang benar. command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133
Saya dapat mengkonfirmasi bahwa "jalan" tidak melakukan apa-apa, tetapi mengarahkan perintah langsung ke biner melakukan trik. Sepertinya ini bug di Chef.
FRKT