Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用Ansible安装Bundler gem_Ruby_Ubuntu_Rubygems_Bundler_Ansible - Fatal编程技术网

Ruby 使用Ansible安装Bundler gem

Ruby 使用Ansible安装Bundler gem,ruby,ubuntu,rubygems,bundler,ansible,Ruby,Ubuntu,Rubygems,Bundler,Ansible,我正在尝试使用Ansible在我的VPS上安装Bundler 我已经设置了rbenv,全局ruby是2.1.0 如果我以root用户身份SSH到服务器中并运行gem install bundler,它将安装得非常完美 我已经尝试了以下三种使用Ansible安装Bundler gem的方法,这三种方法都没有产生错误,但是当我使用SSH并运行gem list时,Bundler就不见了 尝试1: --- - name: Install Bundler shell: gem install bund

我正在尝试使用Ansible在我的VPS上安装Bundler

我已经设置了rbenv,全局ruby是2.1.0

如果我以root用户身份SSH到服务器中并运行
gem install bundler
,它将安装得非常完美

我已经尝试了以下三种使用Ansible安装Bundler gem的方法,这三种方法都没有产生错误,但是当我使用SSH并运行
gem list
时,Bundler就不见了

尝试1:

---
- name: Install Bundler
  shell: gem install bundler
尝试2:

---
- name: Install Bundler
  shell: gem install bundler
尝试3:

---
- name: Install Bundler
  gem: name=bundler
       state=latest
我还尝试了最后一次使用
user\u install=yes
user\u install=no
的尝试,两者都没有任何区别

有没有办法通过Ansible正确安装Bundler

我在这方面已经做了一段时间了,我已经安装了1个ruby版本:2.1.0,我发现rbenv的垫片目录不包含
bundle
的垫片

捆绑
的垫片应该在那里吗?我只是弄不明白为什么capistrano在运行
sudo gem list
时找不到
bundle
命令,但在运行
gem list
时却找不到

root@weepingangel:/usr/local/rbenv/shims# echo $PATH
/usr/local/rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
root@weepingangel:/usr/local/rbenv/shims# gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.2.0
  - RUBY VERSION: 2.1.0 (2013-12-25 patchlevel 0) [x86_64-linux]
  - INSTALLATION DIRECTORY: /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0
  - RUBY EXECUTABLE: /usr/local/rbenv/versions/2.1.0/bin/ruby
  - EXECUTABLE DIRECTORY: /usr/local/rbenv/versions/2.1.0/bin
  - SPEC CACHE DIRECTORY: /root/.gem/specs
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0
     - /root/.gem/ruby/2.1.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
     - :sources => ["http://gems.rubyforge.org", "http://gems.github.com"]
     - "gem" => "--no-ri --no-rdoc"
  - REMOTE SOURCES:
     - http://gems.rubyforge.org
     - http://gems.github.com
  - SHELL PATH:
     - /usr/local/rbenv/versions/2.1.0/bin
     - /usr/local/rbenv/libexec
     - /usr/local/rbenv/shims
     - /usr/local/sbin
     - /usr/local/bin
     - /usr/sbin
     - /usr/bin
     - /sbin
     - /bin
     - /usr/games
有什么想法吗

因此,我认为我有两个主要问题:

  • 为什么bundler只有在我运行
    sudo gem list
    时才可见

  • root@weepingangel:/usr/local/rbenv/shims# echo $PATH
    /usr/local/rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    root@weepingangel:/usr/local/rbenv/shims# gem environment
    RubyGems Environment:
      - RUBYGEMS VERSION: 2.2.0
      - RUBY VERSION: 2.1.0 (2013-12-25 patchlevel 0) [x86_64-linux]
      - INSTALLATION DIRECTORY: /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0
      - RUBY EXECUTABLE: /usr/local/rbenv/versions/2.1.0/bin/ruby
      - EXECUTABLE DIRECTORY: /usr/local/rbenv/versions/2.1.0/bin
      - SPEC CACHE DIRECTORY: /root/.gem/specs
      - RUBYGEMS PLATFORMS:
        - ruby
        - x86_64-linux
      - GEM PATHS:
         - /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0
         - /root/.gem/ruby/2.1.0
      - GEM CONFIGURATION:
         - :update_sources => true
         - :verbose => true
         - :backtrace => false
         - :bulk_threshold => 1000
         - :sources => ["http://gems.rubyforge.org", "http://gems.github.com"]
         - "gem" => "--no-ri --no-rdoc"
      - REMOTE SOURCES:
         - http://gems.rubyforge.org
         - http://gems.github.com
      - SHELL PATH:
         - /usr/local/rbenv/versions/2.1.0/bin
         - /usr/local/rbenv/libexec
         - /usr/local/rbenv/shims
         - /usr/local/sbin
         - /usr/local/bin
         - /usr/sbin
         - /usr/bin
         - /sbin
         - /bin
         - /usr/games
    
  • 我的意思是:

    INFO [18d5838c] Running /usr/bin/env bundle install --binstubs  
    /var/rails_apps/neiltonge/shared/bin --path  
    /var/rails_apps/neiltonge/shared/bundle --without development test
    --deployment --quiet on 188.226.159.96 DEBUG [18d5838c] Command: cd /var/rails_apps/neiltonge/releases/20140301205432 && ( PATH=$PATH
    /usr/bin/env bundle install --binstubs
    /var/rails_apps/neiltonge/shared/bin --path
    /var/rails_apps/neiltonge/shared/bundle --without development test
    --deployment --quiet ) DEBUG [18d5838c]     /usr/bin/env: bundle: No such file or directory
    
    这是我的
    $PATH

    /usr/local/rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    

  • 为什么无法定位捆绑包?

    问题在于,通过ansible运行
    gem install bundler
    时,您没有正确初始化rbenv,因为
    rbenv init
    是在
    .bashrc
    .bash\u profile
    中运行的。因此,使用的
    gem
    命令是系统命令,而不是作为rbenv垫片安装的命令。因此,无论何时安装gem,它都是在系统范围内安装的,而不是在rbenv环境中

    要正确初始化rbenv,必须执行bash本身并明确声明它是一个登录shell,以便它读取其初始化文件:

    ansible your_host -m command -a 'bash -lc "gem install bundler"' -u your_rbenv_user 
    
    如果您确实想以root用户身份执行此操作,请将
    -u部分保留为您的\u rbenv\u用户

    如果上述命令起作用,您可以轻松地将其转换为剧本动作:

    - name: Install Bundler
      become_user: your_rbenv_user
      command: bash -lc "gem install bundler"
    

    这很麻烦,但这是我目前找到的唯一方法。

    当我尝试以另一个用户的身份运行命令时,我遇到了类似的环境问题。如本文所述,您有两个选项可以在登录shell中执行命令(这将加载用户环境)。例如,我想以rails用户身份安装bundler:


    由于Ansible 1.3,以下本机解决方案是可能的:

    - name: requirements for installing gems
      apt:
        name: {{ item }}
      with_items:
        - ruby
        - ruby-dev
        - make
    
    - name: install gem with proper $PATH
      gem:
        name: xyz
        user_install: no
    
    提及
    user\u install
    参数!此外,捆绑机安装的某些依赖项可能需要以下进一步的包依赖项:

    • zlib1g开发
      • 这对我来说很有效:

        - name: rubygems | install bundler
          shell: gem install bundler
        
        - name: rbenv | rehash
          shell: RBENV_ROOT={{ rbenv_root }} rbenv rehash
        

        有时,在系统上安装了bundler之后,使用rbenv,您需要通过运行
        rbenv rehash
        来更新
        $PATH
        。我刚刚用ansible做了同样的尝试,结果成功了。重新安装后,Bundler在my
        $PATH
        中可用。

        使用Ansible安装
        Bundler
        最干净、最快捷的方法是:

        只需使用角色并通过这样配置其插件安装
        rbenv
        (显然,要配置的参数不仅仅是插件):

        包含的插件
        rbenv default gems
        将在默认情况下添加
        bundler
        ,并在
        ruby
        版本的安装过程中添加到正确的目录中,您将获得SPCiefied

        然后确保
        bundler
        位于
        PATH


        就是这样。

        我让它像这样工作:

        -名称:安装jekyll和bundler
        成为用户:鲍勃
        宝石:
        名称:“{{item}}”
        环境:
        GEM\u HOME:/HOME/bob/gems
        路径:$PATH:/bin/:/usr/bin/:/home/bob/gems/bin
        有以下项目:
        -杰基尔
        -捆扎机
        
        用本地用户替换
        bob

        然后使用与捆绑机模块相同的原理

        -名称:安装Gems
        成为用户:鲍勃
        捆绑机:
        gemfile:/home/bob/gemfile
        国家:现在
        环境:
        
        - name: rubygems | install bundler
          shell: gem install bundler
        
        - name: rbenv | rehash
          shell: RBENV_ROOT={{ rbenv_root }} rbenv rehash
        
        rbenv_plugins:
        - { name: 'ruby-build',
            repo: 'https://github.com/rbenv/ruby-build.git',
            version: master }
        - { name: 'rbenv-default-gems',
            repo: 'https://github.com/rbenv/rbenv-default-gems.git',
            version: master }