我正在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:找不到命令
我做错了什么?
答案 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查找并使其按预期工作。