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

在ansible中添加用户并强制更改密码,在添加新用户时重置用户密码,ansible,Ansible,我在Ansible和向服务器添加新用户方面遇到问题。 首先,我检查用户是否出现在系统上,如果没有,然后我继续创建他们 我在这里发现了一个类似的问题: 通过添加一个简单的salt,我能够修复在文件userlist中添加新用户时更改的状态。 然而,最后一部分,即处理程序,总是被执行的 我的剧本是这样的: --- - hosts: all become: yes vars_files: - /home/ansible/userlist tasks: - name: chec

我在Ansible和向服务器添加新用户方面遇到问题。 首先,我检查用户是否出现在系统上,如果没有,然后我继续创建他们

我在这里发现了一个类似的问题: 通过添加一个简单的salt,我能够修复在文件userlist中添加新用户时更改的状态。 然而,最后一部分,即处理程序,总是被执行的

我的剧本是这样的:

---
- hosts: all
  become: yes
  vars_files:
    - /home/ansible/userlist
  tasks:
    - name: check user exists  #check if user exists in system, using the username and trying to search inside passwd file
      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
当我运行playbook而不更改userlist文件时,一切正常。 但是,如果我向文件中添加一个新用户,那么当现有用户尝试登录时,系统会强制他们更改密码,因为处理程序总是被调用的。
是否有任何方法可以改变代码,使立即更改密码的强制操作仅对新创建的用户执行?

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

userexists正在分别注册每个结果,但您只引用整个失败结果。使用debug语句显示变量以了解我的意思 如果通知处理程序,则您将在所有用户上循环,而不仅仅是那些已更改(即已创建)的用户 有几种不同的方法可以解决这个问题,但我认为这可能是最简洁的:

  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

您可以使用阻塞和救援。请在这里找到一个例子。因此,根据我的理解,我应该尝试在block语句中循环,当用户失败时,将调用rescue任务。但是,在上面的示例中,我如何更改代码,使chage-d0{{{item}}命令只在失败的用户上运行?非常感谢,伙计!我测试了一些东西,它似乎有效。简单的问题。在处理程序上,您正在循环在上一个任务中注册的useradd,然后您只在它发生更改时执行它,对吗?我可以打印item.name的值吗?我尝试使用useradd.results.name,但它不起作用。无论如何,谢谢你的帮助!干杯是,仅当至少添加了一个新用户时,处理程序才会执行。然后,处理程序将在所有用户上循环,但仅更新注册为已更改用户的密码到期时间。无法打印useradd.results.name的原因是useradd.results是一个列表。您需要在循环中使用它,并打印item.name,或对诸如useradd.results[0].name这样的单个条目进行寻址