与Packer打包时,如何在Ubuntu 16.04中运行“ apt-get upgrade -y”时避免交互对话框?


27

我正在使用Packer创建基于Ubuntu 16.04映像的AWS AMI。首先,我正在进行升级:

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会很好)?
  • 是不是最好避免升级,而是相信AMI是最新的并包含关键的安全补丁?

背景:这是“构建器”部分的相关部分,在该部分中,我将其配置为使用最新的可用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如果同时使用-y-q标志运行apt-get update ,则该模式有效。

Answers:


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's

@MichaelMol工作正常。我已经更新了答案。
菲利普·克拉森(PhilippClaßen)'17年

FWIW,这可能会导致apt-get仅跳过需要交互的软件包而不进行升级(在日志中只写了“需要手动升级的软件包X”)。如果要获取修补程序包的想法,那不是路要走。
Tensibai '18年

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

这应该避免grub问题。请注意,使用ucf的任何其他软件包也将使用维护者软件包版本,对于从基本AMI创建而言,这应该不是问题,但是值得一提。


目前,我的解决方法运行稳定。不过,很高兴知道还有替代解决方案。
菲利普·克拉森(PhilippClaßen)'17

我在Ubuntu 18.04上遇到了与grub类似的问题,我认为此ucf修复程序应与完整的解决方案一起使用,包括@PhilippClaßen的答案中的命令
RichVel

2

要添加到Philipp的答案中,如果您正在使用,sudo则需要确保DEBIAN_FRONTEND稍后设置变量,如下所示:

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

或您需要sudo -E,但这仍然只是禁用“挂起”并仅导致跳过软件包,未实现预期的升级。
Tensibai '18

如何确保升级软件包?
Christos Dimitroulas '18

看到我的答案,自动应答对话需要区别对待某些软件包。
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

我的更改仅限于升级时间。
从技术上讲,它会在升级grub时禁用有关保留或不保留现有配置的问题,而只是在升级期间,以避免产生副作用。

操作系统:Ubuntu 16.04 LTS

希望这可以帮助


您应该将两个firsts命令与&&链接在一起,如果ucf文件被另一个
进程

在grub上强制执行冲突可能会使您的系统无法启动,因此应避免在grub上使用它
Tensibai

@Tensibai我修剪了最初的答案,但习惯于精确地说,我使用它来自动化新的VM部署。当然,搞乱grub是非常危险的,并且在处理重要服务器时我不建议这样做,但是另一方面... apt upgrade在这种情况下,难道不是一个人特别危险吗?除非有快照或其他有效的方式在几分钟之内重建环境,否则我不会尝试。
Balmipour

1
apt-get升级本身并不危险。但是,当您强制保留旧配置时,可以这样做。此外,如果不检查,最后是否将所需状态设置为OK(在您的代码中,失败将留下强制执行),这会成为问题(此列表可能会在apt-get失败时停止,从不对行进行注释...)
Tensibai

1
这显然建设性的。而且,您特别有权指出留下未注释的行的风险(我犹豫使用它,并会考虑添加一些检查以防止出现此行)。对于我的用例,我确定风险可以忽略不计,但是有人可以在不知道后果的情况下盲目使用它。(即使一个人永远不要在不了解随机指令的情况下运行随机指令)。
Balmipour

0

-yapt-get update命令中省略了参数。如果包含它,提示应该消失。

我还使用Packer构建了Ubuntu映像。这是我用来执行更新的shell脚本:

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

这是从一个很好的,维护良好的Ubuntu Packer构建库中派生的:

https://github.com/boxcutter/ubuntu


2
apt-get update 只会更新远程存储库中的软件包列表,没有理由在此处设置-y ...
Tensibai

@Tensibai是的,这也没有区别。同样的错误。
菲利普·克拉森(PhilippClaßen)'17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.