Кукольный: 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: поиск профиля:: ntp:: серверы в бэкэнде YAML
DEBUG: xxxxxxxxx: игнорирование неверного определения в: иерархия: "узлы /"
DEBUG: xxxxxxxxx: поиск общего источника данных
DEBUG: xxxxxxxxx: найден профиль:: ntp:: общие серверы
["хххх", "хххх"]
Таким образом, он находит значения в common
но не нравится nodes
каталог.
Я пробовал множество различных вариаций hierarchy
линия в hiera.yaml
и много разных вариантов везде я могу себе представить!
Выше могут быть опечатки, так как мне пришлось печатать все вручную, так как у меня нет копий и вставок, но я снова и снова проверял живые файлы на наличие опечаток и синтаксических ошибок.
Есть идеи?
Некоторые обновления сейчас я дома и могу скопировать / вставить:
Это новая версия Puppet Enterprise, использующая менеджер кода и 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"
Это на компьютере разработчика, затем было запущено хранилище, которое инициировало ловушку для развертывания кода, я проверил, что те же данные доступны в / etc / puppetlabs / code / environment / production и т. Д. На master-устройстве puppet. Так что Code Manager работает.
Следующие тесты на марионеточном сервере:
[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
Тем не менее, кажется, что Facter работает просто отлично.
Любая помощь будет принята с благодарностью, спасибо. Джон
3 ответа
Я воспроизвел это, и проблема в том, что индикаторы области действия должны быть включены в факты в командной строке 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
Я изменяю значение fqdn в spec_helper, компилирую и применяю снова:
$ 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"]
Ура это работает.
Согласитесь, это довольно запутанно.
Смотрите также здесь.
Ключевая информация из вывода отладки:
DEBUG: xxxxxxxxx: игнорирование неверного определения в: иерархия: "узлы /"
Это должно указывать на то, что в ваших иерархиях YAML для этого приоритета поиска есть синтаксическая ошибка. Конечно, если мы используем онлайн-инструмент проверки, например http://www.yamllint.com/, мы видим, что в нем есть синтаксическая ошибка. Измените свой файл hieradata на:
# nodes/myhost.example.com.yaml
---
profile::ntp::servers:
- 1.1.1.1
- 2.2.2.2
и это должно работать нормально.
В будущем я рекомендую использовать инструмент или некоторый код для проверки вашего кода и данных, чтобы вы могли быстрее и проще выявлять эти проблемы. Я написал популярный для этого, но воздержусь от его подключения, так как я думаю, что Stackru может быть не рад этому.
В вашем 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, чтобы они соответствовали фактическим полным доменным именам ваших узлов, т.е.
cat nodes/myhost.example.com.yaml
---
profile::ntp::servers:
-1.1.1.1
-2.2.2.2