Se alguém pensar em um título melhor para esta pergunta: altere-o de acordo.
Meio Ambiente:
- Debian Jessie 8.5
- mestre de marionetes: 3.8.5
- agente fantoche: 3.7.2
- apto: 1.0.9.8.3
Problema:
Um pacote específico já está instalado no nó, vamos pegar 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']
}
Eu esperaria que needrestart
fosse reinstalado/atualizado para a versão fora do 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 a respeito disso.
Solução:
Caso isso não seja pretendido: Alguém conhece uma maneira inteligente de contornar isso?
Seu problema é que você
install_options
só será usado se o recurso de pacote estiver realmente instalando seus pacotes. Você tem poucas opções:ensure => latest
e espere por uma atualização de pacote (ou acione você mesmo) - provavelmente não é o que você deseja.notify
evento, se o provedor suportarreinstallable
. Embora isso funcione no Debian, essa opção provavelmente não é utilizável para você.Reinstale você mesmo: Provavelmente a única opção que você tem por enquanto: Escreva algo ao longo destas linhas:
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 comopackage_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 . Afinal, essa pode ser sua melhor opção.Acredito
ensure => installed
que apenas garantirá que esteja instalado, mas não atualizará se houver uma versão mais recente. Uselatest
para fazer isso. Ele também só será atualizado se houver uma versão mais recente. Se essa for uma versão preferida que você deseja que seja mais antiga que a versão que está instalada atualmente, você terá que encontrar uma maneira de contornar isso. Talvez umexec
que verifique se a versão instalada atual é diferente da versão nesse outro repositório, desinstale se for e deixe o recurso de pacote instalar a versão correta depois.Você precisará acionar a ação de instalação para que install_options entre em vigor. Uma solução possível é primeiro
ensure => absent
, e depois que o pacote for removido, você podeensure => present
ouensure => 1.2-8+deb8u1
e a instalação subseqüente honrará install_options .Estou usando
APT pinning
bastante desde um tempo, e acredito que esta é (uma das) soluções mais limpas que existem, especialmente se combinada comunattended upgrades
e/ou um arquivoapt-get dist-upgrade
.