zaki work log

作業ログやら生活ログやらなんやら

[Ansible] password_hashフィルター使用時はpasslibパッケージを入れておく

Ansibleクックブックの「2-3-3 パスワードをハッシュ化する」にも載っているpassword_hashフィルターで発生したエラーについて簡単にまとめ。

docs.ansible.com

Ansible10 (ansible-core 2.17)の場合

password_hashフィルターを使っているタスクを、Ansible10 (ansible-core 2.17)で実行すると発生したエラーが以下。

fatal: [hostname]: FAILED! => 
  msg: Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'. Unable to encrypt nor hash, passlib must be installed. No module named 'passlib'

メッセージに従ってpasslibを追加すれば解決。

$ pip install passlib
Collecting passlib
  Using cached passlib-1.7.4-py2.py3-none-any.whl.metadata (1.7 kB)
Using cached passlib-1.7.4-py2.py3-none-any.whl (525 kB)
Installing collected packages: passlib
Successfully installed passlib-1.7.4

Ansible9 (ansible-core 2.16)の場合

passlibが無い場合、1つ前のバージョンだと以下の警告が出力され、2.17で使えなくなる旨が確認できていて、これもpasslibをインストールしていれば解決する。

[DEPRECATION WARNING]: Encryption using the Python crypt module is deprecated. The Python crypt module is 
deprecated and will be removed from Python 3.13. Install the passlib library for continued encryption 
functionality. This feature will be removed in version 2.17. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.

どういうこと?

password_hashフィルターのページには記載はないが、フィルタープラグインそのもののページには以下の記載がある。

Hash types available depend on the control system running Ansible, ansible.builtin.hash depends on hashlib, ansible.builtin.password_hash depends on passlib. The crypt is used as a fallback if passlib is not installed.

https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_filters.html#hashing-and-encrypting-strings-and-passwords

つまり、元々はpasslibが無ければcryptが使われる動作だったが、Pythonのcryptはdeprecatedになっている(3.13で無くなる)ためansible-core 2.17ではcryptを使わずpasslib必須になったよ、ということ。

環境

$ python --version
Python 3.12.3
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04 LTS"

Python 3.13でも試そうかと思ったけど、まだリリース前だった