我正在使用yumrepo内置类型。我可以获得与 hiera 工作的基本集成
yumrepo { hiera('yumrepo::name') :
metadata_expire => hiera('yumrepo::metadata_expire'),
descr => hiera('yumrepo::descr'),
gpgcheck => hiera('yumrepo::gpgcheck'),
http_caching => hiera('yumrepo::http_caching'),
baseurl => hiera('yumrepo::baseurl'),
enabled => hiera('yumrepo::enabled'),
}
如果我尝试删除该定义并改为使用hiera_include('classes')
,这就是我在相应的 yaml 后端中得到的内容
classes:
- "yumrepo"
yumrepo::metadata_expire: 0
yumrepo::descr: "custom repository"
yumrepo::gpgcheck: 0
yumrepo::http_caching: none
yumrepo::baseurl: "http://myserver/custom-repo/$basearch"
yumrepo::enabled: 1
我在代理上收到此错误
服务器上的错误 400:找不到类 yumrepo
我猜您无法摆脱带有层次结构和资源类型的某种最小节点声明?也许hiera_hash是要走的路?
我试了一下,但它会产生语法错误
yumrepo { 'hnav-development':
hiera_hash('yumrepo')
}
我最终使用了create_resources。从本质上讲,它提供了将定义的类型映射到具有层次结构的节点的能力,这与开箱
hiera_include
即用的类非常相似。通过此设置,我可以在层次结构的任何级别声明任意数量的
file
资源类型,而且配置都在层次数据源中。/etc/hiera.yaml
/var/lib/hiera/defaults.yaml
/var/lib/hiera/production.yaml
模块/hiera_file_wrapper/manifestes/init.pp
清单/site.pp
因为
yumrepo
是资源类型,而不是类,所以它不起作用。我会说在命名中放置一个类
yumrepo_myreponame
并让它声明yumrepo
资源。如果需要,您也可以在 Hiera 中放置类参数,然后将它们传递给资源声明。例如,我有一个用于为服务器打开 EPEL 的模块,可以将其放入其 Hiera
classes
阵列中以启用它。它的全部内容是:假设您有一个名为 hnav 的 yum 存储库,并且您需要它根据您使用的操作系统版本(5 或 6)具有不同的 URL。
您在/etc/puppet/hiera.yaml中配置了层次结构,例如
因此 hiera 将首先查找以操作系统版本5.yaml或6.yaml命名的 yaml 文件。如果它在那里找不到值,它将在common.yaml中查找。
您编写了一个参数化类,以便 hiera 可以自动提供 url。
模块/hnav/manifests.init.pp
如果由于某种原因你不喜欢参数化的类,你可以把上面写成
然后你配置了你想在所有节点上应用的类
common.yaml
然后设置 URL 的值
5.yaml
6.yaml
这是一个非常人为的例子,但也许它会帮助您了解 hiera 的使用位置。
我在工作中构建了 hiera_manifest 功能。本质上,它允许您通过 hiera yaml 调用模块、类和参数以及定义的类型。
我只是把它放在Github上分享:https ://github.com/mlbam/hiera_manifest
这有一点好处,因为在调用模块、类或类型时也会设置参数。
需要注意的一件事是使用元参数时资源定义的某些语法有所不同。此外,在进行故障排除时,错误有时会出现在清单中,并且您不会收到引发错误的模块的正确错误消息。