Назад | Перейти на главную страницу

Как подписаться на пакет, исходящий от массива Hiera?

В моих определениях 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 --array sysbase::packages ::hostname=francois ::domain=dev.local ::fqdn=francois.dev.local
[...
 "less",
 "build-essential",
 "bash"]

Установленные пакеты Puppet на главном сервере:

# 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

Хуже всего то, что не все мои марионеточные агенты сообщают об одной и той же ошибке!

Почему пакет less не распознается? Это потому, что он в массиве?

Видя, как вы хотите, чтобы Хиера объединяла массивы из иерархии (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")

Должно стать очевидно, видит ли Марионетка less вход.

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

Если ты действительно делать хотите перечислить свои пакеты в Hiera, вы можете сделать это под общим ключом и сгенерировать ресурсы в site.pp или где-нибудь еще.

Чтобы построить отношения безопасным образом, вы можете использовать запрос:

if 'less' in $packages {
    Package['less'] ~> Exec['select-pager']
}