puppet - usando assegurar com o pacote 'version' e 'held'

3

Visão geral:

Acabei de usar o Puppet e usei o seguinte array com 'assegurar' para que uma versão específica do Apache seja instalada (e não a mais recente) e 'mantida' (o que significa que não será atualizado em apt-get dist-upgrade padrão) para a versão mais recente.

Problema:

Ao usar o código abaixo, apenas o primeiro valor na matriz de garantias é considerado pelo Puppet. Então, quando o código abaixo é executado, ele instala a versão correta do Apache, mas o pacote não está configurado para conter (verificado executando dpkg --get-selection ).

Se os valores na matriz forem trocados, o pacote será retido, mas a versão mais recente será instalada.

Código:

package { 'apache2':

        ensure => [ "2.0.64", held ],
 }

Aprecie todos os ponteiros sobre este!
Obrigado.

    
por hokeycokey 15.03.2012 / 22:54

3 respostas

6

Da melhor maneira que eu posso ler lendo o código-fonte, o recurso "holdable" é fundamentalmente falho. A garantia (consulte ensurable.do , linha 50) não pode aceitar uma matriz de opções. Portanto, um pacote não pode ser instalado em uma versão específica e marcada como mantida pelo dpkg. Suponho que o comportamento padrão do analisador seja tal que, se ele receber uma matriz em que não haja suporte, o primeiro valor será usado. Isso explicaria seu resultado.

Na minha opinião, a versão e / ou os recursos que podem ser salvos devem ser reimplementados como uma nova variável, como:

package { 'apache2'
  ensure => installed,
  version => '2.0.64',
  hold => true,
}

Sugiro que você envie um relatório de bug. Enquanto isso, você poderia fazer:

package { 'apache2':
  ensure => '2.0.64',
}

exec { 'hold-apache2-version':
  command => 'dpkg ...',
  require => Package['apache2'],
}
    
por 15.03.2012 / 23:11
3

Eu criei uma solução alternativa. Prepare-se, isso é nojento.

if $::puppetversion == '2.7.11' {
  $ensure_puppet = 'held'
} else {
  $ensure_puppet = '2.7.11-1puppetlabs1'
}
package { ['puppet', 'puppet-common']:
  ensure => $ensure_puppet
}

Ele usa o fato interno $::puppetversion para fazer interrogação de versão. Assim, o estado do pacote será 'mantido', a menos que a versão instalada seja diferente da desejada. Isso deve permitir que eu atualize a infraestrutura de fantoches à vontade sem se preocupar com upgrades autônomos fazendo isso por mim.

Isso não responde exatamente à pergunta sobre o bloqueio de versão do Apache, mas é possível escrever um fato personalizado para consultar o Apache em sua versão.

Eu tinha inicialmente tentado a abordagem manual do dpkg hold. Eu usei o tipo de pacote para garantir as versões e, em seguida, executei um script de execução para garantir que ele fosse mantido separadamente. É semelhante à abordagem que tomo com o bloqueio de versão do yum.

define apt::hold() {
  exec { "hold-${name}":
    command => "/bin/echo '${name} hold' | /usr/bin/dpkg --set-selections",
    unless  => "/usr/bin/dpkg --get-selections ${name} | /bin/grep hold",
    require => Package[$name]
  }
}

package { ['puppet', 'puppet-common']:
  ensure => '2.7.11-1puppetlabs1'
}
apt::hold { ['puppet', 'puppet-common']: }

Agora, isso funciona, mas produz muitas notificações irritantes nos logs e relatórios. O tipo de pacote não pode reconciliar que um pacote pode ser mantido e uma certa versão. Por isso, ele me notificará que o estado do pacote foi alterado de 'mantido' para '2.7.11-1puppetlabs1'.

[sanitized.server.name.net] out: info: Retrieving plugin
[sanitized.server.name.net] out: info: Loading facts in /var/lib/puppet/lib/facter/operatingsystemmajor.rb
[sanitized.server.name.net] out: info: Loading facts in /var/lib/puppet/lib/facter/datacenter.rb
[sanitized.server.name.net] out: info: Caching catalog for sanitized.server.name.net
[sanitized.server.name.net] out: info: Applying configuration version '1333727048'
[sanitized.server.name.net] out: notice: /Stage[main]/Puppet/Package[facter]/ensure: ensure changed 'held' to '1.6.6-1puppetlabs1'
[sanitized.server.name.net] out: notice: /Stage[main]/Puppet::Client/Package[puppet-common]/ensure: ensure changed 'held' to '2.7.11-1puppetlabs1'
[sanitized.server.name.net] out: notice: /Stage[main]/Puppet::Client/Package[puppet]/ensure: ensure changed 'held' to '2.7.11-1puppetlabs1'
[sanitized.server.name.net] out: notice: Finished catalog run in 6.25 seconds

Eu não gosto dos meus relatórios chorando lobo o tempo todo. Também causa problemas se eu quiser fazer algo como:

package { ['puppet', 'puppet-common']:
  ensure => '2.7.11-1puppetlabs1',
  notify => Service['puppet']
}

Para reiniciar o serviço após uma atualização. Eu termino com o serviço sendo devolvido toda vez que um fantoche é executado.

Concordo com todos os outros, embora o termo 'detidos' deva ser provavelmente um atributo separado do tipo de pacote.

    
por 06.04.2012 / 18:46
1

Eu uso este módulo de fantoches para gerenciar o apt nos meus sistemas. Ele fornece uma definição "preferences_snippet" que pode ser usada para fixar pacotes em versões ou versões específicas ( veja o README ).

    
por 22.11.2012 / 18:20

Tags