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の新規インストールで実行されるすべて
これは、受け入れられた回答を使用して作成されたソリューションです:
どうやら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
は信号のみを送信します。何も待ちません。原則として、解放されたリソースを使用する前に、常に何らかの待機方法が必要です。