我在我的hiera定义中有以下内容:
# common.json { "classes": [ "sysbase", ], "sysbase::packages": [ "less", "build-essential", "bash" ] } # dev.local.json { "sysbase::packages": [ "xmltv" ] }
和以下class级:
# modules/sysbase/manifests/init.pp class sysbase($packages){ package{ $packages : ensure => latest, } exec{'select-pager': command => '/usr/sbin/update-alternatives --set pager /bin/less', user => 'root', refreshonly => true, subscribe => Package['less'], } }
当我在这个节点上运行代理时:
$ facter hostname fqdn domain domain => dev.local fqdn => francois.dev.local hostname => francois
我收到这个错误:
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid relationship: Exec[select-pager] { subscribe => Package[less] }, because Package[less] doesn't seem to be in the catalog
(为了便于阅读,重新格式化)
对我来说,很明显,包括更less的软件包。 当我问Hiera时,它甚至告诉我:
# hiera --array sysbase::packages ::hostname=francois ::domain=dev.local ::fqdn=francois.dev.local [... "less", "build-essential", "bash"]
主站上安装的Puppet包是:
# dpkg -l | grep -i puppet ii facter 2.3.0-1puppetlabs1 Ruby module for collecting simple facts about a host operating system ii hiera 1.3.4-1puppetlabs1 A simple pluggable Hierarchical Database. ii puppet 3.7.3-1puppetlabs1 Centralized configuration management - agent startup and compatibility scripts ii puppet-common 3.7.3-1puppetlabs1 Centralized configuration management ii puppetdb 2.2.2-1puppetlabs1 PuppetDB Centralized Storage. ii puppetdb-terminus 2.2.2-1puppetlabs1 Connect Puppet to PuppetDB by setting up a terminus for PuppetDB. ii puppetlabs-release 1.0-11 "Package to install Puppet Labs gpg key and apt repo" ii puppetmaster-common 3.7.3-1puppetlabs1 Puppet master common scripts ii puppetmaster-passenger 3.7.3-1puppetlabs1 Centralised configuration management - master setup to run under mod passenger ii ruby-rgen 0.6.5-1puppetlabs1 A framework supporting Model Driven Software Development (MDSD) # puppet --version 3.7.3
最糟糕的事情不是所有我的木偶代理报告同样的错误!
为什么更less的包不被识别? 是因为它在一个数组中吗?
看到你希望hiera --array从层次结构( hiera --array )合并数组,你不能依赖Puppet的automagic参数绑定。 您将不得不显式调用hiera_array函数。
class sysbase($packages = hiera_array('sysbase::packages')) { ... }
正如前面的答案中所描述的,我认为你的里程会更好,devise如下:
class sysbase( $with_xmltv, $with_builddev, ... ) { package { [ 'less', ... ]: } if $with_builddec { package { ... } } }
这样可以更轻松地控制层次结构中的一组软件包。 另一方面,例如,使用基于hiera_array的方法来build立没有 build-essential的节点将是非常困难的。
要进行debugging,您可以在进行此特定检查之前使编译器失败:
fail("Packages: $packages")
它应该变得明显,木偶看到less入口。
通过Hiera处理包裹标题的方法不是特别优雅,因为用户可以让class级pipe理他们想要的任何包裹,这是不好的语义。
如果你真的想在site.pp枚举你的包,你可以在一个普通的键下完成,并在site.pp或其他地方生成资源。
要以安全的方式build立关系,可以使用查询:
if 'less' in $packages { Package['less'] ~> Exec['select-pager'] }