こんにちは、ちゃりおです。
yumモジュールを使って複数のパッケージをインストール際に、"yum lockfile is held by another process"
のエラーがでてはまったので解決方法を共有します。
結論
Ansible 2.8.0 からyum モジュールの lock_timeoutが追加されました。
2.8.0 ではデフォルト 0 だったのが、2.8.3 で 30 (秒)になりました。
上記のエラーが出た場合は、最新版に上げると解決すると思います。
それでも、だめな場合は下記の手順でyum_locktimeoutの値を変更しましょう。
エラー
環境
- OS: AmazonLinux2
- Ansible: 2.8.0
ローカルのMacからAWS上にあるAmazonLinux2にPlaybookを実行しました。
エラー内容
main.yml
---
- name: Install stuff
yum:
name:
- git
- python36
上記は、gitとpython36をyumでインストールするタスクです。
タスク実行時、gitのインストールは成功するけどpython36のインストール時に"yum lockfile is held by another process"
というエラーがでてpython36のインストールに失敗します。
もう一度、Playbookを実行するとpython36のインストールも成功します。
古いバージョンのAnsibleでは成功していたので、アップデート起因かと推測しました。
解決策
GitHubのissueにあがっていました。
Regular “yum lockfile is held by another process” errors with package/yum modules in Ansible 2.8.0
- Ansible 2.8では、ロックの処理と待機に関する機能が追加された。
- モジュールがロックを取得するのを待つか、ロックファイルが存在する場合は終了するかを指定する必要がある。
- lock_timeoutというパラメータを使用することで制御できる。
- この引数のデフォルトは0で、待機しない。
- ロックを取得できなかった場合、正数は終了する前にその秒数だけ待機する。
どうやら、lock_timeout
というのを追加する必要がありそうです。
公式ドキュメントを確認すると、yumにlock_timeout
というパラメータが追加されていました。
lock_timeout
を追加したら、正常に動作しました。
- name: Install stuff
yum:
name:
- git
- python36
lock_timeout: 180
まとめ
複数パッケージをAnsibleでインストールすることは、よくあると思います。
Ansible2.8を使用する際は、lock_timeout
を忘れず指定するようにします。