Ansible password_hash не будет использовать bcrypt, хотя passlib установлен - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь вызвать функцию 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, насколько я понимаю (что ограничено). Я добавил следующее в мой файл hosts ...

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 bcrypt при установке через yum, потому что при использовании только PIP этого не происходит, так что на всякий случай я сделал и то, и другое. Радости нет.

Я должен добавить, что я нахожусь в AWS на Amazon Linux 2, и я включил репозиторий epel и т. Д.


РЕДАКТИРОВАТЬ: я попробовал несколько предложений из комментариев (используя 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?

1 Ответ

0 голосов
/ 27 апреля 2019

Сначала убедитесь, что 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   
...