Модуль Foreman/Puppet pdxcat/collectd. Синтаксис хеша

Новичок в puppet и пытается заставить этот модуль работать, но находит это весьма разочаровывающим.

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: can't convert String into Hash at /etc/puppet/modules/collectd/manifests/plugin/network.pp:28

Плагин, с которым я борюсь, это: https://forge.puppetlabs.com/pdxcat/collectd#class-collectdpluginnetwork

Значение, которое я пытаюсь установить, — это серверы в collectd::plugin::network, которые я пробовал:

('127.0.0.1': port => 25826,) and 
('hostname' '127.0.0.1' 'port' 25826) and '127.0.0.1': port => 25826,

и множество других вариантов.

Может кто-нибудь, пожалуйста, дайте мне знать, как написать действительный хэш?

Манифест:

[root@foreman ~]# cat /etc/puppet/modules/collectd/manifests/plugin/network/server.pp
#
define collectd::plugin::network::server (
  $ensure        = 'present',
  $username      = undef,
  $password      = undef,
  $port          = undef,
  $securitylevel = undef,
  $interface     = undef,
) {
  include collectd::params
  include collectd::plugin::network

  $conf_dir = $collectd::params::plugin_conf_dir

  validate_string($name)

  file { "${conf_dir}/network-server-${name}.conf":
    ensure  => $ensure,
    mode    => '0640',
    owner   => 'root',
    group   => $collectd::params::root_group,
    content => template('collectd/plugin/network/server.conf.erb'),
    notify  => Service['collectd'],
  }
}

person Werner    schedule 27.12.2014    source источник
comment
Куда ты кладешь этот хэш? Это в Foreman, под параметром умного класса или в манифесте Puppet?   -  person Dominic Cleal    schedule 29.12.2014
comment
Это будет в Формане, под параметром смарт-класса   -  person Werner    schedule 30.12.2014


Ответы (2)


При помещении хеш-данных в параметр смарт-класса Foreman (или смарт-переменную) вам нужно сделать две вещи, чтобы правильно передать их в Puppet:

  1. Установите для параметра тип данных Hash, JSON или YAML.
  2. Используйте JSON или YAML для представления данных

Первый гарантирует, что Puppet будет передан фактический хеш данных, а не строка, которая выглядит как хеш (что, я думаю, вероятно, было причиной полученной вами ошибки), а второй позволяет Форману анализировать то, что вы вводите.

Перейдите в Foreman в раздел Настроить > Классы Puppet > collectd::plugin::network > Параметры смарт-класса > серверы и установите для параметра Тип значение JSON ( или Hash, или YAML, если хотите).

Затем измените значение параметра (либо значение по умолчанию, либо переопределение ниже) на:

{"127.0.0.1":{"port":"25826"}}

Это синтаксис JSON, и если вы сравните его с DSL Puppet, вы обратите внимание, что он использует двоеточие вместо => для разделителей ключ/значение и использует двойные кавычки только для строк. Помните, что запятые в конце недопустимы в JSON.

Практически вы можете скопировать параметр примера из документации или из другого ответа, заменив разделители и кавычки, чтобы преобразовать его в JSON.

Эквивалентный формат YAML:

---
  127.0.0.1: 
    port: "25826"

Форман примет либо в режиме «Хэш», либо в режиме «Массив», а IIRC по умолчанию сохранит / извлечет его в формате YAML.

Если Foreman выдает ошибку при сохранении параметра, это может быть связано с форматом данных, которые вы вводите. Существует множество инструментов проверки и проверки как для JSON, так и для YAML, например. jsonlint.com или json_verify (часть пакета yajl), поэтому сначала пропустите через него данные.

Дополнительную информацию о сложных типах данных можно найти в руководстве Foreman в разделе 4.2.6 Smart Matchers< /а>.

Если после этого вы по-прежнему получаете сообщение об ошибке от Puppet, перейдите на главную страницу в Foreman, нажмите кнопку YAML и скопируйте/вставьте раздел classes: выходных данных YAML (это то, что передается Puppet), соблюдая при этом пробелы.

person Dominic Cleal    schedule 30.12.2014
comment
Большое спасибо, очень подробный и исчерпывающий ответ, а также предоставление некоторых инструментов для будущей борьбы! Я добавлю ссылку в закладки, подобные страницы для регулярных выражений очень помогли мне в прошлом. - person Werner; 30.12.2014

Не могли бы вы прикрепить фрагмент манифеста, который не работает?

Здесь вы можете найти описание типов марионеток: https://docs.puppetlabs.com/puppet/latest/reference/lang_datatypes.html, а также о хэшах.

Согласно документации:

Хэши записываются в виде пар ключ/значение, заключенных в фигурные скобки; ключ отделяется от его значения символом => (стрелка, жирная запятая или решетка), а соседние пары разделяются запятыми. Допускается необязательная запятая между конечным значением и закрывающей фигурной скобкой.

{ key1 => 'val1', key2 => 'val2' }

Так что определенно вам нужно изменить скобки "(" на "{". Также после ключа должно быть "=>", а не ":" Что-то вроде этого должно работать:

servers => { '127.0.0.1' =>
  { 'port' => '25826', },
}
person kkamilpl    schedule 27.12.2014
comment
Этот. В двух словах, пишите их как хэши Ruby или постоянные ссылки на хэши в Perl. - person Felix Frank; 28.12.2014
comment
Я пробовал это, хотя, я думаю, может быть, синтаксис Формана отличается? - person Werner; 30.12.2014