여기서 문제가 발생했습니다. Ansible을 사용하여 설정을 자동화하려고 합니다.
일부 단계에서는 상호 작용이 필요 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
.명령이 작업을 완료하는 데 1분 정도 걸리더라도 괜찮습니다.
또한 시스템에는 Python이 설치되어 있지 않으므로 Ansible은 raw
호출이 성공한 후에 Python을 설치할 때까지만 명령을 실행합니다.apt -y update
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를 종료하면 겁이 납니다. 모두 Ubuntu Server 18.04.1을 새로 설치하여 실행 중입니다.
허용된 답변을 사용하여 생성된 솔루션은 다음과 같습니다.
답변1
분명히 unattended-upgrades
시스템 장치 apt-daily.service / apt-daily-upgrade.service 중 하나에서 실행되고 있습니다. (이는 .timer
동일한 이름을 가진 시스템 장치에 의해 차례로 트리거됩니다 .)
다음과 같이 systemd 장치를 기다려볼 수 있습니다.
systemd-run --property="After=apt-daily.service apt-daily-upgrade.service" --wait /bin/true
dpkg
SIGTERM을 보내려는지 또는 apt-get
더 빨리 완료하기 위해 무언가를 보낼지 여부에 관한 것이 아닙니다. kill
이는 신호를 전송하기만 하며 아무것도 기다리지 않습니다. 원칙적으로 릴리스된 리소스를 사용하려면 항상 어떤 방식으로든 기다려야 합니다.