1

我正在使用 Hiera 哈希来保存一些特定于主机的令牌值。散列中的键对应于节点的主机名/证书名,这些节点将使用调用散列值的配置文件模块进行分类。但是,当我应用模块时,与主机的哈希键对应的值始终为空。这是我正在使用的代码。

在 hiera-file.yaml 中

token_lookup:
  host-name1: 'abcdef123'
  host-name2: 'abbcde456'

并在 profile.pp

$_tokens = hiera_hash('token_lookup', undef, 'hiera-file')
$_specific_token = $_tokens["${::hostname}"]       <== never gets a value

我确定主机名与哈希中的键匹配。问题是,从 hiera 文件中获取值以正确填充的正确语法是什么?提前感谢您的建议。

编辑:我相信当哈希键中包含文字“-”字符时,我发现了一个问题,就像许多主机名一样。我更新了散列以显示其中带有破折号的键,现在应该问一个更具体的问题:我看到了几十篇关于如何使用双引号来转义散列值中的字符的文章,但我什么也没看到 - 甚至在 yaml.org - 关于如何在字符作为键的一部分出现时对其进行转义。关于这个问题的任何提示?YAML 解析器显示这在语法上是有效的,但我相信它将“-”视为集合标记而不是文字字符。

4

2 回答 2

2

您的代码是正确的,我对其进行了如下测试,似乎它没有针对您环境中的正确 yaml 文件。检查层次结构设置,并将令牌key-value放在正确的位置。

如果我将 yaml 文件放到 global.yaml 中(如果 hiera 找不到密钥,它将始终转到我的 hiera.yaml 设置中的最后一个)

我用最简单的设置重建了它:

$ cat /etc/hiera.yaml:

---
:backends:
  - yaml
:hierarchy:
  - defaults
  - "%{clientcert}"
  - "%{environment}"
  - global

:yaml:
# datadir is empty here, so hiera uses its defaults:
# - /var/lib/hiera on *nix
# - %CommonAppData%\PuppetLabs\hiera\var on Windows
# When specifying a datadir, make sure the directory exists.
  :datadir:

$ cat /var/lib/hiera/global.yaml
token_lookup:
  host-name1: 'abcdef123'
  host-name2: 'abbcde456'

$ cat profile.pp   
$_tokens = hiera_hash('token_lookup', undef, 'hiera-file')
notice ("tokens is $_tokens")
$_specific_token = $_tokens["${::hostname}"]
notice ("token is $_specific_token ")

然后我运行puppet apply,我可以看到结果

$ FACTER_hostname='host-name1' puppet apply profile.pp --hiera_config /etc/hiera.yaml
Notice: Scope(Class[main]): tokens is host-name1abcdef123host-name2abbcde456
Notice: Scope(Class[main]): token is abcdef123
Notice: Compiled catalog for host-name1 in environment production in 0.04 seconds
Notice: Finished catalog run in 0.07 seconds

$ FACTER_hostname='host-name2' puppet apply profile.pp --hiera_config /etc/hiera.yaml
Notice: Scope(Class[main]): tokens is host-name1abcdef123host-name2abbcde456
Notice: Scope(Class[main]): token is abbcde456
Notice: Compiled catalog for host-name2 in environment production in 0.04 seconds
Notice: Finished catalog run in 0.02 seconds
root@ac976d6d79fb:~#
于 2015-05-31T03:36:49.577 回答
0

我认为hiera_hash不是你想要的。

hiera_hash:使用哈希合并查找。期望给定键的层次结构中的每个值都是一个散列,并将每个散列中的顶级键合并为一个散列。请注意,在嵌套结构的情况下,这不会进行深度合并。

改变:

$_tokens = hiera_hash('token_lookup', undef, 'hiera-file')

$_tokens = hiera('token_lookup', {}) #it will create empty hash if it couldn't find 'token_lookup' variable.

另请检查以下示例:

# /etc/puppet/hieradata/appservers.yaml
---
proxies:
  - hostname: lb01.example.com
    ipaddress: 192.168.22.21
  - hostname: lb02.example.com
    ipaddress: 192.168.22.28

# Get the structured data:
$proxies = hiera('proxies')
# Index into the structure:
$use_ip = $proxies[1]['ipaddress'] # will be 192.168.22.28
于 2015-05-29T07:06:38.683 回答