目标是为传递给已定义资源类型的参数提供默认值。我已经使用使用 Hiera 的自动默认过程成功地为类参数提供了默认值,但是这种机制不适用于已定义的类型。
这是我在定义的类型中调用 Hiera 的方式:
define git_down(
$local_repo_dir = undef,
$remote_repo_url = undef,
$version = undef,
$shell = hiera("git_down::shell"),
$path = hiera("git_down::path"),
$date_format = hiera("git_down::date_format", '%Y-%m-%d %H:%M:%S')
) {
... More puppet code for type definition...
}
我的想法是创建对键入类名称的某些参数具有正常自动默认值的类(因此在类文件中完成,未显示),但使其他参数对于该类型的所有用户都具有相同的默认值,而与类无关。上述类型是为了允许更新 GIT 存储库。它需要是一个类型而不是一个类,因为我需要从多个 GIT 存储库中获取文件,并且类是单例的,而类型可能有多个实例。每个声明“git_down”实例的类都应该期望在同一个地方找到 git 可执行文件(git_down::path 和 git_down::shell)。每个类的不同之处在于源代码库的 URL、存储要克隆或获取的本地代码库的目录以及要签出的版本标记。
这是我的 Hiera.yaml 的样子:
---
:backends:
- yaml
:yaml:
:datadir: c:/temp/usr
:hierarchy:
- "git_%{fqdn}"
- "git_%{osfamily}"
- git_common
(注意:我在这里没有使用 ::fqdn 和 ::osfamily,因为独立的 Hiera 命令行工具无法识别它们。当我一切正常时,我可能会添加双冒号。)
我没有特定于机器的 YAML 文件(基于 fqdn,完全限定域名),因此它应该查看我的 osfamily 特定文件,即 git_windows.yaml:
---
# Default class parameters for when ::osfamily is "windows"
git_checkout::local_repo_dir: c:/usr/git_test_5
git_checkout::remote_repo_url: file:///c/usr/git_test
git_checkout::version: v11.0.7.81
git_down::shell: 'C:/Program Files (x86)/git/bin/sh.exe'
git_down::path: '/bin:/C/Program Files (x86)/git/bin'
git_down::date_format: '%Y-%m-%d %H:%M:%S'
我以这种方式测试了我的 Hiera:
1)使用命令行facter创建一个包含我所有事实的YAML事实文件(运行Hiera时需要):
facter -y > ..\facts.yaml
2) 使用命令行 Hiera 查看它是否识别我的变量:
hiera -d -c ..\hiera.yaml -y ..\facts.yaml git_down::shell
Hiera 输出以下内容:
c:\usr\git_type\manifests>hiera.bat -d -c ..\hiera.yaml -y ..\facts.yaml git_down::shell
DEBUG: 2014-07-01 14:17:46 -0400: Hiera YAML backend starting
DEBUG: 2014-07-01 14:17:46 -0400: Looking up git_down::shell in YAML backend
DEBUG: 2014-07-01 14:17:46 -0400: Looking for data source git_usb-pctbspaul.ef.com
DEBUG: 2014-07-01 14:17:46 -0400: Cannot find datafile c:/usr/git_type/git_usb-pctbspaul.ef.com.yaml, skipping
DEBUG: 2014-07-01 14:17:46 -0400: Looking for data source git_windows
DEBUG: 2014-07-01 14:17:46 -0400: Found git_down::shell in git_windows
nil
我应该看到“C:/Program Files (x86)/git/bin/sh.exe”,而不是“nil”。怎么了?