コマンドが返される前に無人アップグレードを終了し、無効/削除します。

コマンドが返される前に無人アップグレードを終了し、無効/削除します。

ここで問題が発生しました。 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をクリーンインストールして実行しています。


許可された回答を使用して生成されたソリューションは次のとおりです。

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

ベストアンサー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

dpkgSIGTERM を送信するか、apt-getより早く完了するために何かを送信するかどうかについてではありません。killこれは信号を送信するだけで、何も待ちません。原則としてリリースされたリソースを使用するには、常に何らかの方法で待機する必要があります。

おすすめ記事