#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, и во всех версиях при использовании предложенного вами кода обнаруживается ошибка компиляции. Здесь суть. Обратите внимание, что ваше обновление к сообщению показывает, что вы тестируете что-то совсем другое.