【问题标题】: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 安装来解决它。