【问题标题】:How does one handle a custom Puppet fact which depends on a gem module?如何处理依赖于 gem 模块的自定义 Puppet 事实?
【发布时间】:2021-12-17 07:26:53
【问题描述】:

假设我已经为 Puppet 定义了一个自定义事实,它依赖于 rbvmomi 模块。

# frozen_string_literal: true

require 'pathname'
require_relative 'rbvmomi'
require_relative 'rbvmomi/optimist'
require_relative 'optimist'
require_relative 'vm_tag_utility'

Facter.add('custom_attributes') do
  setcode do
    hostname = Facter.value('hostname')
    VmTagUtility.get_vm_custom_attributes(hostname)
  end
end

当 Puppet 应用于代理时,会遇到此错误:

Error: Facter: error while resolving custom facts in C:/ProgramData\PuppetLabs\puppet\cache\lib\facter\my_custom_fact.rb: cannot load such file -- C:/ProgramData/PuppetLabs/puppet/cache/lib/facter/rbvmomi

这告诉我 rbvmomi 不在代理上,或者不在 Puppet 搜索的路径中。

那么,管理自定义事实与任何支持 gem 模块之间的依赖关系的最佳方法是什么?

【问题讨论】:

    标签: puppet


    【解决方案1】:

    那么,管理自定义事实与任何支持 gem 模块之间的依赖关系的最佳方法是什么?

    您至少有以下选择:

    • 避免依赖 Puppet 发行版之外的任何 gem。
    • 在模块的lib 目录中包含所有需要的依赖项,以便它们与事实同步。
    • rescue the LoadError,并提供事实的替代版本(可能是虚拟的),或者如果发生,则根本没有事实。
      • 也许还让 Puppet 管理 gem,以便在下次运行时可以使用事实的常规版本
        • 这很棘手,因为您需要在 Puppet 的 Ruby 中安装 gem,而不是系统 Ruby,如果有的话。

    【讨论】:

    • 我不确定我是否可以安全地在模块的lib 中包含 gem 依赖项——这不是 gem 管理范围之外的隐形硬依赖项吗?编辑:还没有提交的意思...我相信我可以使用 puppet_gem 作为提供程序包的提供者,以通过选项进行木偶管理。我认为,这仍然会促进竞争条件——事实将在安装 gem 之前加载——但在随后的运行中应该没问题。不幸的是,如果不编写一些我们自己的 API 工作来复制 gem,我认为我们无法避免这种依赖关系。
    • 嗯,不,@JeremySylvis,不会有竞争条件。如果您依靠 Puppet 来安装 gem,那么在 Puppet 有机会安装 gem 之前肯定会加载事实。这就是为什么“让 Puppet 管理 gem”被格式化为“拯救 LoadError 和 [...]”的子点。
    • 除非我遗漏了一些东西,否则在应用类之前加载事实 - 第一次运行,会发生错误,因为在应用安装它的类之前加载了事实(尝试加载 rbvmomi)。您是否建议通过其他方式让 Puppet 提供宝石?
    • @JeremySylvis,是的,事实是在应用清单甚至构建之前加载的。这就是为什么没有竞争条件。事实上,在应用清单之前,肯定在运行开始时加载。您似乎忽略了要点,即您构建事实代码,以便由 rbvmomi 不可用引起的 LoadError 不会阻止事实(或至少包含它的 Ruby 代码)成功加载。这样你就可以越过这一点,以便 Puppet 可以安装 Gem,从而在 后续 运行中提供该事实。
    • 啊,我明白了。是的,我错过了。我会试一试的。
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2018-05-17
    • 2013-06-17
    • 2019-01-16
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多