Bagaimana cara menghindari dialog interaktif saat menjalankan "apt-get upgrade -y" di Ubuntu 16.04 saat mengemas dengan Packer?


27

Saya menggunakan Packer untuk membuat AWS AMI berdasarkan pada gambar Ubuntu 16.04. Pada awalnya, saya melakukan peningkatan:

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

Inilah bagian yang relevan dari bagian penyedia saya:

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

Ini memecah otomatisasi, namun, ketika dialog interaktif muncul:

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

Saya juga mencoba mengatur export DEBIAN_FRONTEND=noninteractivesebelumnya (seperti yang direkomendasikan dalam jawaban ini ). Sayangnya, tidak ada bedanya.

Pertanyaan:

  • Apakah ada cara untuk melewati dialog iteraktif (memilih opsi 1 akan baik-baik saja)?
  • Apakah lebih baik untuk menghindari peningkatan dan bukannya percaya bahwa AMI terbaru dan berisi tambalan keamanan penting?

Latar Belakang: Ini adalah bagian yang relevan dari bagian "pembangun" saya, tempat saya mengonfigurasinya untuk menggunakan AMI terbaru yang tersedia:

"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
    },
  ...
}]

Catatan : Ternyata bahwa noniteractivemodus bekerja jika Anda menjalankan apt-get update dengan baik -ydan -qbendera.

Jawaban:


21

Urutan perintah ini berfungsi untuk saya:

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

Jadi, DEBIAN_FRONTEND=noninteractivesudah benar tetapi Anda juga perlu -qbendera.

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


2
Anda dapat (mungkin?) Menyederhanakannya menjadi apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq. Saya tidak berpikir apt-get update meminta apa pun, jadi itu mungkin tidak perlu DEBIAN_FRONTEND, dan dengan demikian Anda tidak benar-benar harus export DEBIAN_FRONTENDdan terus ada melalui seluruh lingkungan Anda. Untuk tingkat apa pun yang penting bagi Anda.
Michael Mol

@MichaelMol Bekerja dengan baik. Saya telah memperbarui jawaban saya.
Philipp Claßen

FWIW, ini dapat menyebabkan apt-get hanya melewatkan paket yang membutuhkan interaksi dan tidak memutakhirkannya (meninggalkan kata di log tentang 'paket X perlu peningkatan manual'). Jika idenya adalah untuk mendapatkan paket yang ditambal maka itu bukan cara untuk pergi.
Tensibai

11

Masalah Anda adalah bahwa perubahan file grub mematuhi ucfdan bukan debconf, karena kejadian ini pada daftar apt Anda tidak sendirian.

Sebagai solusinya saya menemukan jawaban ini di askunbuntu. Menghapus menu.lstdari sistem konfigurasi UCF harus cukup, untuk kasus Anda:

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

Ini harus menghindari pertanyaan grub. Berhati-hatilah bahwa paket lain yang menggunakan ucf juga akan menggunakan versi paket pengelola, untuk pembuatan dari basis ami ini seharusnya tidak menjadi masalah, tetapi patut dicatat.


Saat ini, solusi saya berjalan stabil. Meski begitu, baik untuk mengetahui ada solusi alternatif.
Philipp Claßen

Saya memiliki masalah yang sama dengan grub di Ubuntu 18.04, dan saya percaya ucfperbaikan ini harus dimasukkan dalam solusi lengkap bersama dengan perintah-perintah dalam jawaban oleh @ PhilippClaßen
RichVel

2

Untuk menambah jawaban Philipp, jika Anda menggunakan sudomaka Anda perlu memastikan untuk mengatur DEBIAN_FRONTENDvariabel setelahnya, seperti:

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

Atau Anda memerlukan sudo -E, tetapi ini hanya menonaktifkan 'hang' dan hanya menyebabkan lompatan ke paket, tidak mencapai peningkatan seperti yang diharapkan.
Tensibai

Bagaimana Anda memastikan bahwa Anda meningkatkan paket?
Christos Dimitroulas

Lihat jawaban saya, beberapa paket perlu diperlakukan berbeda untuk dialog jawab otomatis.
Tensibai

1

Saya tidak melihat adanya perbedaan menggunakan -y atau -q. Mungkin karena pertanyaannya adalah tentang menggunakan "pengepak"? (Saya menggunakan skrip kosong)

Bagaimanapun, dalam kasus saya, saya menyingkirkan dialog untuk apt upgrademenggunakan perintah sed berikut di sekitarnya:

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

Perubahan saya terbatas pada waktu peningkatan.
Secara teknis, ini menonaktifkan pertanyaan tentang menjaga atau tidak konfigurasi yang ada saat memutakhirkan grub, tetapi hanya untuk saat upgrade, untuk menghindari efek samping.

OS: Ubuntu 16.04 LTS

Semoga ini membantu


Anda harus menautkan dua perintah pertama dengan && sehingga kegagalan pada tampilan pertama tidak akan memungkinkan apt-get untuk dijalankan jika file ucf dikunci oleh proses lain
Tensibai

Dan menegakkan confold pada grub kemungkinan akan membuat sistem Anda tidak dapat di-boot, Anda harus menghindarinya untuk grub
Tensibai

@Tensibai saya memangkas jawaban awal saya, tetapi terbiasa dengan tepat saya menggunakan ini untuk mengotomatisasi penyebaran VM baru. Tentu saja, bermain-main dengan grub cukup berbahaya, dan saya tidak akan menyarankan mempermainkan ini ketika memanipulasi server penting, tetapi di sisi lain ... bukankah apt upgradesendirian sangat berbahaya dalam kasus seperti itu? Kecuali saya memiliki snapshot atau cara lain yang efisien untuk membangun kembali lingkungan saya dalam hitungan menit, saya tidak akan mencobanya.
Balmipour

1
Upgrade apt-get tidak berbahaya per se. Tetapi ketika Anda menegakkan menjaga konfigurasi lama ini bisa. Selain itu, tidak memeriksa Anda menetapkan negara yang diinginkan OK pada akhirnya (dalam kode Anda kegagalan akan meninggalkan penegakan) yang menjadi masalah (daftar ini kemungkinan akan berhenti pada kegagalan apt-get, tidak pernah mengomentari kembali garis ...)
Tensibai

1
Ini adalah jelas konstruktif. Dan Anda terutama benar untuk menunjukkan risiko memiliki garis yang tidak diomentari kiri (saya ragu menggunakannya, dan akan mempertimbangkan untuk menambahkan beberapa cek untuk mencegahnya). Untuk kasus penggunaan saya , saya yakin risikonya dapat diabaikan, tetapi seseorang dapat secara buta menggunakan ini tanpa mengetahui konsekuensinya. (Bahkan jika seseorang tidak boleh menjalankan perintah acak tanpa memahami apa yang mereka lakukan).
Balmipour

0

Anda menghilangkan -yparameter dari apt-get updateperintah Anda . Jika Anda memasukkannya, prompt harus pergi.

Saya telah membangun citra Ubuntu dengan Packer juga. Berikut ini skrip shell yang saya gunakan untuk melakukan pembaruan:

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

Ini berasal dari pustaka hebat Ubuntu Packer builds:

https://github.com/boxcutter/ubuntu


2
apt-get update tidak hanya memperbarui daftar paket dari repositori jarak jauh, tidak ada alasan untuk mengatur -y di sana ...
Tensibai

@Tensibai Ya, itu juga tidak ada bedanya. Kesalahan yang sama.
Philipp Claßen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.