i我需要更改几个帐户密码,例如testuser1和testuser2,testuser3。但是,从我拥有的100多个系统中,并不是所有人都同时拥有两个用户。有些系统有test_user1,有些系统有test_user2,有时两者都或没有。
这是我开始遇到问题的时候;我在下面创建了以下剧本:-
---
- name: Set Password
hosts: test
user: admin1
become: yes
ignore_errors: yes
tasks:
- shell: getent passwd testuser1 | wc -l | tr -d ' '
register: user_exists_testuser1
ignore_errors: yes
- name: change password for testuser1
user: name=testuser1 update_password=always
password="$1$3Zdze7Vx$ltv6dIsdfrsD7."
when: user_exists_testuser1.rc == 0
- shell: getent passwd testuser2 | wc -l | tr -d ' '
register: user_exists_testuser2
ignore_errors: yes
- name: change password for testuser2
user: name=testuser2 update_password=always
password="$1$sfddgv6dIxsdfssNt2D4."
when: user_exists_root.rc == 0
- shell: getent passwd testuser3 | wc -l | tr -d ' '
register: user_exists_testuser3
ignore_errors: yes
- name: change password for testuser3
user: name=testuser3 update_password=always
password="$1$3Zdze7VxDEFv6dHKHKSSt2D3."
when: user_exists_adminusr.rc == 0
关于此脚本的问题: 如果系统上不存在该用户,则会创建该用户。有什么方法可以避免创建用户?
但密码在所有服务器上均正确更新。可以为上述手册提供更好的代码更改帮助。
答案 0 :(得分:0)
您试图测试用户的存在,但是由于使用的是复杂的管道,因此丢失了getent
的退出代码。您可以从命令行自己进行测试(诊断此类问题时总是一个好主意)。
如果我跑步:
$ getent passwd doesnotexist
然后检查错误代码,我看到它报告了退出状态2
:
$ echo $?
2
但是如果我使用您的管道,无论用户是否存在,我都会得到0
:
$ getent passwd doesnotexist | wc -l | tr -d ' '
$ echo $?
0
您应该这样重写测试,以便可以使用getent
报告的退出代码:
- shell: getent passwd testuser1
register: user_exists_testuser1
ignore_errors: yes
- name: change password for testuser1
user:
name: testuser1
update_password: always
password: "$1$3Zdze7VxDEFv6dHKHKSSt2D3."
when: user_exists_testuser1.rc == 0
您可以充分利用Ansible循环来减小您的大小 剧本。