Ansibleクックブックの「2-3-3 パスワードをハッシュ化する」にも載っているpassword_hash
フィルターで発生したエラーについて簡単にまとめ。
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.
つまり、元々は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でも試そうかと思ったけど、まだリリース前だった