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 版本未激活的主要内容,如果未能解决你的问题,请参考以下文章