要点
do-release-upgrade
を叩くとAnsibleが動作しなくなり進まなくなる
原因
Pythonインタプリタを指定していない場合、Ansibleが気を利かせて利用できるPythonインタプリタを直接バージョンで指定してくれます。
しかし、do-release-upgrade
を実行するとPythonインタプリタも置き換えられ、場合によっては実行中に利用していたインタプリタが利用できなくなりTaskが中断してしまいます。
再度プレイブックを実行すれば新しいバージョンのインタプリタを検出して実行できますが、せっかくAnsibleで作業しているのに叩き直すのは無駄なことこの上ありません。
対策
vars
にansible_python_interpriter
を設定し、/usr/bin/python3
を指定することでアップグレードされても影響を受けずに実行を継続することが出来ます。
タスク単位で設定してもいいですし、面倒なら対象ホスト一覧で直接定義しても良いでしょう。
do-release-upgrade
を無人実行するには
下記の通りのタスクを実行してください。
- name: Update-manager-coreをインストール(do-release-upgradeに必要なため)
ansible.builtin.apt:
name: update-manager-core
state: present
- name: 新しいLTSリリースがないかを確認
ansible.builtin.command: do-release-upgrade -c --allow-third-party
register: release_check
changed_when: false
ignore_errors: true
- name: 新しいLTSリリースがある場合、アップグレードを実施
ansible.builtin.command: do-release-upgrade -f DistUpgradeViewNonInteractive
register: upgrade_result
async: 1800
poll: 30
changed_when: true
ignore_errors: true
when: "'There is no development version of an LTS available.' not in release_check.stdout" # 新しいリリースが見つかった場合のみ実行
- name: 新しいLTSリリースがある場合、再起動を実施
ansible.builtin.reboot:
reboot_timeout: 600 # 再起動後、最大600秒待機
when: "'There is no development version of an LTS available.' not in release_check.stdout" # 新しいリリースが見つかった場合のみ実行
do-release-upgrade -f DistUpgradeViewNonInteractive
は、アップデート中に発生するインタラクティブ操作を全てカットします。
まあまあ時間がかかるので、async/pollにしています。
Intel N150の4vCPU/4GB環境でだいたい15分くらいかかりました。