Como se inscrever no pacote vindo da matriz do Hiera?

2

Eu tenho o seguinte nas minhas definições hiera:

# common.json
{
  "classes": [
    "sysbase",
  ],
  "sysbase::packages": [
    "less", "build-essential", "bash"
  ]
}

# dev.local.json
{
  "sysbase::packages": [
    "xmltv"
  ]
}

E a seguinte classe:

# 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'],
  }
}

Quando eu executo o agente neste nó:

$ facter hostname fqdn domain
domain => dev.local
fqdn => francois.dev.local
hostname => francois

Eu recebo este erro:

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

(reformatado para legibilidade)

Para mim, é óbvio que menos pacote está incluído. Quando pergunto a Hiera, até me diz:

# hiera --array sysbase::packages ::hostname=francois ::domain=dev.local ::fqdn=francois.dev.local
[...
 "less",
 "build-essential",
 "bash"]

Os pacotes Puppet instalados no mestre são:

# 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

O pior é que nem todos os meus agentes fantoches relatam o mesmo erro!

Por que o pacote menos não é reconhecido? É porque está em uma matriz?

    
por François Beausoleil 20.11.2014 / 00:04

2 respostas

2

Vendo que você deseja que o Hiera mescle arrays da hierarquia ( hiera --array ), você não pode confiar na ligação do parâmetro automagic do Puppet. Você terá que chamar explicitamente a função hiera_array .

class sysbase($packages = hiera_array('sysbase::packages'))
{
    ...
}

Como descrito na primeira resposta, acho que sua milhagem seria melhor com um design como o seguinte:

class sysbase(
    $with_xmltv,
    $with_builddev,
    ...
) {
    package { [ 'less', ... ]: }
    if $with_builddec { package { ... } }
}

Isso torna muito mais fácil controlar o conjunto de pacotes na sua hierarquia. Por outro lado, será muito difícil configurar um nó sem build-essential com uma abordagem baseada em hiera_array , por exemplo.

    
por 21.11.2014 / 16:15
1

Para depurar isso, você pode fazer o compilador falhar antes de fazer essa verificação:

fail("Packages: $packages")

Deve ficar óbvio se o Puppet vê a entrada less .

A abordagem de entregar títulos de pacotes via Hiera não é particularmente elegante, porque o usuário pode fazer a classe gerenciar qualquer pacote que eles queiram, o que é uma semântica ruim.

Se você realmente fizer quiser enumerar seus pacotes no Hiera, você pode fazê-lo sob uma chave genérica e gerar recursos em site.pp ou em qualquer outro lugar.

Para criar o relacionamento de maneira segura, você pode usar uma consulta:

if 'less' in $packages {
    Package['less'] ~> Exec['select-pager']
}
    
por 21.11.2014 / 00:34

Tags