Chef bash resource tidak mengeksekusi sebagai pengguna yang ditentukan

11

Saya sedang menulis buku masak Chef untuk menginstal Hubot . Dalam resepnya, saya melakukan hal berikut:

bash "install hubot" do
  user hubot_user
  group hubot_group
  cwd install_dir
  code <<-EOH
    wget https://github.com/downloads/github/hubot/hubot-#{node['hubot']['version']}.tar.gz && \
    tar xzvf hubot-#{node['hubot']['version']}.tar.gz && \
    cd hubot && \
    npm install
  EOH
end

Namun, ketika saya mencoba menjalankan chef-client di server menginstal buku masak, saya mendapat izin ditolak menulis ke direktori pengguna yang menjalankan chef-client, bukan pengguna hubot. Untuk beberapa alasan, npmsedang mencoba untuk berjalan di bawah pengguna yang salah, bukan pengguna yang ditentukan dalam sumber daya bash.

Saya dapat menjalankan sudo su - hubot -c "npm install /usr/local/hubot/hubot"secara manual, dan ini mendapatkan hasil yang saya inginkan (menginstal hubot sebagai pengguna hubot). Namun, tampaknya chef-client tidak menjalankan perintah sebagai pengguna hubot. Di bawah ini Anda akan menemukan eksekusi koki-klien. Terima kasih sebelumnya.

Saving to: `hubot-2.1.0.tar.gz'

     0K ......                                                100%  563K=0.01s

2012-01-23 12:32:55 (563 KB/s) - `hubot-2.1.0.tar.gz' saved [7115/7115]

npm ERR! Could not create /home/<user-chef-client-uses>/.npm/log/1.2.0/package.tgz
npm ERR! Failed creating the tarball.
npm ERR! couldn't pack /tmp/npm-1327339976597/1327339976597-0.13104878342710435/contents/package to /home/<user-chef-client-uses>/.npm/log/1.2.0/package.tgz
npm ERR! error installing [email protected] Error: EACCES, permission denied '/home/<user-chef-client-uses>/.npm/log'

...

npm not ok
---- End output of "bash"  "/tmp/chef-script20120123-25024-u9nps2-0" ----
Ran "bash"  "/tmp/chef-script20120123-25024-u9nps2-0" returned 1
Arthur Maltson
sumber
Tunggu dulu, Anda mengatakan Anda menjalankan chef-client sebagai pengguna non-root?
cjc
Itu adalah pengguna yang memiliki hak sudo. Itu sama dengan yang saya gunakan untuk bootstraping node.
Arthur Maltson
Tapi Anda melakukan "sudo chef-client", kan?
cjc
Anda mungkin harus menjalankan chef sebagai root.
Mike Fiedler
Chef berjalan sebagai pengguna root.
Arthur Maltson

Jawaban:

8

Masalahnya (kemungkinan) bukan Chef yang menjalankan perintah sebagai pengguna yang salah, tetapi shell yang menjalankan skrip Anda bukan shell login. Ini berarti bahwa beberapa variabel lingkungan (seperti HOME) tidak akan diatur seperti yang Anda harapkan, mengarahkan npm untuk mencoba menulis file di tempat yang salah.

Masalahnya dibahas dalam edisi CHEF-2288 . Sementara itu tetap luar biasa, Anda dapat mencoba menambahkan HOME=/home/hubot-userdi blok kode Anda, sebelum npm dipanggil.

rts
sumber
4

Diambil dari komentar di CHEF-2288 :

environment ({ 'HOME' => ::Dir.home('USERNAME'), 'USER' => 'USERNAME' })

Bekerja untukku!

Dalam kasus Anda:

environment ({ 'HOME' => ::Dir.home(hubot_user), 'USER' => hubot_user })

claptimes
sumber
2
Ini mengasumsikan hubot_usertelah dibuat sebelum menjalankan chef-client. Ini karena Dir.homeperintah dijalankan ketika file dimuat, bukan ketika resep dijalankan. Saat membuat mesin baru, ini kemungkinan besar akan terjadi sebelum salah satu resep kreasi pengguna Anda berjalan dan akan mengakibatkan kegagalan.
Russ Bradberry
Untuk pertanyaan yang diajukan, jawaban ini berfungsi dengan baik.
lihat
1
bukan pada bootstrap pertama dari mesin, itu tidak. ini hanya berfungsi jika pengguna sudah ada di mesin.
Russ Bradberry
Saya akan kedua bahwa ini bukan solusi jika chef juga mengelola pengguna yang bersangkutan karena kode ini dijalankan pada fase kompilasi, sebelum eksekusi resep apa pun. ada retas yang lebih besar di sekitarnya mungkin untuk mendorongnya ke tahap kedua, tetapi ...... melakukan 'HOME' => "/ home / # {hubut_user}" akan bekerja karena itu hanya string yang lewat - tetapi tentu saja tidak memiliki sentuhan ajaib.
tajam
1

Setelah: /server//a/432916/129232

Untuk menjalankan skrip atau perintah sebagai pengguna, Anda harus menggabungkan su -l dan bash -i , misal:

 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 .

Skarab
sumber