【发布时间】: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 数据本身并没有什么错,但是你的问题的标题,尤其是开头的句子让我走错了路。答案即将到来。