У меня есть следующее в моих hiera определениях:
# common.json
{
"classes": [
"sysbase",
],
"sysbase::packages": [
"less", "build-essential", "bash"
]
}
# dev.local.json
{
"sysbase::packages": [
"xmltv"
]
}
И следующий класс:
# modules/sysbase/manifests/init.pp
class sysbase($packages){
package{ $packages :
ensure => latest,
}
exec{'select-pager':
command => '/usr/sbin/update-alternatives --set pager /bin/less',
user => 'root',
refreshonly => true,
subscribe => Package['less'],
}
}
Когда я выполняю агент на этом узле:
$ facter hostname fqdn domain
domain => dev.local
fqdn => francois.dev.local
hostname => francois
Я получаю эту ошибку:
Error: Could not retrieve catalog from remote server:
Error 400 on SERVER:
Invalid relationship:
Exec[select-pager] { subscribe => Package[less] },
because Package[less] doesn't seem to be in the catalog
(переформатированный для удобочитаемости)
Мне очевидно, что меньше пакета включено. Когда я спрашиваю Hiera, он даже говорит мне так:
# hiera --array sysbase::packages ::hostname=francois ::domain=dev.local ::fqdn=francois.dev.local
[...
"less",
"build-essential",
"bash"]
Установленные Марионеточные пакеты на ведущем устройстве:
# dpkg -l | grep -i puppet
ii facter 2.3.0-1puppetlabs1 Ruby module for collecting simple facts about a host operating system
ii hiera 1.3.4-1puppetlabs1 A simple pluggable Hierarchical Database.
ii puppet 3.7.3-1puppetlabs1 Centralized configuration management - agent startup and compatibility scripts
ii puppet-common 3.7.3-1puppetlabs1 Centralized configuration management
ii puppetdb 2.2.2-1puppetlabs1 PuppetDB Centralized Storage.
ii puppetdb-terminus 2.2.2-1puppetlabs1 Connect Puppet to PuppetDB by setting up a terminus for PuppetDB.
ii puppetlabs-release 1.0-11 "Package to install Puppet Labs gpg key and apt repo"
ii puppetmaster-common 3.7.3-1puppetlabs1 Puppet master common scripts
ii puppetmaster-passenger 3.7.3-1puppetlabs1 Centralised configuration management - master setup to run under mod passenger
ii ruby-rgen 0.6.5-1puppetlabs1 A framework supporting Model Driven Software Development (MDSD)
# puppet --version
3.7.3
Худшей вещью не является весь мой марионеточный отчет об агентах та же ошибка!
Почему меньше пакета, не распознанного? Это, потому что это находится в массиве?
Если вы хотите, чтобы Hiera объединила массивы из иерархии ( hiera --array
), вы не можете полагаться на автоматическую привязку параметров Puppet. Вместо этого вам придется явно вызвать функцию hiera_array
.
class sysbase($packages = hiera_array('sysbase::packages'))
{
...
}
Как описано в предыдущем ответе, я думаю, что ваш пробег был бы лучше с дизайном, подобным следующему:
class sysbase(
$with_xmltv,
$with_builddev,
...
) {
package { [ 'less', ... ]: }
if $with_builddec { package { ... } }
}
Это значительно упрощает контролировать набор пакетов в вашей иерархии. С другой стороны,будет очень сложно настроить узел без build-essential
с подходом на основе hiera_array
, например.
Чтобы отладить это, вы можете заставить компилятор выйти из строя перед выполнением этой конкретной проверки:
fail("Packages: $packages")
Должно стать очевидным, видит ли Puppet запись меньше
.
В любом случае подход к передаче заголовков пакетов через Hiera не особенно элегантен, потому что пользователь может заставить класс управлять любым пакетом, который ему нужен, что является плохой семантикой.
Если вы действительно делаете хотите перечислить ваши пакеты в Hiera, вы можете сделать это под общим ключом и сгенерировать ресурсы в site.pp
или где-нибудь еще.
Чтобы построить отношения безопасным способом, вы можете использовать запрос:
if 'less' in $packages {
Package['less'] ~> Exec['select-pager']
}