我正在尝试为我的Puppet设置构建一个Hiera配置。我的主机是FreeBSD和Debian系统。所以我有一个基于::osfamily
的构型。但是,由于我正在广泛地使用Jails,我想进一步分解我的FreeBSD主机与::virtual
。
:hierarchy:
- "osfamily/%{::osfamily}"
- "%{::virtual}/%{::osfamily}"
- common
和我的数据目录树:
hieradata/
|-- common.yaml
|-- osfamily
| |-- Debian.yaml
| `-- FreeBSD.yaml
|-- physical
| `-- FreeBSD.yaml
|-- jailed
`-- virtual
在我的理解中,puppet应该应用所有osfamily/FreeBSD。yaml,然后从physical/FreeBSD。用于物理FreeBSD主机。
现在我想在每个主机上安装CA-Certificates包,并为该任务创建一个类:
class certificates ( $packageName = hiera('ca_package') ){
# Install CA-Certificates
package { $packageName:
ensure => installed,
}
}
这个类包含在common.yaml
classes:
- certificates
ca_package-变量定义在osfamily/FreeBSD.yaml:
---
rootuser: root
rootgroup: wheel
sshservicename: sshd
ca_package: 'security/ca_root_nss'
当我对该变量进行分层测试时,一切正常:
# hiera -c /usr/local/etc/puppet/hiera.yaml ca_package ::osfamily=FreeBSD
security/ca_root_nss
#
但是Puppet(即使在监狱里)抱怨数据项ca_package
不可用。
错误:无法从远程服务器检索目录:错误400服务器:无法在任何Hiera数据文件中找到数据项ca_package没有提供默认值/usr/local/etc/puppet/modules/certificates/表现/init。节点Pp:2puppet.fqdn
我做错了什么?
调试hiera的最好方法是使用下面的命令:
puppet master --debug --compile hostname --osfamily=FreeBSD |grep hiera
寻找关键的ca_package
,那么你应该知道如何修复。
第二,你的主机名是puppet.fqdn
,这对我来说很奇怪。
检查您的客户端上的因子变量'osfamily'是否为'FreeBSD'。或者,您可以在puppetserver (logback.xml)上启用调试,并查看日志,以查看它经过的层次结构以及在哪里无法获得ca_package。
调试Hiera的最好方法是在Puppet服务器节点上运行lookup
命令:
$ puppet lookup --environment production --explain --node fqdn.example.com ca_package
,其中ca_package
是您正在寻找的层次键。--explain
标志有助于验证Puppet正在寻找密钥的路径。
也可以手动定义合并行为:
puppet lookup --merge deep --environment production --node fqdn.example.com