我正在使用尤姆雷波内置类型。我可以获得与 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')
}
答案1
我最终使用了创建资源本质上它提供了映射的能力定义类型对于具有 hiera 的节点,其方式hiera_include
与开箱即用的类非常相似。
通过此设置,我可以file
在层次结构的任何级别声明任意数量的资源类型,并且配置都在层次数据源中。
/etc/hiera.yaml
:hierarchy:
- defaults
- "%{environment}"
/var/lib/hiera/defaults.yaml
classes:
- hiera_file_wrapper
hiera_file:
hiera-two:
path: /home/quickshiftin/hiera-two
ensure: file
content: 'Hiera two'
/var/lib/hiera/生产.yaml
hiera_file:
hiera-baby:
path: /home/quickshiftin/hiera-baby
ensure: file
content: 'Hiera baby!
模块/hiera_file_wrapper/清单/init.pp
class hiera_file_wrapper()
{
create_resources(file, hiera_hash('hiera_file'))
}
清单/站点.pp
hiera_include('classes')
答案2
因为yumrepo
它是一种资源类型,而不是类,所以它不起作用。
我会建议将一个类放入命名中yumrepo_myreponame
并让它声明yumrepo
资源。如果需要,您也可以将类参数放入 Hiera 中,然后将其传递给资源声明。
例如,我有一个用于为服务器启用 EPEL 的模块,可以将其放入其 Hieraclasses
阵列中以启用它。其全部内容如下:
class epel_yumrepo {
yumrepo { "epel":
descr => 'Extra Packages for Enterprise Linux 6 - $basearch',
enabled => 1,
gpgcheck => 1,
gpgkey => 'http://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6',
mirrorlist => 'https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch',
failovermethod => "priority",
}
}
答案3
假设您有一个名为 hnav 的 yum 存储库,并且您需要根据您所使用的操作系统版本(5 或 6)为其提供不同的 URL。
您配置了层次结构/etc/puppet/hiera.yaml喜欢
:hierarchy:
- "%{::operatingsystemmajrelease}"
- common
这样 hiera 就会首先查找以操作系统版本命名的 yaml 文件,5.yaml或者6.yaml。如果它在那里找不到值,它会查找通用.yaml。
您编写了一个参数化类,以便 hiera 可以自动提供 url。
模块/hnav/manifests.init.pp
class hnav ( $url ) {
yumrepo { 'hnav':
enabled => true,
baseurl => $url
}
}
如果出于某种原因你不喜欢参数化类,那么你可以将上述内容编写为
class hnav {
yumrepo { 'hnav':
enabled => true,
baseurl => hiera('hnav::url')
}
}
然后配置要应用于所有节点的类
通用.yaml
classes:
- hnav
并设置 URL 的值
5.yaml
hnav::url: http://example.com.yum/5/
6.yaml
hnav::url: http://example.com.yum/6/
这是一个非常人为的例子,但也许它可以帮助您理解 hiera 的用法。
答案4
我在工作中构建了 hiera_manifest 功能。本质上,它允许您通过 hiera yaml 调用模块、类和参数以及定义的类型。
我刚刚把它放到 Github 上来分享:https://github.com/mlbam/hiera_manifest
这有一点优势,因为参数也在调用模块、类或类型时放到位。
需要注意的一点是使用元参数时资源定义的某些语法存在差异。此外,在进行故障排除时,错误有时会停留在清单中,并且您无法获得引发错误的模块的正确错误消息。