Puppet:安装 gem 包时如何重新加载环境 - rbenv 版本未激活

Posted

技术标签:

【中文标题】Puppet:安装 gem 包时如何重新加载环境 - rbenv 版本未激活【英文标题】:Puppet: How to reload enviroment when installing gem package - rbenv version is not active 【发布时间】: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?

【问题讨论】:

【参考方案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 安装来解决它。

【讨论】:

以上是关于Puppet:安装 gem 包时如何重新加载环境 - rbenv 版本未激活的主要内容,如果未能解决你的问题,请参考以下文章

Puppet

搭建Puppet自动化部署环境

Windows环境下Ruby离线安装gem包

安装 JSON gem 的本机扩展错误

为调试 Logstash Grok表达式,安装 GrokDebuger 环境

gem安装软件时遇到的问题以及解决思路