インフラ

[Ansible] “yum lockfile is held by another process “エラーの対処法

ansible28yum

こんにちは、ちゃりおです。

yumモジュールを使って複数のパッケージをインストール際に、"yum lockfile is held by another process"のエラーがでてはまったので解決方法を共有します。

ちゃりお
ちゃりお
yumで複数パッケージインストール時のエラー対策です!

Contents

結論

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というパラメータが追加されていました。

Ansible yum module

yum module

lock_timeoutを追加したら、正常に動作しました。

- name: Install stuff
  yum:
    name:
    - git
    - python36
    lock_timeout: 180

まとめ

複数パッケージをAnsibleでインストールすることは、よくあると思います。
Ansible2.8を使用する際は、lock_timeoutを忘れず指定するようにします。

Amazonで「Ansible」の本をみてみる!!

関連記事

[Ansible入門]俺でもできた!Vagrantを使ってAnsible環境を作る(MAC・Windows)VagrantでAnsible練習用の環境を作ります。Mac向けの手順となっていますが、Windowsでもできるよう注釈を入れています。...
【Ansible】playbookを分割してユーザ作成・グループ作成をする以前、ユーザの作成をやってみたのですが、今回はplaybookを分けてやってみます。 playbookを分けると、再利用性や可読性が高...
効率よく公開鍵を配布する方法 Ansibleで複数のサーバとユーザに公開鍵を登録する複数のユーザを作成して、それぞれ公開鍵を配置したい時がたまにあります。 sshして公開鍵を置くのは、面倒です。1台とかだったらいいかもし...