首页 > 解决方案 > Ansible-playbook:在 100 台 linux 服务器中更改多个不同用户的帐户密码

问题描述

我需要更改几个帐户密码,例如 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

这个脚本的问题: 如果系统上不存在用户,它会创建它。有什么办法可以避免创建用户?

但是密码在所有服务器中都正确更新。可以在上面的剧本上对这个更好的代码更改有所帮助。

标签: ansible

解决方案


您正在尝试测试用户是否存在,但由于您使用的是复杂的管道,您会丢失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 循环来减小剧本的大小。


推荐阅读