【问题标题】:Ansible password_hash wont' use bcrypt even though passlib is installed即使安装了 passlib,Ansible password_hash 也不会使用 bcrypt
【发布时间】:2019-04-26 21:38:12
【问题描述】:

我正在尝试调用 Ansible 的 password_hash 函数...

{{ admin_password | password_hash('bcrypt') }}

我已经尝试了十几种方法来告诉 Ansible passlib 和 python 2.7 在哪里,但无论如何,我不断得到结果......

"AnsibleFilterError: crypt.crypt does not support 'bcrypt' algorithm"

据我所知,ansible 过去只使用crypt,但较新的版本(我目前在 2.7.9 上)使用passlib,据我所知,passlib 支持 bcrypt(这是有限的)。我已将以下内容添加到我的主机文件中...

ansible_python_interpreter = /usr/bin/python2.7

我正在像这样安装 PIP 和 Passlib...

- name: Install PY stuff...
  yum: 
    name: ['python2-pip','python2-passlib']
    state: present

- name: Ensure bcrypt support is installed for python passlib
  pip:
   name: "passlib[bcrypt]"
   executable: pip-2.7

我本来希望 yum 调用可以正确设置 passlib,但它不起作用,所以我尝试只通过 PIP 进行操作,它也不起作用,所以我尝试了上面的方法,但仍然没有在职的。我不确定 passlib 在通过 yum 安装时是否包含 bcrypt,因为它似乎只使用 PIP 时没有,所以为了以防万一,我两者都做了。不开心。

我应该补充一点,我在 Amazon Linux 2 上的 AWS 中,并且我已经启用了 epel 存储库等。


编辑:我已经尝试了 cmets 的一些建议(使用 passlib 1.6,验证 bcrypt 是否适用于 python),虽然我可以验证 passlib 在 python 中测试时确实有效,但我继续得到相同的答案Ansible AnsibleFilterError: crypt.crypt does not support 'bcrypt' algorithm

我发现与此相关的唯一内容是:https://github.com/ansible/ansible/issues/17266,但它描述了默认查找 passlib 并且仅在 crypt.crypt 不存在时回退。那么为什么 python 在我手动运行时会看到 passlib,而不是从 playbook 中呢?

【问题讨论】:

  • 记录在案。安装“python-passlib”解决了与 Ubuntu 完全相同的问题。
  • @VladimirBotka 你的意思是不是python2-passlib?这不是针对较小版本的 Python 吗?你有任何我能读到的与你的意思相关的链接吗?
  • 在 Ubuntu 18.04、ansible 2.7.9 和 python 2.7.15rc1 中,test playbook 报告了 “AnsibleFilterError: crypt.crypt 不支持 'bcrypt' 算法”。通过安装“python-passlib”解决了这个问题。没有 python2-passlib。
  • @VladimirBotka 尝试删除 passlib 1.7 并强制安装“过时的”1.6,但没有区别。将其放入剧本中,以防万一在图片中没有 1.7 的全新安装可能会有所作为,但没有乐趣。来自 Ansible 的相同错误,并且与我在下面的 '@'larsks 的 cmets 中描述的结果相同。
  • YMMV 与 Amazon Linux 2。我的第一条评论“供记录”的目的是通知找到此线程的 Ubuntu 用户。我认为您必须将问题提交给适当的 Amazon Linux 论坛。

标签: python ansible bcrypt


【解决方案1】:

首先,验证 Ansible 是否使用了您认为的 Python。查看head -1 $(which ansible),您应该会看到如下内容:

#!/usr/bin/python2

确保您已将 passlib 安装在 Python 可以找到的位置:

$ /usr/bin/python2
Python 2.7.15 (default, Oct 15 2018, 15:24:06) 
[GCC 8.1.1 20180712 (Red Hat 8.1.1-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import passlib
>>> 

我使用的是 Fedora 28,所以我可以简单地yum -y install python2-passlib

确保passlib 支持bcrypt

>>> from passlib.hash import bcrypt
>>> bcrypt.hash('secret')
'$2b$12$3YUj4BgoJ8ba1H4XtH/p3.4DG0lMgaHQ4qYshpj/.COe1eHEU.71K'
>>> 

如果以上所有都成功,password_hash 过滤器应该 工作:

$ cat playbook.yml
---
- hosts: localhost
  gather_facts: false
  tasks:
    - debug:
        msg: "{{ 'secret' | password_hash('bcrypt') }}"

$ ansible-playbook playbook.yml 
PLAY [localhost] ********************************************************************

TASK [debug] ************************************************************************
ok: [localhost] => {
    "msg": "$2b$12$H9rnvJwYtSoy05WHMYuJR.Kaz9kxLJleT7XUsIauWwd3Mdk0H/Kl6"
}

PLAY RECAP **************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   

【讨论】:

  • 非常感谢详细的答案和调试手册,会试一试。
  • 所以,在我测试 ansible 调试的时候,一切似乎都检查过了,“msg”的值是空的。从控制器运行我的完整剧本时没有像我遇到的错误,但也没有输出。也没有使用 -vvvv 的额外细节,看起来它使用的是正确的 python。有什么想法吗?
  • 如果对password_hash 的调用在模板中会有所不同吗?是否可以在控制器而不是主机上进行调用?
【解决方案2】:

当我在 Jinja2 模板中使用 bcrypt 遇到问题时,Google 指出了这个问题。

{{ k }}: {{ v | password_hash('bcrypt')}}

正在返回:

OSError: [Errno 22] Invalid argument

像很多人一样,我安装了“passlib”,但它仍然无法正常工作。我做错什么了?您必须在本地控制器上安装“passlib”,而不是在远程主机上!

希望它可以帮助别人!

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多