Puppet:基于主机名的hiera散列键永远不会检索值

时间:2015-05-29 04:47:58

标签: puppet hiera

我使用Hiera哈希来保存一些特定于主机的令牌值。散列内的密钥对应于将用调用散列值的简档模块分类的节点的主机名/证书名。但是,当我应用模块时,与主机的哈希键对应的值始终为null。这是我正在使用的代码。

in 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-file中的值正确填充?提前感谢您的建议。

编辑:我相信当哈希键具有文字&#39; - &#39;时,我发现了一个问题。正如许多主机名所做的那样。我更新了哈希以显示带有破折号的键,现在应该提出一个更具体的问题:我看到几十篇关于如何通过使用双引号来转义哈希值中的字符的文章,但我什么都看不到 - 甚至在yaml.org上 - 关于如何将字符作为键的一部分出现时如何转义它。关于这个问题的任何提示? YAML解析器显示这在语法上是有效的,但我相信它正在处理&#39; - &#39;作为集合标记而不是文字字符。

2 个答案:

答案 0 :(得分: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:~#

答案 1 :(得分: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.

另请查看以下example:

# /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