在 Puppet 自定义类型中创建导出资源

Create exported resource inside Puppet custom type

我尝试在 Puppet 中创建自定义类型,以便根据某些主机状态生成一些内容(例如在 /etc 目录中生成令牌文件)。

我还想在这个自定义类型中创建 File[/etc/token] 并将其导出到 PuppetDB 以便在集群中的所有其他主机上收集它

我试过这样的代码,但它没有按预期工作:

  def generate
    return [] unless self[:export]

    cluster = self[:cluster]
    user    = self[:name]
    should  = self.should(:ensure) || :present

    path    = "/etc/#{cluster}.#{user}.token"
    return [] if catalog.resource(:file, path)

    token = Puppet::Resource.new(:file, path)
    token[:ensure] = should
    token[:content] = provider.create_token
    token.virtual = true
    token.exported = true

    [Puppet::Type.type(:file).new(token)]
  end

如果没有 token.virtual = truetoken.exported = true,此函数可以按预期在本地生成所需的文件,但我无法导出它

唯一的解决方法是使用包含所需内容的自定义事实,例如 $fact['user_token'] 并使用默认方式导出此内容:

  if $facts['user_token'] {
    @@file { '/etc/clustername.username.token':
      ensure  => file,
      content => $facts['user_token'],
    }
  }

有人知道如何在自定义类型代码中生成导出资源吗?

谢谢

Does anybody know how to generate exported resource inside custom type code?

您不能使用资源实例从目标节点提取的数据来导出资源。资源评估的时机和上下文都错了:

  • 目录构建时导出资源。当目录被应用到目标节点时,为时已晚。
  • 资源由 catalog-building 主机 导出。这通常是与目标节点不同的机器,它无法访问从目标节点获得的任何数据,除了节点事实。其他节点通常无法直接访问 exported-resource 数据,更不用说写入访问了。

另一方面,如果您不需要从目标节点提取数据(节点事实除外),那么您不需要在插件类型中完成这项工作。在这种情况下,通常的方法是为插件类型创建一个 defined-type 包装器,并将资源导出放在那里。