我在Ansible上遇到问题,正在向服务器添加新用户。 首先,我检查用户是否存在于系统上,如果不存在,则继续创建它们。
我在这里发现了一个类似的问题:ansible user module always shows changed 并且我能够通过添加简单的salt在文件用户列表中添加新用户时解决更改后的状态。 但是,始终执行最后一部分,即处理程序。
这是我的剧本的样子:
licence == "Na"
这是一个名为用户列表的简单文件:
---
- 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
当我运行剧本而不更改用户列表文件时,一切都很好。 但是,如果我向文件中添加新用户,则当现有用户尝试登录时,系统会强制他们更改其密码,因为始终会调用该处理程序。 是否可以通过仅在新创建的用户上执行立即更改密码的方式来更改代码?
答案 0 :(得分:0)
您的剧本有两个主要问题:
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