无法使用$ facts作为puppet清单中的哈希值

时间:2016-10-30 14:35:09

标签: puppet facter

这是失败的清单代码:

each( $facts['partitions'] ) |$name, $device| {
  notice( "${facts['hostname']} has device ${name} with size ${device['size']}" )
}

错误:

[manifests]$puppet apply /vagrant/manifests/mountpoints.pp
Error: Evaluation Error: Operator '[]' is not applicable to an Undef Value. at /vagrant/manifests/mountpoints.pp:1:7 on node siy
Error: Evaluation Error: Operator '[]' is not applicable to an Undef Value. at /vagrant/manifests/mountpoints.pp:1:7 on node siy

facter命令工作正常:

[manifests]$facter partitions
{"vda1"=>{"uuid"=>"050e1e34-39e6-4072-a03e-ae0bf90ba13a", "size"=>"41943040", "mount"=>"/", "label"=>"DOROOT", "filesystem"=>"ext4"}}

Ubuntu 14.04上的Puppet版本是3.8.7

1 个答案:

答案 0 :(得分:2)

最终发现puppet 3.x将设置stringify_facts默认为true,这在代码尝试以数组形式访问$ facts时导致问题。

来自pupppet文档 https://docs.puppet.com/puppet/3.8/reference/deprecated_settings.html#stringifyfacts--true

  

此设置默认为true,禁用结构化事实并将所有事实值强制转换为字符串。您可以通过在每个代理节点和Puppet master上的puppet.conf中设置stringify_facts = false来启用结构化事实。

如果要将$ facts用作哈希/结构,则配置选项stringify_facts应设置为false,trusted_node_data设置为true。这些配置设置表示的行为是puppet 4中的默认行为,是成功迁移所必需的。