rootではなくvagrant userとしてchef-soloで「実行」しますか?


10

次のchefコマンドを実行しようとしています。

# 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

しかし、それが見つからないために失敗し続けますnpm

execute [install q and zombiejs](chef-redtail :: default line 205)エラーが発生しました:Errno :: ENOENT:そのようなファイルまたはディレクトリはありません-npm install -gq zombie should mocha coffee-script

vagrant sshコマンドを使用してvagrantにログインし、コマンドを手動で実行すると、完全に正常に機能します。rootとしてログインしsudo -i、コマンドを実行してコマンドを実行すると、chefレシピが失敗するのと同じ理由で失敗します(npmはvagrantユーザーに対してのみローカルにインストールされ、rootではなくインストールされます。これが私が望んでいることです)。

では、どうすればこのchef executeブロックをrootではなくvagrant userとして実行するように指定できますか?


更新:これは私の問題を要約すると思います:

(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

http://tickets.opscode.com/browse/CHEF-2517経由


別の更新:それで私はこの矛盾に気づきました:

(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

の違いに注意してくださいPATH。エクスポートには/home/vagrant/.local/binディレクトリがリストされていません...なぜ最初のエコーPATHはそれで戻り、2番目のエクスポートはPATHそれなしで戻るのですか?これは問題ですか?

回答:


13

スクリプトまたはコマンドをユーザーとして実行するには、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

そのためのいくつかのバグ、シェフがで指定されたユーザーのための適切な環境を設定していない実行します。narced133のソリューションは機能しません。


6

を使用environmentして、実行ブロックにHOMEおよびUSER環境変数を設定できます。

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

私はこれを頻繁に使用して、自分のVM内にvagrantユーザーとしてvagrantプラグインをインストールします。実行しようとしているコマンドで必要に応じて、他の環境変数を設定することもできます。


これは非常に明確な答えです。
Ben Liyanage 2017

2

Chefはvagrant userとして実行されているようですが、シェルと同じPATHを検索していません。を使用vagrant sshしてログインし、を実行しwhich npmます。それはのようなものを返します/path/to/bin/npm/path/to/bin/Chefが適切なディレクトリを検索するように強制するには、以下を置き換えます。

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

試してみただけです。サイコロはありません。それでも投稿で同じエラーが発生して失敗します。他に何か提案はありますか?
neezer

パスを正しく取得するのではなく、npmシンボリックリンクでコマンドを直接指定してみてください。command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133 2012年

「パス」は何もしないことを確認できますが、コマンドをバイナリに直接ポイントすることでうまくいきます。これはChefのバグのようです。
FRKT、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.