Receitas de chef fora de ordem, fazendo com que a instalação do pacote apt falhe

5

Estou escrevendo uma receita do Chef para instalar, entre outras coisas, o nginx e o Phusion Passenger. O breve resumo é que as receitas na minha lista de execução não estão sendo executadas na ordem esperada, e isso está causando uma falha na instalação do pacote apt de uma maneira que não sei como corrigir. A sequência completa é um pouco complicada, farei o meu melhor para manter os detalhes essenciais.

Eu tenho minha própria receita, lr-web para personalizar o servidor da Web para o estado em que quero que ele esteja. Uma de suas ações é fazer alterações em nginx.conf . Eu também tenho um papel para orquestrar a configuração geral, cuja lista de execução é:

 "run_list":[
   "recipe[apt]",
   "recipe[nginx]",
   "recipe[passenger]",
   "recipe[lr-web]"
 ]

Além disso, a receita lr-web lista passenger e nginx como dependências em seu metadata.rb .

As receitas apt e nginx são as do padrão OpsCode. Mas eu escrevi minha própria receita de passenger , já que a do OpsCode usa rubygems para instalar o passageiro, mas essa versão não é mais suportada. Seguindo o conselho em modrails.com para instalar via apt, eu tenho os seguintes passos na minha passenger recipe:

cookbook_file "/etc/apt/sources.list.d/passenger.list" do
  source "passenger.list"
  mode 600
  action :create_if_missing
end

bash "apt-get-update" do
  user "root"
  code <<-EOF
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
    apt-get install apt-transport-https ca-certificates
    apt-get update
EOF
end

apt_package "nginx-extras" do
  action :install
end

O que acontece quando eu converjo o nó é que recebo um prompt do apt-get, mesmo que ele passe o -y flag porque o instalador do pacote nginx-extras não quer sobrescrever nginx.conf :

Configuration file '/etc/nginx/nginx.conf'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** nginx.conf (Y/I/N/O/D/Z) [default=N] ? 
Configuration file '/etc/nginx/sites-available/default'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** default (Y/I/N/O/D/Z) [default=N] ? dpkg: error processing nginx-common (--configure):
 EOF on stdin at conffile prompt
dpkg: dependency problems prevent configuration of nginx-extras:
 nginx-extras depends on nginx-common (= 1:1.4.4-2.4.0.37~precise1); however:
  Package nginx-common is not configured yet.
dpkg: error processing nginx-extras (--configure):
 dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while processing:
 nginx-common
 nginx-extras
E: Sub-process /usr/bin/dpkg returned an error code (1)
Tanto quanto eu posso dizer, a única maneira que isso pode estar acontecendo é se a minha receita lr-web é executada antes da receita do passageiro, o que não deveria acontecer.

O problema que tenho é que lr-web está em execução antes de passenger e, portanto, altera o nginx conf. Eu preciso descobrir por que isso está acontecendo e pará-lo, ou encontrar uma maneira quando apt_package está instalando nginx-extras para passar a resposta 'N' dizendo "não sobrescreva o nginx.conf". Qualquer sugestão sobre qualquer ângulo de ataque seria muito bem-vinda.

    
por Ian Dickinson 13.02.2014 / 14:53

1 resposta

3

Isso provavelmente acontecerá já que o livro nginx modifica o arquivo /etc/nginx/nginx.conf depois que ele foi instalado pelo apt, e o comando dpkg está avisando sobre essa mudança. Isso também entrará em conflito com /etc/nginx/sites-available/default .

Altere a ordem do que é aplicado quando.

Colocar a receita do passageiro acima do nginx garantirá que o repositório e os pacotes sejam instalados. Como o nginx-extras fornece seu próprio arquivo nginx.conf, ele será imediatamente substituído pela receita do nginx e será controlado a partir daí.

Sua lista de execução modificada ficaria assim:

 "run_list":[
   "recipe[apt]",
   "recipe[passenger]",
   "recipe[nginx]",
   "recipe[lr-web]"
 ]

Diga ao Apt para responder corretamente

Você também pode tentar forçar a responder da maneira que você quer - isso tem o risco de ser um pouco agressivo demais no comportamento do apt, potencialmente afetando o resto da corrida do Chef. Eu não recomendo isso, mas você pode testá-lo e ver se funciona para o seu caso de uso.

ENV['DEBIAN_FRONTEND'] = 'noninteractive'
package 'nginx-extras' do
  options '--force-yes'
  options '-o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"'
  action :install
end

Leia mais sobre este aqui .

Isso tem o perigo de responder dessa maneira a outros recursos e não apresentar o problema ao operador, além de ter recursos potencialmente substituídos entre si e acionar notificações indesejadas para outros recursos, como disparar uma reinicialização nginx quando uma configuração alterações de arquivos, etc.

Converter bash para o recurso apt_repository

Isso não é realmente para resolver o problema de ordenação, apenas melhor uso de recursos do Chef.

Você mostra o fornecimento de um arquivo de livro de receitas e, em seguida, executa recursos do bash para ativá-los. Isso aconteceria a cada execução, se não fosse protegido por uma instrução only_if / not_if.

O livro de receitas apt que você está usando já tem um recurso de repositório e mudaria sua receita para parecer assim:

apt_repository 'passenger' do
  uri          'https://oss-binaries.phusionpassenger.com/apt/passenger'
  distribution node['lsb']['codename']
  components   ['main']
  keyserver    'keyserver.ubuntu.com'
  key          '561F9B9CAC40B2F7'
end

Isto irá se comportar de uma maneira mais sã, executando os comandos do apt-get durante a execução, e a saída será praticamente a mesma:

deb     https://oss-binaries.phusionpassenger.com/apt/passenger precise main

(no Ubuntu 12.04)

TL, DR:

Use a primeira solução para alterar a ordem na qual a receita está aplicando alterações nos arquivos fornecidos por dois pacotes diferentes.

Use a terceira solução para limpar o código um pouco mais.

    
por 14.06.2014 / 18:43