即使安装了passlib,Ansible password_hash也不会使用bcrypt

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即使安装了passlib,Ansible password_hash也不会使用bcrypt相关的知识,希望对你有一定的参考价值。

我试图这么称呼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 repo等。


编辑:我已经尝试了几个评论的建议(使用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?

答案

首先,验证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   

以上是关于即使安装了passlib,Ansible password_hash也不会使用bcrypt的主要内容,如果未能解决你的问题,请参考以下文章

ansible创建用户时,密码问题

Ansible 研究

Flask 学习-25.passlib 对密码加密与验证

在ansible中运行ssh pass时无法与服务器协商

ansible 解密 加密 文件

Ansible中安装模块出错