จะหลีกเลี่ยงไดอะล็อกโต้ตอบเมื่อใช้งาน "apt-get upgrade -y" ใน Ubuntu 16.04 เมื่อทำการบรรจุด้วย Packer ได้อย่างไร?


27

ฉันใช้Packerเพื่อสร้าง AWS AMI จากอิมเมจ Ubuntu 16.04 ในการเริ่มต้นฉันทำการอัพเกรด:

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

นี่คือส่วนที่เกี่ยวข้องของส่วนผู้จัดหาของฉัน:

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

สิ่งนี้จะทำลายการทำให้เป็นอัตโนมัติอย่างไรก็ตามเมื่อไดอะล็อกโต้ตอบปรากฏขึ้น:

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

ฉันพยายามตั้งค่าexport DEBIAN_FRONTEND=noninteractiveก่อนหน้า (ตามคำแนะนำในคำตอบนี้ ) น่าเสียดายที่มันไม่สร้างความแตกต่าง

คำถาม:

  • มีวิธีที่จะผ่านกล่องโต้ตอบแบบวนซ้ำ (การเลือกตัวเลือก 1 จะดีหรือไม่)?
  • มันจะดีกว่าเพื่อหลีกเลี่ยงการอัพเกรดและแทนที่จะไว้วางใจว่า AMIs เป็นรุ่นล่าสุดและมีแพตช์รักษาความปลอดภัยที่สำคัญอยู่หรือไม่?

พื้นหลัง: นี่คือส่วนที่เกี่ยวข้องของส่วน "ผู้สร้าง" ของฉันซึ่งฉันกำหนดค่าให้ใช้ AMI ที่มีอยู่ล่าสุด:

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

หมายเหตุ : ปรากฎว่าnoniteractiveโหมดใช้งานได้หากคุณรันการอัพเดต apt-get ทั้งกับ-yและ-qแฟล็ก

คำตอบ:


21

ลำดับของคำสั่งนี้ใช้ได้สำหรับฉัน:

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

ดังนั้นDEBIAN_FRONTEND=noninteractiveถูกต้อง แต่คุณต้องมี-qธงด้วย

ที่มา: https://github.com/moby/moby/issues/4032


2
คุณสามารถ (อาจจะ?) apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yqลดความซับซ้อนที่ ฉันไม่คิดว่า apt-get updateจะขออะไรเลยดังนั้นจึงไม่จำเป็นDEBIAN_FRONTENDและคุณไม่ต้องทำexport DEBIAN_FRONTENDและยังคงมีอยู่ต่อไปในสภาพแวดล้อมที่เหลือของคุณ ไม่ว่าคุณจะอยู่ในระดับใดก็ตาม
Michael Mol

@MichaelMol ทำงานได้ดี ฉันได้อัพเดตคำตอบแล้ว
Philipp Claßen

FWIW สิ่งนี้อาจนำไปสู่การรับ apt-get เพียงแค่ข้ามแพ็คเกจที่ต้องมีการโต้ตอบและไม่อัปเกรด (ทิ้งคำไว้ในบันทึกเกี่ยวกับ 'package X ต้องการการอัพเกรดด้วยตนเอง') หากความคิดคือการได้รับแพคเกจการแก้ไขแล้วมันไม่ใช่วิธีที่จะไป
Tensibai

11

ปัญหาของคุณคือการเปลี่ยนไฟล์ grub เป็นไปตามucfและไม่ใช่ debconf ตามเหตุการณ์นี้ในรายการ apt ที่คุณไม่ได้อยู่คนเดียว

วิธีแก้ปัญหาฉันพบคำตอบนี้ใน askunbuntu การลบออกmenu.lstจากระบบการกำหนดค่า UCF ควรจะเพียงพอสำหรับกรณีของคุณ:

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

สิ่งนี้ควรหลีกเลี่ยงคำถามด้วง ได้รับการเตือนว่าแพ็กเกจอื่น ๆ ที่ใช้ ucf จะใช้เวอร์ชันแพ็คเกจของผู้ดูแลด้วยเช่นกันสำหรับการสร้างจากฐาน ami สิ่งนี้ไม่ควรมีปัญหา


ขณะนี้การแก้ปัญหาของฉันทำงานเสถียร ยังดีที่รู้ว่ามีทางเลือกอื่น
Philipp Claßen

ฉันมีปัญหาคล้ายกันกับด้วงบน Ubuntu 18.04 และฉันเชื่อว่าการucfแก้ไขนี้ควรรวมอยู่ในโซลูชันที่สมบูรณ์พร้อมกับคำสั่งในคำตอบโดย @ PhilippClaßen
RichVel

2

ในการเพิ่มคำตอบของ Philipp ถ้าคุณใช้sudoคุณต้องแน่ใจว่าตั้งค่าDEBIAN_FRONTENDตัวแปรหลังจากนั้นเช่น:

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

หรือคุณต้องการ sudo -E, แต่นี่ก็เป็นเพียงแค่ปิดการใช้งาน 'แฮงค์' และทำให้เกิดการข้ามไปยังแพ็คเกจ, ไม่ได้รับการอัพเกรดตามที่คาดไว้
Tensibai

คุณจะมั่นใจได้อย่างไรว่าคุณอัพเกรดแพ็คเกจ
Christos Dimitroulas

ดูคำตอบของฉันแพคเกจบางอย่างจะต้องได้รับการปฏิบัติแตกต่างจากกล่องโต้ตอบตอบรับอัตโนมัติ
Tensibai

1

ฉันไม่ได้สังเกตเห็นความแตกต่างโดยใช้ -y หรือ -q อาจเป็นเพราะคำถามเกี่ยวกับการใช้ "บรรจุหีบห่อ"? (ฉันใช้สคริปต์เปล่า)

อย่างไรก็ตามในกรณีของฉันฉันได้กำจัดกล่องโต้ตอบสำหรับapt upgradeใช้คำสั่ง 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

การเปลี่ยนแปลงของฉันถูก จำกัด ไว้ที่เวลาของการอัปเกรด
ในทางเทคนิคแล้วมันจะปิดการใช้งานคำถามเกี่ยวกับการเก็บรักษาหรือไม่กำหนดค่าที่มีอยู่เมื่ออัพเกรดด้วง แต่สำหรับช่วงเวลาของการอัพเกรดเท่านั้นเพื่อหลีกเลี่ยงผลข้างเคียง

ระบบปฏิบัติการ: Ubuntu 16.04 LTS

หวังว่านี่จะช่วยได้


คุณควรเชื่อมโยงคำสั่งสองคำสั่งแรกกับ && เพื่อให้ความล้มเหลวในการดูครั้งแรกไม่อนุญาตให้ apt-get เพื่อเรียกใช้ถ้าไฟล์ ucf ถูกล็อกโดยโพรเซสอื่น
Tensibai

และการบังคับใช้ confold บนด้วงนั้นอาจทำให้ระบบของคุณไม่สามารถบูตได้คุณควรหลีกเลี่ยงมันสำหรับด้วง
Tensibai

@ Tensibai ฉันตัดคำตอบเริ่มต้นของฉัน แต่ใช้เพื่อแม่นยำฉันใช้สิ่งนี้เพื่อทำการปรับใช้ VM ใหม่โดยอัตโนมัติ แน่นอนว่าการล้อเล่นกับด้วงนั้นค่อนข้างอันตรายและฉันจะไม่แนะนำให้ใช้วิธีนี้เมื่อจัดการกับเซิร์ฟเวอร์ที่สำคัญ แต่ในทางกลับกัน ... ไม่ได้apt upgradeมีอันตรายอย่างมากในกรณีนี้ เว้นแต่ฉันจะมีภาพรวมหรือวิธีที่มีประสิทธิภาพในการสร้างสภาพแวดล้อมของฉันในเวลาไม่กี่นาทีฉันจะไม่ลอง
Balmipour

1
การอัพเกรด apt-get นั้นไม่เป็นอันตรายต่อ se แต่เมื่อคุณบังคับใช้การกำหนดค่าแบบเก่าอาจเป็นได้ นอกจากนี้ไม่ตรวจสอบคุณตั้งรัฐตกลงที่ต้องการในตอนท้าย (ในรหัสของคุณเป็นความล้มเหลวจะออกบังคับใช้) ที่กลายเป็นปัญหา (รายการนี้มีแนวโน้มที่จะหยุดเมื่อ apt-get ความล้มเหลวที่ไม่เคยแสดงความคิดเห็นกลับสาย ... )
Tensibai

1
มันเป็นที่สร้างสรรค์อย่างชัดเจน และคุณมีสิทธิ์ที่จะชี้ให้เห็นถึงความเสี่ยงที่จะมีบรรทัดที่ไม่ใส่คอมเม้นท์ (ฉันลังเลที่จะใช้มันและจะพิจารณาเพิ่มการตรวจสอบบางอย่างเพื่อป้องกัน) สำหรับกรณีการใช้งานของฉันฉันมั่นใจว่าความเสี่ยงนั้นเล็กน้อย แต่บางคนก็สามารถใช้สิ่งนี้ได้โดยไม่รู้ตัว (แม้ว่าจะไม่ควรรันคำสั่งสุ่มโดยไม่เข้าใจว่าทำอะไร)
Balmipour

0

คุณไม่สนใจ -yพารามิเตอร์จากapt-get updateคำสั่งของคุณ หากคุณรวมไว้พรอมต์ควรหายไป

ฉันได้สร้างรูปภาพ Ubuntu ด้วย Packer เช่นกัน นี่คือเชลล์สคริปต์ที่ฉันใช้เพื่อทำการอัพเดต:

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

สิ่งนี้ได้มาจากการสร้าง Ubuntu Packer ที่ยอดเยี่ยม

https://github.com/boxcutter/ubuntu


2
apt-get update ไม่เพียง แต่ปรับปรุงรายการของแพคเกจจากพื้นที่เก็บข้อมูลระยะไกลที่มีเหตุผลที่จะตั้ง -y มีไม่ ...
Tensibai

@ Tenensai ใช่มันทำให้ไม่แตกต่างกัน ข้อผิดพลาดเดียวกัน
Philipp Claßen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.