puppet:Hiera不喜欢任何子目录

时间:2017-07-13 14:37:37

标签: puppet hiera

任何Puppet和Hiera专家可以帮助我解决我看到的这种令人烦恼的情况吗?

Hiera适用于common.yaml中的任何内容:

cat common.yaml
---
resolv_conf::nameserver:
- x.x.x.x
- x.x.x.x

profile::ntp::servers:
- x.x.x.x
- x.x.x.x

然后通过以下工作进行测试:

hiera resolv_conf::nameservers environment=production
["x.x.x.x", "x.x.x.x"]

所以,上面的工作正如预期的那样。但是,如果我在nodes中使用hieradata目录并在:

中添加测试数据
cat nodes/fqdn.yaml
---
profile::ntp::servers:
-1.1.1.1
-2.2.2.2

然后我相应调整hiera.yaml文件:

cat hiera.yaml
---
:backends: yaml
:yaml:
  :datadir: "/etc/puppetlabs/code/environments/%{environment}/hieradata"
:hierarchy:
  -"nodes/%{::fqdn}"
  - "common"

:logger: console
:merge_behavior: native
:deep_merge_options: {}

并且还将正确的行添加到全局hiera.yaml中(两个文件现在看起来相同以进行测试)。

测试时出现以下错误:

hiera profile::ntp::servers environment=production -d
  

DEBUG:xxxxxxxxx:Hiera YAML后端开始
  DEBUG:xxxxxxxxx:在YAML后端查找profile :: ntp :: servers   DEBUG:xxxxxxxxx:忽略错误的定义:层次结构:'节点/'
  DEBUG:xxxxxxxxx:寻找常见的数据源
  DEBUG:xxxxxxxxx:找到profile :: ntp :: servers共同的
  [" x.x.x.x"," x.x.x.x"]

因此它会在common中找到值但不像nodes目录。

我在hierarchy尝试了大量hiera.yaml行的不同变体,以及我能想象到的其他地方的许多不同选项!

上面可能有拼写错误,因为我不需要手动输入,因为我没有复制和粘贴,但我已经一次又一次地检查了实时文件是否存在拼写错误和语法错误。

有什么想法吗?

现在有些更新我在家,可以复制/粘贴:

这是一个全新安装的木偶企业,使用代码管理器和gitlab。

[root@client-01 nodes]# pwd
/root/control-repo/hieradata/nodes
[root@client-01 nodes]# ll
total 8
-rw-r--r--. 1 root root 34 Jul 13 19:04 puppet.example.com.yaml
-rw-r--r--. 1 root root 18 Jul 13 18:58 test.yaml
[root@client-01 nodes]# cat puppet.example.com.yaml
---
message:
- "This is in nodes"

这是在开发机器上,然后推送了repo,启动了代码部署的钩子,我检查了/ etc / puppetlabs / code / environments / production等中的相同数据主。所以Code Manager正在运作。

在puppet服务器上进行以下测试:

[root@puppet ~]# hostname -f
puppet.example.com
[root@puppet ~]# hiera message environment=production
nil
[root@puppet ~]# hiera message environment=production 
fqdn=puppet.example.com
nil
[root@puppet ~]# hiera message environment=production fqdn=puppet.example.com -d
DEBUG: 2017-07-13 19:28:15 +0100: Hiera YAML backend starting
DEBUG: 2017-07-13 19:28:15 +0100: Looking up message in YAML backend
DEBUG: 2017-07-13 19:28:15 +0100: Ignoring bad definition in :hierarchy: 'nodes/'
DEBUG: 2017-07-13 19:28:15 +0100: Looking for data source common
nil
[root@puppet ~]#

所以它看起来完全是同一个问题:

我的hiera.yaml

[root@puppet ~]# cat /etc/puppetlabs/puppet/hiera.yaml
---
:backends:
  - yaml
:hierarchy:
  - "nodes/%{::fqdn}"
  - common

:yaml:
# datadir is empty here, so hiera uses its defaults:
# - /etc/puppetlabs/code/environments/%{environment}/hieradata on *nix
# - %CommonAppData%\PuppetLabs\code\environments\%{environment}\hieradata on Windows
# When specifying a datadir, make sure the directory exists.
  :datadir: "/etc/puppetlabs/code/environments/%{environment}/hieradata"

这有点令人放心,因为它意味着其他木偶服务器可能没有什么重大错误,而且可能是我做错了什么?

进一步编辑:

所以我昨晚没有太多时间去测试,但我确实找到了这个:

看起来问题在于变量变量,即`"%{:: fqdn}"

如果我在hieradata的根目录中执行以下操作:

[root@client-01 hieradata]# pwd ; ll ; cat test.yaml
/root/control-repo/hieradata
total 12
-rw-r--r--. 1 root root  4 Jul 13 19:25 common.yaml
drwxr-xr-x. 2 root root 52 Jul 13 19:04 nodes
-rw-r--r--. 1 root root 19 Jul 13 21:47 puppet.example.com.yaml
-rw-r--r--. 1 root root 18 Jul 13 21:43 test.yaml
---
name:
- "jon"

然后使用hiera name environment=production进行测试,效果很好。

如果我在hieradata的根目录中执行以下操作:

[root@client-01 hieradata]# pwd ; ll ; cat puppet.example.com.yaml
/root/control-repo/hieradata
total 12
-rw-r--r--. 1 root root  4 Jul 13 19:25 common.yaml
drwxr-xr-x. 2 root root 52 Jul 13 19:04 nodes
-rw-r--r--. 1 root root 19 Jul 13 21:47 puppet.example.com.yaml
-rw-r--r--. 1 root root 18 Jul 13 21:43 test.yaml
---
test:
- "pass"

然后我用以下方式测试:

[root@puppet ~]# hostname -f ; hiera test environment=production -d
puppet.example.com
DEBUG: 2017-07-13 21:53:44 +0100: Hiera YAML backend starting
DEBUG: 2017-07-13 21:53:44 +0100: Looking up test in YAML backend
DEBUG: 2017-07-13 21:53:44 +0100: Ignoring bad definition in :hierarchy: 
'nodes/'
DEBUG: 2017-07-13 21:53:44 +0100: Ignoring bad definition in :hierarchy: ''
DEBUG: 2017-07-13 21:53:44 +0100: Looking for data source test
DEBUG: 2017-07-13 21:53:44 +0100: Looking for data source common
nil
[root@puppet ~]# hostname -f ; hiera test environment=production 
fqdn=puppet.example.com -d
puppet.example.com
DEBUG: 2017-07-13 21:53:57 +0100: Hiera YAML backend starting
DEBUG: 2017-07-13 21:53:57 +0100: Looking up test in YAML backend
DEBUG: 2017-07-13 21:53:57 +0100: Ignoring bad definition in :hierarchy: 
'nodes/'
DEBUG: 2017-07-13 21:53:57 +0100: Ignoring bad definition in :hierarchy: ''
DEBUG: 2017-07-13 21:53:57 +0100: Looking for data source test
DEBUG: 2017-07-13 21:53:57 +0100: Looking for data source common
nil

因此完全忽略节点的子文件夹并在hieradata的根目录中进行测试表明具有固定名称的yaml文件有效,但是当使用facter进行每个节点查找时...这就是失败的原因。

[root@puppet ~]# facter fqdn
puppet.example.com
[root@puppet ~]# hostname -f
puppet.example.com

然而,似乎工作得很好。

非常感谢任何帮助,谢谢。 乔恩

3 个答案:

答案 0 :(得分:2)

我重现了这一点,问题实际上是范围指标需要包含在hiera命令行的事实中。

即。而不是:

# hiera test environment=production fqdn=puppet.example.com -d
你应该说:

# hiera test environment=production ::fqdn=puppet.example.com -d

在Rspec-puppet中重现:

$ cat manifests/init.pp 
class foo (
  $servers,
  $nameserver,
) {
  notify { "servers: $servers": }
  notify { "nameserver: $nameserver": }
}

$ cat spec/fixtures/hiera/hiera.yaml 
---
:backends:
  - yaml
:hierarchy:
  - "nodes/%{::fqdn}"
  - common
:yaml:
  :datadir: 'spec/fixtures/hieradata'
:logger: console
:merge_behavior: native
:deep_merge_options: {}

$ cat spec/fixtures/hieradata/common.yaml 
---
foo::nameserver:
- 3.3.3.3
- 4.4.4.4

foo::servers:
- 5.5.5.5
- 6.6.6.6

$ cat spec/fixtures/hieradata/nodes/myhost.example.com.yaml 
---
foo::servers:
- 1.1.1.1
- 2.2.2.2

$ cat spec/spec_helper.rb 
require 'puppetlabs_spec_helper/module_spec_helper'

RSpec.configure do |c|
  c.hiera_config = 'spec/fixtures/hiera/hiera.yaml'
  c.default_facts = {
    :fqdn => 'myhost.example.com',
  }
end

$ cat spec/classes/test_spec.rb 
require 'spec_helper'

describe 'foo', :type => :class do
  it { File.write('myclass.json', PSON.pretty_generate(catalogue)) }
end

编译:

$ bundle exec rake spec 
...
Finished in 0.15682 seconds (files took 0.97868 seconds to load)
1 example, 0 failures

申请:

$ bundle exec puppet apply --environment=rp_env --catalog=myclass.json 
Notice: servers: [1.1.1.1, 2.2.2.2]
Notice: /Stage[main]/Foo/Notify[servers: [1.1.1.1, 2.2.2.2]]/message: defined 'message' as 'servers: [1.1.1.1, 2.2.2.2]'
Notice: nameserver: [3.3.3.3, 4.4.4.4]
Notice: /Stage[main]/Foo/Notify[nameserver: [3.3.3.3, 4.4.4.4]]/message: defined 'message' as 'nameserver: [3.3.3.3, 4.4.4.4]'
Notice: Applied catalog in 0.02 seconds

我在spec_helper中更改了fqdn的值,然后再次编译并应用:

$ bundle exec puppet apply --environment=rp_env --catalog=myclass.json 
Notice: servers: [5.5.5.5, 6.6.6.6]
Notice: /Stage[main]/Foo/Notify[servers: [5.5.5.5, 6.6.6.6]]/message: defined 'message' as 'servers: [5.5.5.5, 6.6.6.6]'
Notice: nameserver: [3.3.3.3, 4.4.4.4]
Notice: /Stage[main]/Foo/Notify[nameserver: [3.3.3.3, 4.4.4.4]]/message: defined 'message' as 'nameserver: [3.3.3.3, 4.4.4.4]'
Notice: Applied catalog in 0.01 seconds

(rp_env是Rspec-puppet设置的环境的神奇值。)

所以代码可以工作。

但是Hiera命令行存在问题。

重现错误消息:

$ bundle exec hiera foo::servers environment=rp_env -d -c spec/fixtures/hiera/hiera.yaml 
DEBUG: 2017-07-15 13:21:54 +1000: Hiera YAML backend starting
DEBUG: 2017-07-15 13:21:54 +1000: Looking up foo::servers in YAML backend
DEBUG: 2017-07-15 13:21:54 +1000: Ignoring bad definition in :hierarchy: 'nodes/'
DEBUG: 2017-07-15 13:21:54 +1000: Looking for data source common
DEBUG: 2017-07-15 13:21:54 +1000: Found foo::servers in common
["5.5.5.5", "6.6.6.6"]

尝试使用您执行的相同语法在命令行上设置事实:

$ bundle exec hiera foo::servers fqdn=myhost.example.com environment=rp_env -d -c spec/fixtures/hiera/hiera.yaml 
DEBUG: 2017-07-15 13:23:34 +1000: Hiera YAML backend starting
DEBUG: 2017-07-15 13:23:34 +1000: Looking up foo::servers in YAML backend
DEBUG: 2017-07-15 13:23:34 +1000: Ignoring bad definition in :hierarchy: 'nodes/'
DEBUG: 2017-07-15 13:23:34 +1000: Looking for data source common
DEBUG: 2017-07-15 13:23:34 +1000: Found foo::servers in common
["5.5.5.5", "6.6.6.6"]

最后提供缺失的范围指标:

$ bundle exec hiera foo::servers ::fqdn=myhost.example.com environment=rp_env -d -c spec/fixtures/hiera/hiera.yaml 
DEBUG: 2017-07-15 13:24:09 +1000: Hiera YAML backend starting
DEBUG: 2017-07-15 13:24:09 +1000: Looking up foo::servers in YAML backend
DEBUG: 2017-07-15 13:24:09 +1000: Looking for data source nodes/myhost.example.com
DEBUG: 2017-07-15 13:24:09 +1000: Found foo::servers in nodes/myhost.example.com
["1.1.1.1", "2.2.2.2"]

万岁它有效。

同意这很令人困惑。

另见here

答案 1 :(得分:1)

在你的hiera.yaml中:

-"nodes/%{::fqdn}"

在那里,%{::fqdn}引用了事实fqdn

与此同时,您创建了一个名为nodes/fqdn.yaml的文件。

Hiera不会看到该文件,除非您的fqdn事实真的回归fqdn(而不是myhost.example.com)。

如果您改为说:

,它应该找到该文件
hiera profile::ntp::servers environment=production fqdn=fqdn -d

然而,您可能想要做的是重命名Hiera文件以匹配节点的实际FQDN,即

cat nodes/myhost.example.com.yaml
---
profile::ntp::servers:
-1.1.1.1
-2.2.2.2

答案 2 :(得分:1)

调试输出的关键信息是:

  

DEBUG:xxxxxxxxx:忽略以下错误定义:hierarchy:'nodes /'

这应该表明您的查找优先级的YAML hieradata存在语法错误。果然,如果我们使用像http://www.yamllint.com这样的在线验证工具,我们会发现它有语法错误。将您的hieradata文件更改为:

# nodes/myhost.example.com.yaml
---
profile::ntp::servers:
- 1.1.1.1
- 2.2.2.2

它应该可以正常工作。

我建议将来使用工具或某些代码来验证您的代码和数据,以便您更快,更轻松地识别这些问题。我已经写了一个很受欢迎的,但是我会避免插入它,因为我认为StackOverflow可能不会对此感到高兴。