Ansible:未设置时保持密码不变

eba*_*ere 3 ansible ansible-playbook

我正在尝试使用 with_dict 在 Ansible 中创建一组用户。问题是有时用户已经存在而我没有密码。在这种情况下,我只想跳过设置密码,但管理其余的用户属性。这是一个丑陋的解决方法,但必须有更好的方法来做到这一点:

- name: create FTP users (password known)
  user:
    name: "{{ item.key }}"
    comment: "{{ item.value.comment | default('') }}"
    password: "{{ item.value.password }}"
    shell: "{{ item.value.shell | default('/sbin/nologin') }}"
    home: "{{ item.value.home | default('/var/ftp/' + item.key) }}"
    createhome: "{{ item.value.createhome | default('no') }}"
  with_dict: "{{ ftp_users }}"
  when: item.value and item.value.password is defined

- name: create FTP users (password unknown)
  user:
    name: "{{ item.key }}"
    comment: "{{ item.value.comment | default('') }}"
    shell: "{{ item.value.shell | default('/sbin/nologin') }}"
    home: "{{ item.value.home | default('/var/ftp/' + item.key) }}"
    createhome: "{{ item.value.createhome | default('no') }}"
  with_dict: "{{ ftp_users }}"
  when: item.value.password is not defined
Run Code Online (Sandbox Code Playgroud)

我还发现我可以将每个用户的密码从 /etc/shadow 中提取到 ansible,但这也有点难看。如果未设置 dict 值,有没有办法简单地不尝试管理密码属性?

Kon*_*rov 6

摘自用户模块文档:

update_passwordalways/ on_createalways如果密码不同,将更新密码。on_create只会为新创建的用户设置密码。

要跳过未知参数,请使用omit

password: "{{ item.value.password | default(omit) }}"
Run Code Online (Sandbox Code Playgroud)