Como evitar diálogos interativos ao executar o “apt-get upgrade -y” no Ubuntu 16.04 ao empacotar com o Packer?

27

Estou usando o Packer para criar uma AMI da AWS com base em uma imagem do Ubuntu 16.04. No começo, estou fazendo uma atualização:

sudo apt-get update
sudo apt-get upgrade -y

Aqui está a parte relevante da minha seção de provedores:

"provisioners": [
  {
    "type": "shell",
    "inline": [
      "sudo apt-get update",
      "sudo apt-get upgrade -y"
    ]
  }
]

Isso interrompe a automatização, no entanto, quando uma caixa de diálogo interativa é exibida:

amazon-ebs: Found kernel: /boot/vmlinuz-4.4.0-72-generic
amazon-ebs: A new version of /boot/grub/menu.lst is available, but the version installed
amazon-ebs: currently has been locally modified.
amazon-ebs:
amazon-ebs: 1. install the package maintainer's version
amazon-ebs: 2. keep the local version currently installed
amazon-ebs: 3. show the differences between the versions
amazon-ebs: 4. show a side-by-side difference between the versions
amazon-ebs: 5. show a 3-way difference between available versions
amazon-ebs: 6. do a 3-way merge between available versions (experimental)
amazon-ebs: 7. start a new shell to examine the situation

Eu também tentei definir export DEBIAN_FRONTEND=noninteractiveantes (como recomendado nesta resposta ). Infelizmente, isso não faz diferença.

Questões:

  • Existe uma maneira de passar pela caixa de diálogo iterativa (selecionar a opção 1 seria aceitável)?
  • É melhor evitar atualizações e confiar que as AMIs estão atualizadas e contêm os patches críticos de segurança?

Antecedentes: Esta é a parte relevante da minha seção "construtores", onde eu a configurei para usar a mais recente AMI disponível:

"builders": [{
  "type": "amazon-ebs",
  "region": "eu-central-1",
    ...
    "source_ami_filter": {
        "filters": {
            "virtualization-type": "hvm",
            "name": "*ubuntu-xenial-16.04-amd64-server-*",
            "root-device-type": "ebs"
        },
        "owners": ["099720109477"],
        "most_recent": true
    },
  ...
}]

Nota : Acontece que o noniteractivemodo funciona se você executar o apt-get update com -yos -qsinalizadores e.

Philipp Claßen
fonte

Respostas:

21

Essa sequência de comandos funciona para mim:

apt-get update
DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq

Então, DEBIAN_FRONTEND=noninteractiveestá correto, mas você também precisa da -qbandeira.

Fonte: https://github.com/moby/moby/issues/4032

Philipp Claßen
fonte
2
Você pode (provavelmente?) Simplificar isso para apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq. Eu não acho que apt-get update solicite nada, então provavelmente não precisa DEBIAN_FRONTEND, e assim você realmente não precisa export DEBIAN_FRONTENDe continua a existir pelo resto do seu ambiente. Em qualquer grau que seja importante para você.
Michael Mol
@MichaelMol Funciona bem. Eu atualizei minha resposta.
Philipp Claßen
FWIW, isso pode levar o apt-get a ignorar o pacote que precisa de interação e não atualizá-lo (deixando uma palavra no log sobre 'o pacote X precisa de atualização manual'). Se a idéia é obter pacotes corrigidos, não é o caminho a seguir.
Tensibai
11

Seu problema é que a alteração do arquivo grub adere ucfe não ao debconf, conforme esse incidente na lista do apt, você não está sozinho.

Como solução alternativa, encontrei esta resposta no askunbuntu. A remoção do menu.lstsistema de configuração UCF deve ser suficiente, para o seu caso:

"provisioners": [
  {
    "type": "shell",
    "inline": [
      "sudo ucf --purge /boot/grub/menu.lst"
      "sudo apt-get update",
      "sudo UCF_FORCE_CONFFNEW=YES apt-get upgrade -y"
    ]
  }
]

Isso deve evitar a pergunta do grub. Esteja avisado de que qualquer outro pacote usando o ucf também usará a versão do pacote de manutenção, para uma criação a partir de uma base não deve ser um problema, mas vale a pena notar.

Tensibai
fonte
Atualmente, minha solução alternativa é estável. Ainda assim, é bom saber que existe uma solução alternativa.
Philipp Claßen
Eu tive um problema semelhante com o grub no Ubuntu 18.04, e acredito que essa ucfcorreção deve ser incluída em uma solução completa, juntamente com os comandos na resposta por PhilippClaßen
RichVel
2

Para adicionar à resposta de Philipp, se você estiver usando sudo, certifique-se de definir a DEBIAN_FRONTENDvariável posteriormente, da seguinte forma:

apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq
Christos Dimitroulas
fonte
Ou você precisa do sudo -E, mas isso ainda está desativando o 'travar' e causando um pulo no pacote, sem conseguir uma atualização conforme o esperado.
Tensibai
Como você pode garantir que você atualize o pacote?
Christos Dimitroulas
Veja minha resposta, alguns pacotes precisam ser tratados de maneira diferente para responder automaticamente aos diálogos.
Tensibai
1

Não notei nenhuma diferença usando -y ou -q. Talvez porque a pergunta é sobre o uso de "empacotador"? (Eu uso scripts simples)

De qualquer forma, no meu caso, me livrei das caixas de diálogo para apt upgradeusar os seguintes comandos sed:

sed -i "s/#\ conf_force_conffold=YES/conf_force_conffold=YES/g" /etc/ucf.conf
apt-get -y upgrade
sed -i "s/conf_force_conffold=YES/#conf_force_conffold=YES/g" /etc/ucf.conf

Minha alteração é limitada ao tempo da atualização.
Tecnicamente, ele desativa as perguntas sobre manter ou não uma configuração existente ao atualizar o grub, mas apenas durante o tempo da atualização, para evitar efeitos colaterais.

Sistema operacional: Ubuntu 16.04 LTS

Espero que isto ajude

Balmipour
fonte
Você deve ligar os dois comandos estreias com && para que uma falha no primeiro ver não permitirá que o apt-get para executar se o arquivo UCF está bloqueado por outro processus
Tensibai
E aplicação confold no grub é provável que deixar o sistema que não arranca, você deve evitá-lo para o grub
Tensibai
@Tensibai Cortei minha resposta inicial, mas costumava usar com precisão para automatizar a nova implantação de VM. É claro que mexer com o grub é bastante perigoso, e eu não recomendaria brincar com isso ao manipular servidores importantes, mas por outro lado ... não é o apt upgradeúnico extremamente perigoso nesse caso? A menos que eu tenha uma captura instantânea ou outra maneira eficiente de reconstruir meu ambiente em questão de minutos, eu não tentaria.
Balmipour
11
A atualização do apt-get não é perigosa por si só. Mas quando você aplica a manutenção de configurações antigas, pode ser. Além disso, não verificar se você define o estado desejado OK no final (no seu código, uma falha deixará a imposição) que se torna um problema (esta lista provavelmente parará em uma falha do apt-get, nunca comentando de volta a linha ...)
Tensibai
11
Ele é claramente construtiva. E você está especialmente certo em apontar o risco de ter a linha não comentada deixada (hesitei em usá-la e considerarei adicionar algumas verificações para evitá-la). No meu caso de uso, tenho certeza de que os riscos são insignificantes, mas alguém poderia usá-lo às cegas sem saber as consequências. (mesmo que nunca se deva executar comandos aleatórios sem entender o que eles fazem).
Balmipour
0

Você está omitindo o -yparâmetro do seu apt-get updatecomando. Se você incluí-lo, o prompt deve desaparecer.

Eu construí uma imagem do Ubuntu com o Packer também. Aqui está o script de shell que eu uso para executar a atualização:

https://github.com/devopskatas/learningvm/blob/master/script/update.sh

Isso é derivado de uma excelente e bem conservada biblioteca de versões do Ubuntu Packer:

https://github.com/boxcutter/ubuntu

Dave Swersky
fonte
2
apt-get update se limita a atualizar a lista de pacotes do repositório remoto, não há nenhuma razão para definir um y lá ...
Tensibai
@Tensibai Sim, também não faz diferença. Mesmo erro.
Philipp Claßen