Ansible password_hash无法使用bcrypt,即使安装了passlib。

3
我正在尝试这样调用Ansible的password_hash函数...,也就是说,我想使用该函数对密码进行哈希处理...
{{ admin_password | password_hash('bcrypt') }}

我尝试了很多种方法告诉Ansible密码库和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,也没能解决问题,所以我尝试了上面提到的方法,但仍然不起作用。我不确定通过yum安装时是否包括bcrypt,因为当仅使用PIP时似乎不包括,因此为了确保,我两个都试了一下,但都无济于事。
我应该补充说明我在AWS上使用Amazon Linux 2,并启用了epel存储库等。
编辑:我尝试了几个评论中的建议(使用passlib 1.6,验证bcrypt是否与Python配合使用),虽然我可以验证在Python内部测试时passlib有效,但我仍然收到来自Ansible的相同答案“AnsibleFilterError: crypt.crypt does not support 'bcrypt' algorithm”。
我找到唯一与此相关的东西是这里:https://github.com/ansible/ansible/issues/17266,但它描述了默认情况下寻找passlib并且只有当不存在时才回退到crypt.crypt。那么为什么当我手动运行它时Python看到passlib,但从playbook中却没有呢?

就记录而言,Ubuntu遇到的问题可以通过安装“python-passlib”解决。 - undefined
@VladimirBotka 你是不是指的是python2-passlib?那不是用于较旧版本的Python吗?你有没有相关阅读材料的链接可以提供给我看看? - undefined
在Ubuntu 18.04上,使用ansible 2.7.9和python 2.7.15rc1时,测试playbook报告了“AnsibleFilterError: crypt.crypt不支持'bcrypt'算法”的错误。通过安装"python-passlib"解决了这个问题。没有python2-passlib可用。 - undefined
@VladimirBotka 尝试移除 passlib 1.7 并强制安装“过时”的 1.6 版本,但没有任何差异。为了确保在没有 1.7 版本的情况下进行全新安装可能会有所不同,将其纳入到 playbook 中,但是没有成功。Ansible 给出了相同的错误,并且与我在对 '@'larsks 的评论中描述的结果相同。 - undefined
1
YMMV with Amazon Linux 2. The intention of my 1st comment "For the record" is to inform Ubuntu users who find this thread. I think you'll have to bring the issue to an appropriate Amazon Linux forum. - undefined
3个回答

11
首先,确认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   

非常感谢详细的回答和调试指南,我会尝试一下。 - undefined
所以,一切似乎都没问题,直到我测试ansible debug时,"msg"的值为空。与从控制器运行完整playbook时得到的错误不同,也没有输出。使用-vvvv也没有额外的细节,看起来它正在使用正确的Python。有什么想法吗? - undefined
如果将对password_hash的调用放在模板中,会有什么不同吗?这个调用是否可以在控制器而不是主机上进行? - undefined

6

当我在Jinja2模板中使用bcrypt遇到问题时,Google提供了这个解答。

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

返回结果是:

OSError: [Errno 22] Invalid argument

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

希望这能帮到其他人!


0

pip3 install passlib
或者尝试指定标识符: 2a$12, '2b$12', ...
{{ 'PaSsword' | password_hash('bcrypt', ident='2b$12') }}
Python 3.10.8ansible [core 2.13.0]上测试通过
在Ubuntu上需要安装libpython3.x-stdlib,在CentOS上需要安装python3-libs
检查python3 -c 'import crypt; print("OK")'


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接