我的 hiera 定义中有以下内容:
# common.json
{
"classes": [
"sysbase",
],
"sysbase::packages": [
"less", "build-essential", "bash"
]
}
# dev.local.json
{
"sysbase::packages": [
"xmltv"
]
}
还有以下课程:
# 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
(重新格式化以便于阅读)
对我来说,显然包含的包较少。当我询问 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 包无法识别?是因为它位于数组中吗?
答案1
由于您希望 Hiera 合并层次结构中的数组(hiera --array
),因此您不能依赖 Puppet 的自动参数绑定。您必须显式调用该hiera_array
函数。
class sysbase($packages = hiera_array('sysbase::packages'))
{
...
}
正如前面的答案所述,我认为采用以下设计会更好:
class sysbase(
$with_xmltv,
$with_builddev,
...
) {
package { [ 'less', ... ]: }
if $with_builddec { package { ... } }
}
这使得控制整个层次结构中的软件包集变得更容易。另一方面,设置节点将非常困难没有 build-essential
hiera_array
例如采用基于的方法。
答案2
为了调试这个问题,你可以在进行这个特定的检查之前让编译器失败:
fail("Packages: $packages")
Puppet 是否看到该条目应该很明显less
。
无论如何,通过 Hiera 提交包标题的方法并不是特别优雅,因为用户可以让类管理任何他们想要的包,这是很差的语义。
如果你真的做想要在 Hiera 中枚举您的包,您可以在通用密钥下执行此操作并在site.pp
任何其他地方生成资源。
为了以安全的方式建立关系,您可以使用查询:
if 'less' in $packages {
Package['less'] ~> Exec['select-pager']
}