`เอ็กซีคิวต์ 'ในฐานะผู้ใช้คนจรจัด, ไม่หยั่งราก, กับพ่อครัวคนเดียว


10

ฉันพยายามเรียกใช้คำสั่งเชฟต่อไปนี้:

# 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:

ดำเนินการ [install q and zombiejs] (chef-redtail :: บรรทัดเริ่มต้น 205) มีข้อผิดพลาด: Errno :: ENOENT: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว - การติดตั้ง npm -gq zombie ควร mocha coffee-script

เข้าสู่ระบบคนจรจัดผ่านvagrant sshและเรียกใช้คำสั่งด้วยตนเองทำงานได้อย่างสมบูรณ์แบบได้อย่างสมบูรณ์แบบ การเข้าสู่ระบบในฐานะ root ผ่านsudo -iและเรียกใช้คำสั่งล้มเหลวด้วยเหตุผลเดียวกันสูตรอาหารเชฟล้มเหลว (มีการติดตั้ง npm ในเครื่องสำหรับผู้ใช้ที่ไม่ใช่คนธรรมดาไม่ใช่สำหรับรูท: นี่คือสิ่งที่ฉันต้องการ)

ดังนั้น ... ฉันจะระบุพ่อครัวexecuteบล็อกนี้ให้ทำงานในฐานะผู้ใช้งานคนจรจัดได้อย่างไรและไม่รูท?


UPDATE : ฉันคิดว่านี่เป็นปัญหาของฉัน:

(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พร้อมกับมันและการส่งออกครั้งที่สองกลับมาPATHโดยไม่มีมัน นี่เป็นปัญหาหรือไม่

คำตอบ:


13

ในการรันสคริปต์หรือคำสั่งในฐานะผู้ใช้คุณต้องรวมsu -lและ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

เพราะข้อบกพร่องบางอย่างเชฟไม่ได้กำหนดอย่างถูกต้องสภาพแวดล้อมสำหรับผู้ใช้ที่ระบุในการดำเนินการ โซลูชันของ 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

ฉันใช้สิ่งนี้บ่อยครั้งเพื่อติดตั้งปลั๊กอินคนจรจัดในฐานะผู้ใช้คนจรจัดภายใน VMs ของฉัน คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมอื่น ๆ ได้หากต้องการโดยคำสั่งอะไรก็ตามที่คุณพยายามเรียกใช้


นี่เป็นคำตอบที่สะอาดมาก IMHO
Ben Liyanage

2

ดูเหมือนว่า Chef กำลังดำเนินการในฐานะผู้ใช้คนจรจัด แต่ไม่ได้ค้นหา PATH เหมือนกับเชลล์ของคุณ เข้าสู่ระบบโดยใช้และเรียกใช้vagrant ssh มันจะกลับมาบางอย่างเช่นwhich npm /path/to/bin/npmแทนที่/path/to/bin/ด้านล่างเพื่อบังคับให้เชฟค้นหาไดเรกทอรีที่เหมาะสม

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

สามารถลองชี้คำสั่งโดยตรงที่ symlink npm แทนที่จะพยายามทำให้เส้นทางถูกต้อง command "/home/vagrant/.local/bin/npm install -g q zombie should mocha coffee-script
narced133

ฉันสามารถยืนยันได้ว่า "เส้นทาง" ไม่ได้ทำอะไรเลย แต่การชี้คำสั่งไปยังไบนารีโดยตรงนั้นเป็นการหลอกลวง ดูเหมือนว่าจะเป็นข้อบกพร่องใน Chef
FRKT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.