Puppet: Como honrar install_options do pacote () se um pacote específico já estiver instalado

3

Se alguém pensa em um título melhor para essa pergunta: Altere-o de acordo.

Ambiente:

  • Debian jessie 8.5
  • mestre de marionetes: 3.8.5
  • agente de marionetes: 3.7.2
  • apt: 1.0.9.8.3

Problema:

Um pacote específico já está instalado no nó, digamos needrestart , por exemplo:

# dpkg -l | grep needrestart
ii  needrestart                     1.2-8+deb8u1

Usando o seguinte código:

package{[
  'needrestart',
]:
  ensure          => installed, # latest won't work, either
  install_options => ['-t', 'jessie-backports']
}

Espero que needrestart seja reinstalado / atualizado para a versão de jessie-backports . No entanto, isso não acontece, não há reinstalação / atualização acontecendo. Dentro dos logs (debug), não há nada que valha a pena ser mostrado em relação a isso.

Solução:

Caso isso não seja intencional: alguém conhece uma maneira inteligente de contornar isso?

    
por gf_ 02.09.2016 / 15:12

4 respostas

2

Seu problema é que seu install_options só será usado se o recurso do pacote estiver realmente instalando seus pacotes. Você tem algumas opções:

  • Use ensure => latest e espere por uma atualização de pacote (ou faça você mesmo) - provavelmente não é o que você quer.
  • Atualizando para o Puppet 4.x. Desde a versão 4, o Puppet tem reinstall_on_refresh , que permite a reinstalação em um notify event, se o provedor suportar reinstallable . Enquanto isso funciona no Debian, esta opção provavelmente não é utilizável para você.
  • Trick Puppet pensa que o pacote foi desinstalado - isso precisaria de um patch de boneco em sua instalação local, não é recomendado.
  • Patch Puppet com recursos de reinstalação: Em este relatório de bug de alguns anos atrás, Aggelos Economopoulos forneceu um patch para alguma versão do fantoche, que parece bastante simples. Isso deve começar. Eu não recomendo remendar suas instalações de agentes fantoches.
  • Reinstale-se: Provavelmente a única opção que você tem agora: Escreva algo ao longo destas linhas:

    exec { "apt-get reinstall $package $your_options":
        user   => 'root',
        onlyif => 'dpkg -s $package| grep 'Version $your_version'
    }
    

    Dependendo das diferenças dos pacotes com e sem opções, isso pode ser arbitrariamente difícil. Se apenas um punhado de pacotes for afetado, pode ser gerenciável.

  • Escreva seu próprio provedor e adicione-o a package ou estabeleça algo como package_reinstall : é surpreendentemente fácil, pode ser gerenciado e versionado por meio de um módulo e funciona sem uma atualização do Puppet. Sugiro começar com provider / package / apt.rb . Esta pode ser a sua melhor opção, afinal.

por 05.09.2016 / 20:12
0

Acredito que ensure => installed só se certificará de que está instalado, mas não atualizará se houver uma versão mais recente. Use latest para fazer isso. Ele também será atualizado apenas se houver uma versão mais recente. Se essa é uma versão preferida que você quer que seja mais antiga que a versão atualmente instalada, você terá que encontrar uma maneira de contornar isso. Talvez um exec que irá verificar se a versão atual instalada é diferente da versão daquele outro repo, então desinstale se estiver, e deixe o recurso de pacote instalar a versão correta depois.

    
por 02.09.2016 / 15:24
0

Você precisará acionar a ação de instalação para que as install_options entrem em vigor. Uma possível solução alternativa é primeiro ensure => absent e, depois que o pacote for removido, você poderá ensure => present ou ensure => 1.2-8+deb8u1 e a instalação subsequente honrará install_options .

    
por 02.09.2016 / 18:29
0

Estou usando APT pinning bastante extensivamente desde há algum tempo, e acredito que essa é (uma das) soluções mais limpas por aí, especialmente se combinada com unattended upgrades e / ou uma% normalapt-get dist-upgrade.

    
por 02.06.2017 / 21:49