2015-03-18 16 views
13

Tôi đang sử dụng Vagrant + VirtualBox để thiết lập máy ảo cho ứng dụng Rails của tôi. Tôi đang làm việc trên dọn dẹp một kịch bản .sh cung được tham chiếu trong Vagrantfile như vậy:Cung cấp VM Vagrant/VirtualBox: rbenv cài đặt thành công nhưng sử dụng sau đó trong tập lệnh thất bại

config.vm.provision "shell", path: "script/provision-script.sh" 

Kịch bản cung hiện một số điều, nhưng về phía cuối cùng nó là vụ phải cài đặt rbenv của Ruby versioning và sau đó sử dụng rbenv để cài đặt Ruby 2.2.1. Phần đó của tập lệnh cung cấp trông giống như sau:

echo "setting up rbenv" 
# execute the remaining commands as vagrant user, instead of root 
sudo -H -u vagrant bash -c "git clone https://github.com/sstephenson/rbenv.git ~vagrant/.rbenv" 
sudo -H -u vagrant bash -c "git clone https://github.com/sstephenson/ruby-build.git ~vagrant/.rbenv/plugins/ruby-build" 
sudo -H -u vagrant bash -c "git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~vagrant/.rbenv/plugins/rbenv-gem-rehash" 
echo "setting up rbenv environment in bash" 
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~vagrant/.bashrc 
echo 'eval "$(rbenv init -)"' >> ~vagrant/.bashrc 

# start new vagrant shell so rbenv will work 
echo "building ruby" 
su vagrant 
rbenv install 2.2.1 && rbenv global 2.2.1 && rbenv rehash && cd /path/to/my/app && gem install bundler rake && rbenv rehash && bundle && rbenv rehash 

Mọi thứ đến phần rbenv install... hoạt động chính xác. Cài đặt ruby ​​không thành công với lỗi sau:

==> default: setting up rbenv 
==> default: Cloning into '/home/vagrant/.rbenv'... 
==> default: Cloning into '/home/vagrant/.rbenv/plugins/ruby-build'... 
==> default: Cloning into '/home/vagrant/.rbenv/plugins/rbenv-gem-rehash'... 
==> default: setting up rbenv environment in bash 
==> default: building ruby 
==> default: /tmp/vagrant-shell: line 73: rbenv: command not found 

Tập lệnh sau đó kết thúc. Tôi có thể mở các vm với vagrant ssh và sau đó chạy thành công rbenv install 2.2.1, vì vậy tôi đoán rằng trong khi cung cấp một vỏ lang thang mới không thực sự đang được bắt đầu. Tôi đã có ấn tượng rằng điều này sẽ xảy ra với su vagrant ngay trước rbenv install 2.2.1.

Tôi có thể làm gì để đảm bảo rằng trình bao mới được khởi tạo trong khi cấp phép này và lệnh rbenv sẽ hoạt động?

+0

Vui lòng xem xét gắn cờ câu trả lời của tôi là câu trả lời hợp lệ. Cảm ơn –

Trả lời

23

Tôi có vấn đề tương tự bởi vì tôi đã cố gắng để cài đặt rbenv và trích lập dự phòng lang thang đã được đưa ra để cho tôi những lỗi:

==> default: /tmp/vagrant-shell: line 10: rbenv: command not found 

Trước hết là rất quan trọng để hiểu rằng tập lệnh cung cấp ngữ pháp đang chạy ở chế độ sudo. Vì vậy, khi vào tập lệnh, chúng tôi tham chiếu đến ~/path, chúng tôi đang tham chiếu đến/root/path và không tới/home/vagrant/path. Vấn đề là tôi đã cài đặt rbenv cho người dùng root và sau khi cố gắng gọi lệnh rbenv từ người dùng lang thang và tất nhiên nó không hoạt động!

Vì vậy, những gì tôi đã làm là chỉ định để lang thang để chạy Provisioner trong NOT dùng sudo thêm đặc quyền: false:

config.vm.provision :shell, privileged: false, inline: $script 

Sau đó vào kịch bản của tôi, tôi đã được xem xét rằng tất cả mọi thứ được gọi là từ người dùng lang thang. Ở đây câu trả lời @Casper đã giúp tôi rất nhiều, bởi vì nó chỉ hoạt động băng việc xac định: sudo -u -H lang thang bash -i -c '......'

Since you just updated .bashrc with a new path and other settings, you will want to run "sudo bash" with the -i option. This will force bash to simulate an interactive login shell, and therefore read .bashrc and load the correct path for rbenv.

Dưới Vagrantfile cuối cùng của tôi .

# -*- mode: ruby -*- 
# vi: set ft=ruby : 

$script = <<SCRIPT 
    sudo apt-get -y update 
    sudo apt-get -y install curl git-core python-software-properties ruby-dev libpq-dev build-essential nginx libsqlite3-0 libsqlite3-dev libxml2 libxml2-dev libxslt1-dev nodejs postgresql postgresql-contrib imagemagick 

    git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc 
    echo 'eval "$(rbenv init -)"'    >> ~/.bashrc 
    source ~/.bashrc 

    git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build 
    sudo -H -u vagrant bash -i -c 'rbenv install 2.1.3' 
    sudo -H -u vagrant bash -i -c 'rbenv rehash' 
    sudo -H -u vagrant bash -i -c 'rbenv global 2.1.3' 
    sudo -H -u vagrant bash -i -c 'gem install bundler --no-ri --no-rdoc' 
    sudo -H -u vagrant bash -i -c 'rbenv rehash' 
    sudo -u postgres createdb --locale en_US.utf8 --encoding UTF8 --template template0 development 
    echo "ALTER USER postgres WITH PASSWORD \'develop\';" | sudo -u postgres psql 
SCRIPT 

VAGRANTFILE_API_VERSION = "2" 

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 
    config.vm.box = "hashicorp/precise64" 
    config.vm.network "forwarded_port", guest: 3000, host: 3000 

    # config.vm.provider :virtualbox do |vb| 
    # vb.customize ["modifyvm", :id, "--memory", "1024"] 
    # end 

    config.vm.provision :shell, privileged: false, inline: $script 
end 

Hy vọng nó sẽ hữu ích cho người khác.

+1

Tuyệt vời! Bạn đã làm cho ngày của tôi với mẹo này, cảm ơn bạn. Đây sẽ là câu trả lời được chấp nhận. – soutoner

+0

Bạn được chào đón! :) –

3

Tôi ngạc nhiên khi thoát tập lệnh cấp phép, khi chạy su vagrant lý thuyết nên treo tập lệnh tại thời điểm đó (bạn đang chạy lệnh su thường không tự thoát).

Sự cố là bạn không thể thay đổi người dùng đang chạy tập lệnh shell "đang chạy" bằng cách chạy su.
Tùy chọn duy nhất của bạn là sử dụng sudo.

Vì bạn vừa cập nhật .bashrc với đường dẫn mới và các cài đặt khác, bạn sẽ muốn chạy "sudo bash" với tùy chọn -i. Điều này sẽ buộc bash để mô phỏng một vỏ đăng nhập tương tác, và do đó đọc .bashrc và tải đường dẫn chính xác cho rbenv.

Vì vậy, một cái gì đó như thế này hy vọng sẽ làm việc:

echo "building ruby" 
sudo -H -u vagrant bash -i -c 'rbenv install 2.2.1 ...' 
Các vấn đề liên quan