我在这里遇到了一个问题,我试图用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命令,直到我成功地调用apt -y update之后才能安装Python
我处于这样一种状态,我可以很容易地触发无人值守的升级,因为这是一个VM,一旦我发出一个date -s命令来纠正陈旧的日期,无人值守的升级就会启动。启动VM后,我有几分钟的时间,直到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。所有这些都是在UbuntuServer18.04.1的新安装上运行的。
Here是通过使用可接受的答案:创建的解决方案
发布于 2018-08-19 13:38:19
显然,unattended-upgrades是由一个系统单元apt-daily.service /apt-日升级服务运行的。(这些都是由具有相同名称的systemd .timer单元触发的)。
您可以尝试等待系统单元,如下所示:
systemd-run --property="After=apt-daily.service apt-daily-upgrade.service" --wait /bin/true这与您是否希望将SIGTERM发送到dpkg或apt-get或其他试图让它们更快完成的事情无关。kill只发送一个信号;它不等待任何东西。原则上,在使用释放的资源之前,您总是需要某种方式等待。
https://unix.stackexchange.com/questions/463498
复制相似问题