В анзибле довольно удобно использовать что-то вроде этого:
- name: Make sure user password is set
user:
name: my_user
password: "{{ user_password|password_hash('sha512', 'SomeSalt') }}"
где user_password - это пароль в виде открытого текста, хранящийся в доступном файле хранилища.
В моем ansible 2.5.0, работающем на MacOS, создается хэш пароля, который выглядит примерно так:
$6$rounds=656000$SomeSalt$PlupV2TAHwwc520gHp0dL4padL5EHa50G6hdYm.JLuy4pnP5u2F.HRAHZrGY77BwdRv5UbUGqIAbuhehS00ZD0
У меня проблема в том, что устройство, которое я пытаюсь настроить, является Raspberry Pi, и, как вы можете видеть из сгенерированного хэша, rounds=656000
. Для генерации хэша требуется довольно много вычислительной мощности, а на Raspberry Pi это занимает 10-15 секунд. Это означает, что после того, как этот хэш пароля установлен для пользователя, любое действие, которое требует, чтобы Raspberry Pi генерировал хеш для сравнения с ним, например, вход в систему или изменение пароля, также требует 10-15 секунд.
Хуже того, после того, как этот хэш пароля установлен для пользователя, если это пользователь, который подключается к ansible, каждая отдельная задача, выполняемая ansible, занимает значительно больше времени. Время, в течение которого моя playbook запускается против Raspberry Pi в первый раз (когда у задач действительно есть работа) с паролем по умолчанию, составляло около 15 минут. Моя playbook устанавливает пароль пользователя в самом конце. Второй прогон (когда задачам нечего делать) длился около 30 мин.
Я не вижу способа изменить количество раундов в документации для фильтра password_hash (). Можно ли каким-либо образом настроить это значение?
Проведя небольшое исследование, очевидно, что это был запрос функции.
Реализовано Вот.
Для этой функции есть запрос на слияние Вот.
Насколько я могу судить, над этой функцией все еще ведется работа, и она была закрыта из-за бездействия без включения в основной код доступа. Он может быть повторно открыт и завершен в какой-то момент, но текущий доступный код не имеет этой функции.
Похоже, нет возможности предоставить аргумент раундов с использованием фильтра password_hash. Функция, вызываемая фильтром, принимает в качестве аргументов только пароль, тип хэша и соль.
Если вам действительно нужно это установить, вы можете установить mkpasswd (часть пакета whois в Debian / Ubuntu) и запустить его. Это не совсем безопасно: если бы другой человек наблюдал за запущенными процессами в системе, в которой вы запускаете ansible, он бы увидел пароль в выводе «ps ax».
- hosts: slowremote
gather_facts: no
tasks:
- shell: |
echo 'hunter2' | mkpasswd --method=sha-512 --rounds=1000 --stdin
register: results
delegate_to: localhost
- debug:
var: results.stdout_lines
- name: Make sure user password is set
user:
name: my_user
password: "{{results.stdout_lines}}"
я использовал ожидать модуль для выполнения пароль:
- name: Install required lib
apt:
name: 'python-expect'
state: present
- name: Change user's password
expect:
command: passwd pi
responses:
'Enter new UNIX password:': "{{ new_password }}"
'Retype new UNIX password:': "{{ new_password }}"
no_log: True