我在这里遇到了一个问题,我尝试使用 Ansible 自动化设置。
某些步骤需要与 交互apt
,但有时我会收到错误,因为无人值守升级启动并锁定了 apt。这将使剧本停止。
我已经尝试了很多方法来解决这个问题,最成功的是重复失败的 apt 命令。
但这无法扩展,也不是 100% 可靠并且感觉很糟糕。
我选择apt -y purge unattended-upgrades
在剧本的开头发布权利。我也试过apt -y remove unattended-upgrades
了,但是那个似乎还在工作时又回来了。清除似乎会像退出之前一样关闭无人值守的升级,这正是我想要的。
但事实证明,即使是对的调用也apt -y purge unattended-upgrades
可能由于锁定而失败。所以我把它改成了while [[ $(dpkg -l | grep -P "unattended-upgrades" | wc -c) -ne 0 ]]; do apt -y purge unattended-upgrades; done
,但偶尔也会失败(我不知道为什么)
我需要一个命令,该命令在执行时将立即终止并掩埋无人看管的升级,无论它是否正在运行,并保证一旦该命令返回它就不会再启动,直到我apt install
再次明确它。如果该命令需要一分钟来完成它的工作,那没关系。
此外,系统没有安装 Python,因此 Ansible 仅发出raw
命令,直到我设法安装 Python,这应该是在成功调用apt -y update
我处于可以轻松触发无人值守升级的状态,因为这是一个虚拟机,一旦我发出date -s
更正过时日期的命令,无人值守升级就会启动。启动虚拟机后,我有几分钟的时间直到date
自动更正,然后开始无人值守升级。
这就是我现在正在做的事情:
- name: Disable autoupdate (part 1 of 2)
raw: sed -i /Update/s/"1"/"0"/ /etc/apt/apt.conf.d/10periodic && sync
- name: Disable autoupdate (part 2 of 2)
raw: echo 'APT::Periodic::Unattended-Upgrade "0";' >> /etc/apt/apt.conf.d/10periodic && sync
- name: Terminate any active autoupdate
raw: ps -A | grep unattended-upgrades | awk '{print $1}' | xargs -r kill -15 $1
- name: Terminate any active dpkg
raw: ps -A | grep dpkg | awk '{print $1}' | xargs -r kill -15 $1
- name: Allow dpkg to recover
raw: dpkg --configure -a
- name: Purge autoupdate
raw: apt -y purge unattended-upgrades
- name: Update apt cache
raw: apt -y update
- name: If needed, install Python
raw: test -e /usr/bin/python || apt -y install python
终止 dpkg 让我毛骨悚然。所有这些都在全新安装的 Ubuntu Server 18.04.1 上运行
这是使用接受的答案创建的解决方案:
显然
unattended-upgrades
是从系统单元 apt-daily.service / apt-daily-upgrade.service 之一运行的。(这些又由.timer
同名的 systemd 单元触发)。您可以尝试等待 systemd 单元,如下所示:
这与您是否要发送 SIGTERM
dpkg
或apt-get
其他东西来尝试让它们更快地完成无关。kill
只传输一个信号;它不等待任何东西。原则上,您总是需要某种方式等待,然后才能使用已释放的资源。