如何确保新启动的VM已准备好进行配置?

smi*_*lli 3 ubuntu upstart provisioning virtual-machine apt-get

这在Ubuntu 14.04下并不是什么大问题,但是由于切换到16.04,事情变得有点乱:

当我使用工具启动新VM并运行配置脚本(想想Vagrant或Packer)时,脚本所做的第一件事就是apt-get update/ upgrade/ installdance.我注意到,自从切换到Ubuntu Xenial后,这些脚本会抛出许多非确定性错误,例如

Reading package lists...
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/
Run Code Online (Sandbox Code Playgroud)

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
Run Code Online (Sandbox Code Playgroud)

如果我sleep 30在脚本的开头抛出一个或类似的东西,它似乎安定下来.如果我在循环中尝试每个命令重试,直到退出状态为止,它也可以工作0.我能说的最好,有一些第一启动任务在我的配置器同时运行apt-get.

我觉得这很明显,就像apt-daily服务一样.但添加以下等待循环无效; 它永远不会等待任何事情:

while systemctl status apt-daily.service > /dev/null 2>&1; do
    sleep 0.5
done
Run Code Online (Sandbox Code Playgroud)

我知道我可以按照这个问题中的想法来检查特定的锁定,但是我更感兴趣的是,如果有一个更通用和防弹的方法来确定新VM何时完全出现.做一个盲人sleep似乎太脆弱了.

小智 6

至少当我遇到同样的问题时,你正在使用apt-daily服务走上正轨.但apt-daily立即触发无人值守升级,这可能就是为什么你的睡眠循环没有做任何事情.几点想法:

选项1

如果您正在构建自己的流浪盒,以下是如何解决此问题:

在基本框上创建一个新文件:

/etc/systemd/system/apt-daily.timer.d/apt-daily.timer.conf

[Timer]
Persistent=false
Run Code Online (Sandbox Code Playgroud)

这将覆盖默认的systemd计时器,该计时器触发apt-daily在引导时立即运行(默认的persistent = true表示如果在系统关闭时错过了该作业,则它将在引导时立即运行).此文件将覆盖此文件中的默认设置:

/lib/systemd/system/apt-daily.timer

这就是我做的,因为我建立了自己的流浪盒,我可以确认它是有效的.

选项2

使用此xenial图像

https://github.com/geerlingguy/packer-ubuntu-1604

Geerlingguy通过禁用无人值守升级解决了这个问题.你可以在这里看到讨论

https://github.com/geerlingguy/packer-ubuntu-1604/issues/3#issue-154560190