如何以不同的用户身份执行rbenv?

时间:2013-12-12 06:46:57

标签: bash rbenv

我正在bash中编写一个安装脚本,它将在配置新服务器时以root用户身份运行。它将为部署用户安装rbenv并安装一些默认的rubies / gems。我的脚本已经完成到设置rbenv的程度,但它不能像部署用户那样安装rubies。我知道rbenv设置正确,因为当我作为部署用户SSH时,我可以像往常一样访问rbenv。这是我到目前为止所做的:

# install rbenv
git clone https://github.com/sstephenson/rbenv.git /home/deploy/.rbenv

# install ruby-build and auto-rehash plugins
git clone https://github.com/sstephenson/ruby-build.git /home/deploy/.rbenv/plugins/ruby-build
git clone https://github.com/sstephenson/rbenv-gem-rehash.git /home/deploy/.rbenv/plugins/rbenv-gem-rehash

# fix permissions since we've been running as root
chown -R deploy:deploy /home/deploy/.rbenv

# setup rbenv
echo "export PATH=\"~/.rbenv/shims:~/.rbenv/bin:$PATH\"" >> /home/deploy/.bashrc
echo 'eval "$(rbenv init -)"' >> /home/deploy/.bashrc

# now install default ruby
sudo -i -u deploy /bin/bash - <<-EOF
    rbenv install $ruby_version
    rbenv global $ruby_version
    echo 'gem: --no-ri --no-rdoc' > ~/.gemrc
    gem install bundler
EOF

我尝试了-i-H-l的所有组合,但我一直在想:

  

/ bin / bash:rbenv:找不到命令

我做错了什么?

3 个答案:

答案 0 :(得分:1)

看一下〜/ .bashrc的顶部。可能你会发现这段代码:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

这意味着,如果bashrc没有以交互方式运行,则会返回。

因此,sudo -i -u deploy /bin/bash -i - <<-EOF应该像魅力一样工作

答案 1 :(得分:0)

如果安装了rbenv并且您收到command not found错误,则表示您可能遇到PATH问题。您将必要的PATH放入部署用户的~/.bashrc文件中。但是,bash仅保证在shell 交互式和非登录时读取~/.bashrc。我建议将PATH语句放在一个已读取的脚本中,或者更容易在here脚本中提供显式路径。

当作为登录shell调用时(根据sudo -i),bash将读取/etc/profile(如果存在)。然后它将从列表中读取它找到的第一个文件(第一个文件):~/.bash_profile~/.bash_login~/.profile

最后需要注意的是,脚本创建的~/.bashrc文件归root所有。您可能希望确保您的用户有权阅读该用户,或者通过chown与他~/.rbenv文件一样授予他所有权。

答案 2 :(得分:0)

我尝试使用Ansible 2.1在一个流浪盒上使用rbenv安装ruby-2.2.3时遇到了同样的问题。

rbenv安装在名为rails的ubuntu上的用户上,但当ansible连接到我的ubuntu框时,它会丢失env。在/home/rails/.bashrc中定义的$ PATH它只是默认为ansible_env.PATH

假设您已按照以下步骤安装了rbenv:

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

git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

要使路径正常工作,我需要手动设置它,所以对于我所做的特定任务:

- name: install rubies
  become_user: rails
  environment: 
    PATH: "{{ ansible_env.PATH }}:/home/rails/.rbenv/shims:/home/rails/.rbenv/bin "
  shell: '{{ rbenv_shell }} -lc "rbenv install {{ item[0] }}"'
  ...

这会将你的rbenv命令的路径附加到ansible_env.PATH查找并使其按预期工作。