如何订阅来自 Hiera 阵列的包?

如何订阅来自 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"]

主服务器上安装的 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 包无法识别?是因为它位于数组中吗?

答案1

由于您希望 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-essentialhiera_array例如采用基于的方法。

答案2

为了调试这个问题,你可以在进行这个特定的检查之前让编译器失败:

fail("Packages: $packages")

Puppet 是否看到该条目应该很明显less

无论如何,通过 Hiera 提交包标题的方法并不是特别优雅,因为用户可以让类管理任何他们想要的包,这是很差的语义。

如果你真的想要在 Hiera 中枚举您的包,您可以在通用密钥下执行此操作并在site.pp任何其他地方生成资源。

为了以安全的方式建立关系,您可以使用查询:

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

相关内容