【问题标题】:Adding users in ansible and enforcing password change, resets user's password when adding new user在ansible中添加用户并强制更改密码,添加新用户时重置用户密码
【发布时间】:2019-09-03 12:03:05
【问题描述】:

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

我在这里发现了一个类似的问题:ansible user module always shows changed 当在文件用户列表中添加一个新用户并添加一个简单的盐时,我能够修复更改的状态。 然而,最后一部分,即处理程序,总是被执行。

这就是我的剧本的样子:

---
- 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

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

【问题讨论】:

  • 您可以使用阻止和救援。请在此处查找示例。 stackoverflow.com/questions/35892455/…
  • 所以,据我了解,我应该尝试在块语句中循环,当用户失败时,将调用救援任务。但是,在上面的示例中,如何更改代码以使命令 chage -d 0 "{{ item }}" 仅在“失败”用户上运行?

标签: ansible


【解决方案1】:

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

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

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

  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

【讨论】:

  • 非常感谢,伙计!我测试了一些东西,它似乎工作。只是快速的问题。在处理程序上,您正在循环在上一个任务中注册的 useradd,然后您仅在更改时才执行它,对吗?我可以打印 item.name 的值吗?我尝试使用 useradd.results.name 但它不起作用。无论如何,感谢您的帮助!干杯!
  • 是的,只有在添加了至少一个新用户时,处理程序才会执行。然后,处理程序将循环所有用户,但仅更新注册为“已更改”的用户的密码到期。您无法打印useradd.results.name 的原因是useradd.results 是一个列表。您需要循环使用它并打印item.name,或处理单个条目,如useradd.results[0].name
猜你喜欢
  • 2013-10-26
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多