【问题标题】:Why does puppet think my custom fact is a string?为什么 puppet 认为我的自定义事实是一个字符串?
【发布时间】:2017-08-01 03:01:29
【问题描述】:

我正在尝试创建一个自定义事实,我可以将其用作 hiera yaml 文件中类参数的值。

我正在使用openstack/puppet-keystone 模块,我想使用 fernet-keys。 根据模块中的cmets我可以使用这个参数。

# [*fernet_keys*]
#   (Optional) Hash of Keystone fernet keys
#   If you enable this parameter, make sure enable_fernet_setup is set to True.
#   Example of valid value:
#   fernet_keys:
#     /etc/keystone/fernet-keys/0:
#       content: c_aJfy6At9y-toNS9SF1NQMTSkSzQ-OBYeYulTqKsWU=
#     /etc/keystone/fernet-keys/1:
#       content: zx0hNG7CStxFz5KXZRsf7sE4lju0dLYvXdGDIKGcd7k=
#   Puppet will create a file per key in $fernet_key_repository.
#   Note: defaults to false so keystone-manage fernet_setup will be executed.
#   Otherwise Puppet will manage keys with File resource.
#   Defaults to false

所以写了这个自定义事实...

[root@puppetmaster modules]# cat keystone_fernet/lib/facter/fernet_keys.rb
Facter.add(:fernet_keys) do
  setcode do
    fernet_keys = {}

    puts ( 'Debug keyrepo is /etc/keystone/fernet-keys' )
    Dir.glob('/etc/keystone/fernet-keys/*').each do |fernet_file|
      data = File.read(fernet_file)
      if data
    content = {}
        puts ( "Debug Key file #{fernet_file} contains #{data}" )
        fernet_keys[fernet_file] = { 'content' => data }
      end
    end
    fernet_keys
  end
end

然后在我的 keystone.yaml 文件中有这一行:

keystone::fernet_keys: '%{::fernet_keys}'

但是当我在我的节点上运行 puppet agent -t 时,我得到了这个错误:

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Function Call, "{\"/etc/keystone/fernet-keys/1\"=>{\"content\"=>\"xxxxxxxxxxxxxxxxxxxx=\"}, \"/etc/keystone/fernet-keys/0\"=>{\"content\"=>\"xxxxxxxxxxxxxxxxxxxx=\"}}" is not a Hash.  It looks to be a String at /etc/puppetlabs/code/environments/production/modules/keystone/manifests/init.pp:1144:7 on node mgmt-01

我假设我已经正确格式化了哈希,因为 facter -p fernet_keys 在代理上输出了这个:

{
  /etc/keystone/fernet-keys/1 => {
    content => "xxxxxxxxxxxxxxxxxxxx="
  },
  /etc/keystone/fernet-keys/0 => {
    content => "xxxxxxxxxxxxxxxxxxxx="
  }
}

keystone 模块中的代码如下所示(带行号)

1142
1143   if $fernet_keys {
1144       validate_hash($fernet_keys)
1145       create_resources('file', $fernet_keys, {
1146           'owner'     => $keystone_user,
1147           'group'     => $keystone_group,
1148           'subscribe' => 'Anchor[keystone::install::end]',
1149         }
1150       )
1151     } else {

【问题讨论】:

  • 你没有任何意义。自定义事实和 Hiera 数据是完全不同的东西。 Puppet 没有提供任何现成的机制来使用自定义事实作为类参数值的数据源。如果这不能充分解决问题,请提供minimal reproducible example 来证明问题。请注意,真正的 MCVE 可能需要的代码比您在问题中已有的代码要少。
  • 我意识到自定义事实和 hiera 是两个不同的东西。但是你是说你不能在一个人的层次数据中使用事实吗?我认为在 hiera 数据中使用 $::fqdn 和 $::hostname 之类的事实很常见。在 hiera 数据中使用自定义事实有什么奇怪的?
  • 啊,现在我明白你在做什么了。将事实值插入 Hiera 数据本身并没有什么错,但是你的问题的标题,尤其是开头的句子让我走错了路。答案即将到来。

标签: ruby puppet


【解决方案1】:

Puppet 不一定认为您的事实值是一个字符串——如果客户端设置为对事实进行字符串化,它可能会这样做,但这实际上是无关紧要的。最重要的是Hiera interpolation tokens 不会按照您的想法工作。具体来说:

Hiera 可以插入 Puppet 的任何数据类型的值,但 值将被转换为字符串

(已添加重点。)

【讨论】:

  • 啊!好吧,这就解释了。我将避免通过 hiera 传递事实,而直接从我的清单中访问它。
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多