web-dev-qa-db-ja.com

無人アップグレードを終了して無効化/削除してから、コマンドが返されます

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に変更しましたが、それも時々失敗します(理由がわかりません)

実行すると、実行中かどうかに関係なく、無人アップグレードを即座に終了して埋めるコマンドが1つ必要です。また、明示的にapt installするまで、そのコマンドが返されるとすぐに起動しないことを保証します。 そのコマンドがジョブを完了するのに1分かかる場合は問題ありません。

また、システムにはPythonがインストールされていないため、Ansibleはrawコマンドを発行しているだけで、Python apt -y updateの呼び出しが成功した後

これは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の終了は私を忍び寄らせるものです。 Ubuntu Server 18.04.1の新規インストールで実行されるすべて


これは、受け入れられた回答を使用して作成されたソリューションです:

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

5
Daniel F

どうやらunattended-upgradesは、systemdユニットapt-daily.service/apt-daily-upgrade.serviceの1つから実行されています。 (これらは、同じ名前のsystemd .timerユニットによってトリガーされます)。

次のようにsystemdユニットを待つことができます。

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

これは、SIGTERMをdpkgまたはapt-getのどちらに送信するか、またはそれらをより速く完了するようにするかとは無関係です。 killは信号のみを送信します。何も待ちません。原則として、解放されたリソースを使用する前に、常に何らかの待機方法が必要です。

8
sourcejedi