Как подписаться на пакет, прибывающий из массива 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, он даже говорит мне так:

# 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

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

Почему меньше пакета, не распознанного? Это, потому что это находится в массиве?

2
задан 21 November 2014 в 17:05
2 ответа

Если вы хотите, чтобы 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 , например.

2
ответ дан 3 December 2019 в 10:44

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

fail("Packages: $packages")

Должно стать очевидным, видит ли Puppet запись меньше .

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

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

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

if 'less' in $packages {
    Package['less'] ~> Exec['select-pager']
}
1
ответ дан 3 December 2019 в 10:44

Теги

Похожие вопросы