Làm cách nào để tránh các hộp thoại tương tác khi chạy apt apt-get Nâng cấp -y trong Ubuntu 16.04 khi đóng gói với Packer?


27

Tôi đang sử dụng Packer để tạo AWS AMI dựa trên hình ảnh Ubuntu 16.04. Ban đầu, tôi đang thực hiện nâng cấp:

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

Đây là phần có liên quan trong phần cung cấp của tôi:

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

Điều này phá vỡ sự tự động hóa, tuy nhiên, khi một hộp thoại tương tác bật lên:

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

Tôi cũng đã cố gắng thiết lập export DEBIAN_FRONTEND=noninteractivetrước (như khuyến nghị trong câu trả lời này ). Thật không may, nó không làm cho sự khác biệt.

Câu hỏi:

  • Có cách nào để vượt qua hộp thoại lặp (chọn tùy chọn 1 sẽ ổn không)?
  • Có phải tốt hơn là tránh nâng cấp và thay vào đó tin tưởng rằng các AMI được cập nhật và chứa các bản vá bảo mật quan trọng?

Bối cảnh: Đây là phần có liên quan trong phần "nhà xây dựng" của tôi, nơi tôi đã định cấu hình nó để sử dụng AMI mới nhất có sẵn:

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

Lưu ý : Hóa ra noniteractivechế độ hoạt động nếu bạn chạy cập nhật apt-get bằng cả cờ -y-qcờ.

Câu trả lời:


21

Chuỗi lệnh này hoạt động với tôi:

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

Vì vậy, DEBIAN_FRONTEND=noninteractivelà chính xác nhưng bạn cũng cần -qcờ.

Nguồn: https://github.com/moby/moby/issues / 4032


2
Bạn có thể (có thể?) Đơn giản hóa điều đó thành apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq. Tôi không nghĩ apt-get update lời nhắc cho bất cứ điều gì, vì vậy nó có thể không cần DEBIAN_FRONTEND, và do đó bạn không thực sự phải export DEBIAN_FRONTENDvà nó tiếp tục tồn tại trong phần còn lại của môi trường của bạn. Ở bất kỳ mức độ nào quan trọng với bạn.
Michael Mol

@MichaelMol Hoạt động tốt. Tôi đã cập nhật câu trả lời của tôi.
Philipp Claßen

FWIW, điều này có thể dẫn đến apt-get chỉ bỏ qua gói cần tương tác và không nâng cấp nó (để lại một từ trong nhật ký về 'gói X cần nâng cấp thủ công'). Nếu ý tưởng là để có được các gói vá thì đó không phải là cách để đi.
Tensibai

11

Vấn đề của bạn là thay đổi tệp grub tuân thủ ucfvà không gỡ lỗi, vì sự cố này trong danh sách apt bạn không đơn độc.

Như cách giải quyết, tôi đã tìm thấy câu trả lời này trên Askunbfox. Loại bỏ menu.lstkhỏi hệ thống cấu hình UCF là đủ, đối với trường hợp của bạn:

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

Điều này nên tránh các câu hỏi grub. Được cảnh báo rằng bất kỳ gói nào khác sử dụng ucf cũng sẽ sử dụng phiên bản gói bảo trì, đối với việc tạo từ một cơ sở, đây không phải là một vấn đề, nhưng nó đáng được lưu ý.


Hiện tại, cách giải quyết của tôi chạy ổn định. Tuy nhiên, tốt để biết có một giải pháp thay thế.
Philipp Claßen

Tôi đã gặp vấn đề tương tự với grub trên Ubuntu 18.04 và tôi tin rằng bản ucfsửa lỗi này nên được đưa vào một giải pháp hoàn chỉnh cùng với các lệnh trong câu trả lời của @ PhilippClaßen
RichVel

2

Để thêm vào câu trả lời của Philipp, nếu bạn đang sử dụng sudothì bạn cần đảm bảo đặt DEBIAN_FRONTENDbiến sau đó, như sau:

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

Hoặc bạn cần sudo -E, nhưng điều này vẫn chỉ là vô hiệu hóa 'hang' và chỉ gây ra sự bỏ qua cho gói, không đạt được nâng cấp như mong đợi.
Tensibai

Làm thế nào bạn có thể đảm bảo rằng bạn nâng cấp gói?
Christos Dimitroulas

Xem câu trả lời của tôi, một số gói cần được xử lý khác nhau để tự động trả lời các hộp thoại.
Tensibai

1

Tôi không nhận thấy bất kỳ sự khác biệt nào khi sử dụng -y hoặc -q. Có lẽ bởi vì câu hỏi là về việc sử dụng "packer"? (Tôi sử dụng kịch bản trần)

Dù sao, trong trường hợp của tôi, tôi đã loại bỏ các hộp thoại để apt upgradesử dụng các lệnh sed sau đây xung quanh nó:

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

Thay đổi của tôi được giới hạn trong thời gian nâng cấp.
Về mặt kỹ thuật, nó vô hiệu hóa các câu hỏi về việc giữ hay không cấu hình hiện có khi nâng cấp grub, nhưng chỉ trong thời gian nâng cấp, để tránh tác dụng phụ.

HĐH: Ubuntu 16.04 LTS

Hi vọng điêu nay co ich


Bạn nên liên kết hai lệnh đầu tiên với && để thất bại trong lần đầu tiên nhìn thấy sẽ không cho phép apt-get chạy nếu tệp ucf bị khóa bởi một tiến trình khác
Tensibai

Và việc thực thi confold trên grub có khả năng khiến hệ thống của bạn không thể khởi động được, bạn nên tránh nó cho grub
Tensibai

@Tensibai Tôi đã cắt bớt câu trả lời ban đầu của mình, nhưng được sử dụng để chính xác là tôi đang sử dụng điều này để tự động hóa việc triển khai VM mới. Tất nhiên, việc gây rối với grub khá nguy hiểm và tôi sẽ không khuyên bạn chơi trò này khi thao túng các máy chủ quan trọng, nhưng mặt khác ... không phải là apt upgrademột mình cực kỳ nguy hiểm trong trường hợp như vậy sao? Trừ khi tôi có một ảnh chụp nhanh hoặc cách hiệu quả khác để xây dựng lại môi trường của mình trong vài phút, tôi sẽ không thử.
Balmipour

1
nâng cấp apt-get không nguy hiểm mỗi se. Nhưng khi bạn thực thi giữ cấu hình cũ thì điều này có thể. Ngoài ra, không kiểm tra bạn đặt trạng thái mong muốn OK ở cuối (trong mã của bạn, lỗi sẽ khiến việc thực thi) trở thành một vấn đề (danh sách này có thể sẽ dừng ở một lỗi apt-get, không bao giờ bình luận lại dòng ...)
Tensibai

1
rõ ràng mang tính xây dựng. Và bạn đặc biệt đúng khi chỉ ra nguy cơ có dòng không bị bỏ sót (tôi đã do dự khi sử dụng nó và sẽ xem xét thêm một số kiểm tra để ngăn chặn nó). Đối với trường hợp sử dụng của tôi , tôi chắc chắn rằng các rủi ro là không đáng kể, nhưng ai đó có thể sử dụng điều này một cách mù quáng mà không biết hậu quả. (ngay cả khi người ta không bao giờ nên chạy các lệnh ngẫu nhiên mà không hiểu những gì họ làm).
Balmipour

0

Bạn đang bỏ qua -ytham số từ apt-get updatelệnh của bạn . Nếu bạn bao gồm nó, nhắc nhở nên đi.

Tôi cũng đã xây dựng một hình ảnh Ubuntu với Packer. Đây là kịch bản shell tôi sử dụng để thực hiện cập nhật:

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

Điều này có nguồn gốc từ một thư viện tuyệt vời, được bảo trì tốt của các bản dựng Ubuntu Packer:

https://github.com/boxcutter/ubfox


2
apt-get update không chỉ cập nhật danh sách các gói từ kho lưu trữ từ xa, không có lý do gì để thiết lập một - ở đó ...
Tensibai

@Tensibai Vâng, nó cũng không có gì khác biệt. Cùng một lỗi.
Philipp Claßen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.