【问题标题】:Puppet: How to reload enviroment when installing gem package - rbenv version is not activePuppet:安装 gem 包时如何重新加载环境 - rbenv 版本未激活
【发布时间】:2019-02-23 10:58:54
【问题描述】:

我有一个正在运行的 puppet 服务器,并希望在 puppet 代理上执行以下步骤:

  • 从git服务器下载rbenv到/usr/local/rbenv(成功)
  • 从 git 服务器下载 ruby​​-build(成功)
  • /etc/profile.d 中创建文件 rbenv.sh,以便在每次登录时加载 rbenv-environment(成功)
  • 使用带有rbenv install 的exec-resource 安装特定的ruby 版本(成功)
  • 使用带有rbenv global 的exec-resource 激活特定的ruby 版本(当前登录失败)
  • 安装特定的 ruby​​ gem(由于 ruby​​ 版本依赖而失败)

问题是,rbenv 从 puppet 中的 exec-resource 开始切换子 shell 中的 ruby​​ 版本,并将该信息存储在某处。当前 shell 的 ruby​​ 版本,我 startet puppet agent --test 没有改变。注销后再次登录,puppet运行成功,因为环境再次加载成功。

所以我的问题是:是否有可能在新的子外壳中运行包提供程序?还是我必须使用另一个运行 gem install 的 exec?

【问题讨论】:

    标签: ruby rubygems version puppet rbenv


    【解决方案1】:

    我遇到了同样的问题,并努力寻找解决方案。我希望我的服务器从头开始成功配置,因此运行配置两次不会削减它。

    我通过向 shim'ed gem 添加符号链接来解决此问题。 Puppet 在那里寻找 gem 提供者。

    这对我有用...

      include rbenv
    
      rbenv::plugin {'rbenv/ruby-build':}
      -> rbenv::build { '2.5.3':
        global => true,
      }
      -> file { '/usr/bin/gem':
        ensure => link,
        target => '/usr/local/rbenv/shims/gem',
      }
      -> package {'passenger':
        ensure   => '6.0.1',
        provider => gem,
      }
    

    【讨论】:

      【解决方案2】:

      所以我的问题是:是否有可能在新的子外壳中运行包提供程序?还是我必须使用另一个运行 gem install 的 exec?

      没有。提供程序在主机 Ruby 实例中运行。它们可能会启动外部命令,包括 shell,但它们本身并不是这样运行的。

      另外,你说,

      注销再登录后,puppet运行成功,因为 环境再次加载成功。

      如果确实需要注销并重新登录以使 rbenv 重新配置处于活动状态(尚不清楚),那么在子 shell 中运行提供程序无论如何都不会有效。也不会通过Exec 运行gem install,除非Exec 也明确激活了所需的Ruby 环境。

      如果您使用 Puppet 将系统的默认 Ruby 换出,从其自身下方换出,那么您需要为不一致的行为做好准备。您可以通过使用适当的 Exec 来执行 gem 安装来解决它。

      【讨论】:

        猜你喜欢
        • 2017-05-27
        • 2019-10-26
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多