Передача массива yaml, содержащего данные пакета, в puppet через Hiera

#automation #yaml #puppet #hiera

#автоматизация #yaml #puppet #hiera

Вопрос:

версия puppet: 4.9.4 версия hiera: 3.3.1

Что я пытаюсь сделать, так это перезагрузить httpd при установке новой версии package-x / y, и не похоже, что массив из Hiera передается правильно.

для моего файла httpd.pp у меня есть:

 class service::common::httpd (
  $service_state = undef, # undef = unmanaged
  $service_run_at_boot = undef,
  $packages = undef
  ) {
    service { 'httpd':
      ensure     => $service_state,
      enable     => $service_run_at_boot,
      subscribe  => $packages,
      restart    => "/usr/sbin/apachectl graceful"
    }
  }
  

и в файле yaml для hiera у меня есть:

 service::common::httpd::packages: [Package['package-x'],Package['package-y']]
  

запуск puppet с этим выдает ошибку

 Error: Evaluation Error: Error while evaluating a Function Call, Lookup of key 'allow_virtual_packages' failed: Unable to parse (/root/repos/puppet-config/data/nodes/<location of yaml file>): did not find expected ',' or ']' while parsing a flow sequence
  

также говорится, что его missing a comma between flow collection entries . Я также перепробовал много различных комбинаций пробелов и запятых..

Я также попытался включить пакеты внутри класса с помощью инструкции include.

Что я делаю не так?

Комментарии:

1. Соответствующую документацию YAML можно найти по адресу yaml.org/spec/1.2/spec.html#id2802662 а также другая деокументация синтаксиса YAML.

2. Это не просто проблема с документацией YAML, поскольку Puppet требует, чтобы ссылки в файле YAML были отформатированы довольно неинтуитивным способом, согласно моему ответу ниже. На самом деле, это хороший вопрос.

Ответ №1:

Утилита yamllint весьма полезна для анализа файлов Puppet Hiera YAML. Когда я попробовал это на вашем файле, я получил:

  yamllint spec/fixtures/hiera/data/common.yaml 
spec/fixtures/hiera/data/common.yaml
  2:25      error    syntax error: expected ',' or ']', but got '['
  2:39      error    too few spaces after comma  (commas)
  

Синтаксическая ошибка там показывает, что файл является просто недопустимым YAML.

Но как это исправить?

Сбивающая с толку строка в манифесте Puppet, подобная:

   subscribe => [Package['package-x'], Package['package-y']]
  

При компиляции в каталог Puppet в формате JSON становится:

   "subscribe": ["Package[package-x]", "Package[package-y]"]
  

И вы можете поместить ту же строку JSON в файл YAML, чтобы сделать допустимый YAML таким:

 service::common::httpd::packages: ["Package[package-x]", "Package[package-y]"]
  

В YAML также можно использовать одинарные кавычки, т. Е.

 service::common::httpd::packages: ['Package[package-x]', 'Package[package-y]']
  

Больше информации о том, как скомпилировать каталог Puppet, в моем сообщении в блоге здесь.

Ответ №2:

кавычки.

hiera не знает, что Package такое. просто заключите это в кавычки, поскольку это строка.

сервис:: общий::httpd::пакеты: [ «Пакет[‘package-x’]», «Пакет[‘package-y’]»]

работает отлично.


или вы можете просто изменить [ "Package['package-x']", "Package['package-y']" ] на [ 'package-x', 'package-y' ]

работает безупречно. смотрите ниже.

host01.yaml

 beats::packetbeat::packages: [ acl, htop ]
  

packetbeat.pp

 class beats::packetbeat (
    $packages = undef
) {
    package {
        "packetbeat":
            ensure    => "$version",
            subscribe => Package[$packages],
        ;
    } 
}
  

Обратите внимание: /Stage[main]/Beats::Packetbeat/Package[acl]/обеспечить:
текущее значение ‘отсутствует’ должно быть ‘2.2.51-14.el7’ (noop)

Обратите внимание: /Stage[main]/Beats::Packetbeat/Пакет[packetbeat]: запустил бы «обновление» из 1 события

Обратите внимание: /Stage[main]/Beats::Packetbeat/Service[packetbeat]: вызвало бы «обновление» из двух событий

Обратите внимание: Класс [Beats::Packetbeat]: вызвал бы «обновление» из 3 событий

Комментарии:

1. Это неверно. Это привело бы к ошибке компиляции, Could not find resource 'Package['package-x']' in parameter 'require' . Puppet будет рассматривать кавычки вокруг package-x как часть заголовка. Я уже опубликовал правильный (и проверенный) ответ ниже.

2. @AlexHarvey это работает. я бы никогда не опубликовал здесь ответ без тестирования. если вы хотите проверить, я могу сделать скриншот результата и куда-нибудь загрузить.

3. Хорошо, я тестировал с использованием вашего кода, и это приводит к ошибке компиляции. Какая версия puppet?

4. Я протестировал код для последних версий Puppet 6, 5 и 4, и во всех версиях при использовании предложенного вами кода обнаруживается ошибка компиляции. Здесь суть. Обратите внимание, что ваше обновление к сообщению показывает, что вы тестируете что-то совсем другое.