在 ansible 中,使用如下命令非常方便:
- name: Make sure user password is set
user:
name: my_user
password: "{{ user_password|password_hash('sha512', 'SomeSalt') }}"
其中 user_password 是纯文本密码,存储在 ansible vault 文件中。
在我的 MacOS 上运行的 ansible 2.5.0 上,这会生成一个如下所示的密码哈希:
$6$rounds=656000$SomeSalt$PlupV2TAHwwc520gHp0dL4padL5EHa50G6hdYm.JLuy4pnP5u2F.HRAHZrGY77BwdRv5UbUGqIAbuhehS00ZD0
我遇到的问题是,我尝试配置的设备是 Raspberry Pi,从生成的哈希值可以看出。rounds=656000
这需要相当多的处理能力来生成哈希值,在 Raspberry Pi 上,需要 10-15 秒。这意味着一旦为用户设置了此密码哈希值,任何需要 Raspberry Pi 生成哈希值以与其进行比较的操作(例如登录或密码更改)也需要 10-15 秒。
更糟糕的是,一旦为用户设置了此密码哈希,如果 ansible 以该用户的身份进行连接,则 ansible 运行的每个任务都需要更长的时间才能完成。我的剧本第一次(当任务实际上有工作要做时)使用默认密码对 Raspberry Pi 运行的时间长度约为 15 分钟。我的剧本在最后设置用户密码。第二次运行(当任务没有任何工作要做时)大约需要 30 分钟。
我在 password_hash() 过滤器的文档中没有找到更改轮数的方法。这个值可以以任何方式配置吗?
答案1
似乎没有任何选项可以使用 password_hash 过滤器提供 rounds 参数。过滤器调用的函数仅接受密码、哈希类型和盐作为参数。
- https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/filter/core.py#L562
- https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/filter/core.py#L271
如果您确实需要设置它,您可以安装 mkpasswd(Debian/Ubuntu 上 whois 包的一部分),然后运行它。这不是完全安全的,如果另一个人在您正在运行 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}}"
答案2
答案3
我用了预计要执行的模块密码:
- 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