марионетка: Хиера не любит подкаталоги

Могут ли какие-нибудь эксперты по 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 :: общие серверы
["xxxx", "xxxx"]

Таким образом, он находит значения в 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"

Это на машине разработчика, затем было отправлено репо, которое инициировало перехватчик для развертывания кода, я проверил, что те же данные доступны в / etc / puppetlabs / code / environment / production и т. Д. На мастере марионетки. Итак, 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 ~]#

И так выглядит точно такая же проблема:

My 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

Однако, похоже, фактер работает нормально.

Любая помощь будет принята с благодарностью, спасибо. Джон


person jonnybinthemix    schedule 13.07.2017    source источник


Ответы (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"]

Ура работает.

Согласитесь, это довольно запутанно.

См. Также здесь.

person Alex Harvey    schedule 15.07.2017
comment
Фантастическая работа, спасибо вам большое. Я новичок в марионетке, я прохожу курс и забронировал экзамен, но мои требования быстро теряют вес. Я не слышал о Rspec-Puppet. Читал об этом сейчас, выглядит очень интересно. - Вчера вечером я обнаружил, что, несмотря на мои ошибки, hiera действительно работает, и если я использую марионеточный поиск, а не двоичный файл hiera, он работает нормально. Так что, возможно, это ограничение двоичного файла hiera. Спасибо за объяснение и работу, это потребует некоторого понимания, но я только что проверил с помощью :: fqdn =, и он работает. - person jonnybinthemix; 15.07.2017
comment
Rspec-puppet - это то, о чем они не будут рассказывать вам в Основах Puppet, но я считаю, что это одна из самых полезных вещей для понимания. Когда вы настроили тестовую систему, внезапно стало действительно легко тестировать и отлаживать код Puppet. - person Alex Harvey; 15.07.2017

В вашем hiera.yaml у вас есть:

-"nodes/%{::fqdn}"

Здесь %{::fqdn} относится к факту fqdn Facter.

Тем временем вы создали файл с именем nodes/fqdn.yaml.

Хиера не увидит этот файл, если только ваш 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
person Alex Harvey    schedule 13.07.2017
comment
Извините, я должен был упомянуть ... в файле действительно написано fqdn ... но я не хотел писать fqdn выше. Пытался изложить вещи неспецифично, и я должен был упомянуть об этом .. моя проблема. - person jonnybinthemix; 13.07.2017
comment
Я создал файл как таковой: vim $ (hostname -f) .yaml - person jonnybinthemix; 13.07.2017
comment
Означает ли строка: игнорирование плохого определения в иерархии: обычно, что факт в конце не может быть прочитан лицом? Я думал, что проблема была в моем синтаксисе или в моем понимании Hiera. Что, наверное, тоже правда :) - person jonnybinthemix; 13.07.2017
comment
Это действительное предположение и исправление, основанное на вопросе. Это тоже было мое первое предположение, но результат заставил меня переосмыслить его, когда казалось, что Хиера правильно нашла этот приоритет. - person Matt Schuchard; 13.07.2017
comment
да. Боюсь, я перестал читать, когда увидел cat nodes/fqdn.yaml. :) - person Alex Harvey; 13.07.2017

Ключевая информация из результатов отладки:

ОТЛАДКА: xxxxxxxxx: игнорирование неверного определения в: иерархии: 'узлы /'

Это должно быть признаком того, что в ваших данных YAML для этого приоритета поиска есть синтаксическая ошибка. Конечно, если мы воспользуемся онлайн-инструментом проверки, например http://www.yamllint.com, мы увидим это имеет синтаксическую ошибку. Измените свой файл hieradata на:

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

и он должен работать нормально.

Я рекомендую в будущем использовать инструмент или какой-либо код для проверки вашего кода и данных, чтобы вы могли быстрее и проще выявлять эти проблемы. Я написал для этого популярный вариант, но воздержусь от его подключения, поскольку думаю, что StackOverflow может не обрадовать этого.

person Matt Schuchard    schedule 13.07.2017
comment
Если ваш инструмент имеет отношение к ответу, обязательно отключите? :) - person Alex Harvey; 13.07.2017
comment
Боюсь, похоже, вы нашли одну из моих опечаток, когда я все писал от руки ... Я не мог скопировать и вставить. Пробелы в оригинале, и я пропустил все остальные файлы через упомянутый вами веб-сайт, и все они говорят о валидных YAML. - person jonnybinthemix; 13.07.2017
comment
Здесь уже поздно, поэтому, если он все еще не работает, я постараюсь воспроизвести его завтра. - person Alex Harvey; 13.07.2017
comment
Без проблем, спасибо. Я сейчас дома, и я еще больше убежден, что делаю что-то не так, потому что то же самое происходит в моей тестовой лаборатории. Я буду исследовать больше и размещать обновления. - person jonnybinthemix; 13.07.2017
comment
Я отредактировал свой исходный пост, добавив дополнительную информацию. Спасибо, Джон. - person jonnybinthemix; 13.07.2017