在 ansible 中添加用户并强制执行密码更改,添加新用户时重置用户密码



我在使用 Ansible 时遇到问题并向服务器添加新用户。 首先,我检查系统上是否存在用户,如果没有,则继续创建它们。

我在这里发现了一个类似的问题:ansible 用户模块总是显示更改 并且我能够通过添加简单的盐在文件用户列表中添加新用户时修复更改的状态。 但是,始终执行最后一部分,即处理程序。

这是我的剧本的样子:

---
- hosts: all
become: yes
vars_files:
- /home/ansible/userlist
tasks:
# check if user exists in system, using the username 
# and trying to search inside passwd file
- name: check user exists  
getent:
database: passwd
key: "{{ item }}"
loop: "{{ users }}"
register: userexists
ignore_errors: yes
- name: add user if it does not exit
user:
name: "{{ item }}"
password: "{{ 'password' | password_hash('sha512', 'mysecretsalt')  }}"
update_password: on_create
loop: "{{ users }}"
when: userexists is failed
notify: change password
handlers:
- name: change user password upon creation
shell: chage -d 0 "{{ item }}"
loop: "{{ users }}"
listen: change password

这是一个名为userlist的简单文件:

users:
- testuser1
- testuser2
- testuser3
- testuser22

当我在不更改用户列表文件的情况下运行剧本时,一切都很好。 但是,如果我向文件添加新用户,那么当现有用户尝试登录时,系统会强制他们更改密码,因为始终调用处理程序。 有没有办法更改代码,使立即更改密码的强制仅在新创建的用户上执行?

您的剧本中有 2 个主要问题:

  1. userexists单独注册每个结果,但您仅引用整体"失败"结果。使用debug语句显示变量以了解我的意思
  2. 如果通知处理程序,您将循环访问所有用户,而不仅仅是那些已"更改"(即已创建(
  3. 的用户

有几种不同的方法可以解决这个问题,但我认为这可能是最简洁的:

tasks:
- name: add user if it does not exist
user:
name: "{{ item }}"
password: "{{ 'password' | password_hash('sha512', 'mysecretsalt')  }}"
update_password: on_create
loop: "{{ users }}"
register: useradd
notify: change password
handlers:
- name: change user password upon creation
shell: chage -d 0 {{ item.name }}
loop: "{{ useradd.results }}"
when: item.changed
listen: change password

最新更新