我正在使用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"
    ]
  }
]


这打破了自动化,但是,弹出一个交互式对话框:

。不幸的是,这没有什么区别。 />还是最好避免升级,而是相信AMI是最新的并包含关键的安全补丁?

背景:这是我的“构建者”部分的相关部分,我在这里将其配置为使用最新可用的AMI: 。

#1 楼

此命令序列对我有用:

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


因此,DEBIAN_FRONTEND=noninteractive是正确的,但您还需要-q标志。

来源:https: //github.com/moby/moby/issues/4032

评论


您可以(可能吗?)简化为apt-get update; DEBIAN_FRONTEND =非交互式apt-get升级-yq。我认为apt-get更新提示不存在任何内容,因此它可能不需要DEBIAN_FRONTEND,因此您实际上不必导出DEBIAN_FRONTEND并使其在环境的其余部分继续存在。无论对您有多重要。

– Michael Mol
17年5月17日在23:18

@MichaelMol工作正常。我已经更新了答案。

– PhilippClaßen
17年5月18日在12:14

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

–滕西拜
18年5月22日在12:24



#2 楼

您的问题是grub文件更改遵循ucf而不是debconf,根据在apt列表上您并不孤单的此事件。对于您的情况,从UCF配置系统中删除menu.lst应该足够了:

"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年5月15日在16:38

我在Ubuntu 18.04上的grub遇到了类似的问题,我相信这个ucf修复应该与@PhilippClaßen答案中的命令一起包含在完整的解决方案中

– RichVel
19年3月6日在9:04

#3 楼

要添加到Philipp的答案中,如果您使用的是sudo,则需要确保随后再设置DEBIAN_FRONTEND变量,例如:

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


评论


或您需要sudo -E,但这仍然只是禁用“挂起”并仅导致跳至软件包,未达到预期的升级。

–滕西拜
18年5月22日在12:22

如何确保升级软件包?

–克里斯托斯·迪米特鲁拉斯(Christos Dimitroulas)
18年5月23日在10:24

看到我的答案,自动应答对话需要区别对待某些软件包。

–滕西拜
18年5月23日在11:53

#4 楼

我没有注意到使用-y或-q有什么区别。也许是因为问题与使用“包装器”有关? (我使用裸脚本)

无论如何,我用下面的sed命令摆脱了apt upgrade的对话框:

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时是否保留现有配置的问题,而仅在升级时避免了副作用。 br />
OS:Ubuntu 16.04 LTS

希望对您有所帮助

评论


您应该将两个firsts命令与&&链接在一起,因此如果ucf文件被另一个进程锁定,则第一眼看到的故障将不允许apt-get运行。

–滕西拜
17年5月16日在19:19

而且在grub上强制执行卷积可能会使您的系统无法启动,因此对于grub应该避免使用它

–滕西拜
17年5月16日在19:21

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

– Balmipour
17年5月16日在21:05



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

–滕西拜
17年5月16日在21:10

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

– Balmipour
17年5月17日在8:37

#5 楼

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

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

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

此源自一个伟大且维护良好的Ubuntu Packer构建库:

https://github.com/boxcutter/ubuntu

评论


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

–滕西拜
17年5月11日在7:24

@Tensibai是的,这也没有区别。同样的错误。

– PhilippClaßen
17年5月11日在8:42