在命令返回之前终止并禁用/删除无人值守升级

在命令返回之前终止并禁用/删除无人值守升级

我在这里遇到一个问题,我尝试使用 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 上运行


这是使用已接受的答案创建的解决方案:

https://stackoverflow.com/a/51919678/277267

答案1

显然unattended-upgrades是从 systemd 单元 apt-daily.service / apt-daily-upgrade.service 之一运行的。 (这些依次由.timer具有相同名称的 systemd 单元触发)。

您可以尝试按如下方式等待 systemd 单元:

systemd-run --property="After=apt-daily.service apt-daily-upgrade.service" --wait /bin/true

dpkg这与您是否想要发送 SIGTERM或apt-get尝试让它们更快完成的东西无关。kill只传输信号;它不等待任何事情。原则上,您总是需要某种方式等待,然后才能使用释放的资源。

相关内容